use of org.abs_models.frontend.typechecker.Type in project abstools by abstools.
the class OtherAnalysisTests method awaitRewriteModule1.
@Test
public void awaitRewriteModule1() {
Model m = assertParse("module A; export *; data X; module B; export *; data X; module C; import * from A; import B.X; class C { X m() { return await this!m();}}", Config.TYPE_CHECK, Config.WITHOUT_DESUGARING_AFTER_TYPECHECK);
ClassDecl c = (ClassDecl) m.lookupModule("C").getDecl(0);
Stmt stmt = c.getMethod(0).getBlock().getStmt(0);
ReturnStmt ret = (ReturnStmt) stmt;
assertThat(ret.getRetExp().getType(), instanceOf(DataTypeType.class));
assertEquals("A.X", ret.getRetExp().getType().getQualifiedName());
m = assertParse("module A; export *; data X; module B; export *; data X; module C; import * from A; import B.X; class C { X m() { return await this!m();}}", Config.TYPE_CHECK);
c = (ClassDecl) m.lookupModule("C").getDecl(0);
Stmt s = c.getMethod(0).getBlock().getStmt(0);
VarDeclStmt b = (VarDeclStmt) s;
Type t = ((DataTypeType) b.getVarDecl().getType()).getTypeArg(0);
assertEquals("A.X", t.getQualifiedName());
}
use of org.abs_models.frontend.typechecker.Type in project abstools by abstools.
the class NullCheckerExtension method checkVarDeclStmt.
@Override
public void checkVarDeclStmt(VarDeclStmt varDeclStmt) {
VarDecl d = varDeclStmt.getVarDecl();
Type t = d.getType();
setAnnotatedType(t, varDeclStmt);
if (!shouldHaveNullableType(t))
return;
NullableType nt = getNullableTypeDefault(t);
if (nt == NullableType.Nonnull && !d.hasInitExp()) {
errors.add(new TypeError(varDeclStmt, ErrorMessage.NULLABLE_TYPE_MISMATCH, NullableType.Null.toString(), nt.toString()));
}
}
use of org.abs_models.frontend.typechecker.Type in project abstools by abstools.
the class NullCheckerExtension method checkOverride.
@Override
public void checkOverride(MethodSig impl, MethodSig overriden) {
Type expectedReturnType = overriden.getType();
Type actualReturnType = impl.getType();
NullableType expected = getNullableTypeDefault(expectedReturnType);
NullableType actual = getNullableTypeDefault(actualReturnType);
checkAssignable(expected, actual, impl);
for (int i = 0; i < overriden.getNumParam(); i++) {
Type tExpected = overriden.getParam(i).getType();
Type tActual = impl.getParam(i).getType();
NullableType nte = getNullableTypeDefault(tExpected);
NullableType nta = getNullableTypeDefault(tActual);
checkAssignable(nta, nte, impl);
}
}
use of org.abs_models.frontend.typechecker.Type in project abstools by abstools.
the class TypeExtensionHelper method checkAssignable.
public void checkAssignable(Type callee, HasParams params, ASTNode<?> n) {
java.util.List<Type> paramsTypes = params.getTypes();
for (int i = 0; i < paramsTypes.size(); i++) {
Type argType = paramsTypes.get(i);
PureExp exp = ((HasActualParams) n).getParams().getChild(i);
checkAssignable(callee, AdaptDirection.TO, exp.getType(), argType, n);
checkAssignableBehaviorType(argType, exp, n);
}
}
use of org.abs_models.frontend.typechecker.Type in project abstools by abstools.
the class TypeExtensionHelper method annotateType.
public void annotateType(Type t, ASTNode<?> originatingNode, ASTNode<?> typeNode) {
if (t.isDataType()) {
DataTypeType dt = (DataTypeType) t;
if (dt.hasTypeArgs()) {
ParametricDataTypeUse pu = null;
// typeNode maybe a type synonym
if (typeNode instanceof ParametricDataTypeUse)
pu = (ParametricDataTypeUse) typeNode;
int i = 0;
for (Type ta : dt.getTypeArgs()) {
ASTNode<?> childTypeNode = null;
if (pu != null)
childTypeNode = pu.getParam(i);
annotateType(ta, originatingNode, childTypeNode);
i++;
}
}
}
if (t.isReferenceType() || t.isNullType()) {
for (TypeSystemExtension tse : obs) {
tse.annotateType(t, originatingNode, typeNode);
}
}
}
Aggregations