use of org.abs_models.frontend.ast.VarUse in project abstools by abstools.
the class VarResolutionTest method testLocalVar.
@Test
public void testLocalVar() {
Exp e = getSecondExp("interface I { } { I i = null; i = i; }");
VarUse u = (VarUse) e;
VarDecl decl = (VarDecl) u.getDecl();
assertEquals("i", decl.getName());
}
use of org.abs_models.frontend.ast.VarUse in project abstools by abstools.
the class TimeoutThread method genCode.
/**
* Generates Erlang code in target directory, adding a last statement that
* prints the value of the `testresult' variable.
*
* @return a Module Name containing a Main Block
* @throws InternalBackendException
*/
public String genCode(Model model, File targetDir, boolean appendResultprinter) throws IOException, InterruptedException, InternalBackendException {
if (model.hasErrors()) {
Assert.fail(model.getErrors().getFirstError().getHelpMessage());
}
if (model.hasTypeErrors()) {
Assert.fail(model.getTypeErrors().getFirstError().getHelpMessage());
}
MainBlock mb = model.getMainBlock();
if (mb != null && appendResultprinter) {
// We search for this output in the `run' method below
mb.addStmt(new ExpressionStmt(new List<>(), new FnApp("ABS.StdLib.println", new List<>(new AddAddExp(new StringLiteral("RES="), new FnApp("ABS.StdLib.toString", new List<>(new VarUse("testresult"))))))));
}
new ErlangBackend().compile(model, targetDir, // use the following argument for silent compiler:
EnumSet.noneOf(ErlangBackend.CompileOptions.class));
if (mb == null)
return null;
else
return mb.getModuleDecl().getName();
}
use of org.abs_models.frontend.ast.VarUse in project abstools by abstools.
the class SchedulerChecker method checkScheduleExp.
private void checkScheduleExp(PureExp sched, ClassDecl class_decl, ASTNode<?> loc) {
if (sched == null)
return;
if (!(sched instanceof FnApp)) {
errors.add(new TypeError(loc, ErrorMessage.WRONG_SCHEDULER_ANNOTATION_TYPE, sched.getType()));
return;
}
FnApp s = (FnApp) sched;
Type scheduler_type = s.getType();
if (s.getDecl().isUnknown()) {
errors.add(new TypeError(loc, ErrorMessage.FUNCTION_NOT_RESOLVABLE, s.getName()));
return;
}
FunctionDecl sd = (FunctionDecl) s.getDecl();
// check scheduling function return type
boolean schedulerTypeCorrect = scheduler_type.isDataType() && ((DataTypeType) scheduler_type).getQualifiedName().equals("ABS.Scheduler.Process");
// check scheduling function first arg, pt.1: are we a list?
boolean schedulerFunFirstArgCorrect = sd.getNumParam() > 0 && sd.getParam(0).getType().getQualifiedName().equals("ABS.StdLib.List");
if (schedulerFunFirstArgCorrect) {
// check scheduling function first arg, pt.2: are we a list of
// processes?
DataTypeType firstArgType = (DataTypeType) sd.getParam(0).getType();
if (firstArgType.numTypeArgs() != 1) {
// should not happen since ABS.StdLib.List takes 1 argument
schedulerFunFirstArgCorrect = false;
} else {
schedulerFunFirstArgCorrect = firstArgType.getTypeArg(0).getQualifiedName().equals("ABS.Scheduler.Process");
}
}
if (!schedulerTypeCorrect || !schedulerFunFirstArgCorrect) {
// emit two messages: one at the annotation location, one for the
// offending scheduler function
errors.add(new TypeError(loc, ErrorMessage.WRONG_SCHEDULER_ANNOTATION_TYPE, "dummy"));
errors.add(new TypeError(sd, ErrorMessage.WRONG_SCHEDULER_FUN_TYPE, s.getName()));
}
if (s.getNumParam() == 0 || !(s.getParam(0) instanceof VarUse) || !((VarUse) s.getParam(0)).getName().equals("queue")) {
// first arg to the scheduler expression must be the magic `queue'
errors.add(new TypeError(loc, ErrorMessage.WRONG_SCHEDULER_FIRST_ARGUMENT, "dummy"));
}
if (s.getNumParam() != sd.getNumParam()) {
errors.add(new TypeError(loc, ErrorMessage.WRONG_NUMBER_OF_ARGS, s.getNumParam(), sd.getNumParam()));
} else {
// start from 1; magic first parameter `queue' already checked
for (int i = 1; i < s.getNumParam(); i++) {
PureExp arg = s.getParam(i);
String argname = "";
if (!(arg instanceof VarOrFieldUse)) {
// argument was not a plain identifier
errors.add(new TypeError(arg, ErrorMessage.WRONG_SCHEDULER_FIELD_ARGUMENT, Integer.toString(i + 1), class_decl.getName()));
} else {
// Check the rest of the parameters against class
// field/param names and argument types of the scheduling
// function. Parts of this could be elided if we verify
// that `VarUse's in scheduler annotation are rewritten to
// `FieldUse's -- then we'd just have to check for the
// presence of `VarUse' in the parameter list to detect
// invalid args. But can't hurt to open-code it (and we
// still have to check the type of all arguments vs the
// scheduling function parameters).
VarOrFieldUse vararg = (VarOrFieldUse) arg;
String name = vararg.getName();
Type argtype = UnknownType.INSTANCE;
for (ParamDecl p : class_decl.getParamList()) {
if (p.getName().equals(name))
argtype = p.getType();
}
for (FieldDecl f : class_decl.getFieldList()) {
if (f.getName().equals(name))
argtype = f.getType();
}
if (argtype.isUnknownType()) {
// identifier, but unknown in the class
errors.add(new TypeError(arg, ErrorMessage.WRONG_SCHEDULER_FIELD_ARGUMENT, "\"" + name + "\"", class_decl.getName()));
} else {
// argtype: field; paramtype: function arg
Type paramtype = sd.getParam(i).getType();
if (!argtype.isAssignableTo(paramtype)) {
errors.add(new TypeError(arg, ErrorMessage.TYPE_MISMATCH, argtype, paramtype));
}
}
}
}
}
if (class_decl.getType().isDeploymentComponentType()) {
errors.add(new TypeError(loc, ErrorMessage.SCHEDULER_ON_DC, "dummy"));
}
}
use of org.abs_models.frontend.ast.VarUse in project abstools by abstools.
the class ASTBasedABSTestRunnerGenerator method generateDataPointsAST.
private TypeUse generateDataPointsAST(InterfaceDecl key, ClassDecl clazz, Set<TypeUse> use, MainBlock block) {
MethodSig dataPoint = findDataPoints(key);
if (dataPoint == null) {
return null;
}
TypeIdUse rt = dataPoint.getReturnType();
if (!(rt instanceof ParametricDataTypeUse)) {
return null;
}
ParametricDataTypeUse prt = (ParametricDataTypeUse) rt;
if (!prt.getName().equals("Set")) {
return null;
}
// Set has only one type parameter
TypeUse u = (TypeUse) prt.getParam(0).copy();
use.add(u);
String objName = uncap(clazz.getName()) + "dataPoint";
String dataSet = dataPointSetName(clazz);
block.addStmtNoTransform(newObj(key, clazz, objName, true));
block.addStmtNoTransform(getVarDecl(dataSet, prt.copy(), new SyncCall(new VarUse(objName), dataPoint.getName(), new List<>())));
return u;
}
use of org.abs_models.frontend.ast.VarUse in project abstools by abstools.
the class ASTBasedABSTestRunnerGenerator method generateWaitSyncAST.
private WhileStmt generateWaitSyncAST() {
WhileStmt ws = new WhileStmt();
ws.setCondition(getFnApp("hasNext", new VarUse(futs)));
Block body = new Block();
DataTypeUse u = getType("Pair", getType("Set", getType("Fut", getType("Unit"))), getType("Fut", getType("Unit")));
body.addStmtNoTransform(getVarDecl("nt", u, getFnApp("next", new VarUse(futs))));
body.addStmtNoTransform(getVAssign(fut, getFnApp("snd", new VarUse("nt"))));
body.addStmtNoTransform(getVAssign(futs, getFnApp("fst", new VarUse("nt"))));
body.addStmtNoTransform(getExpStmt(new GetExp(new VarUse("fut"))));
// Attach body at the end, since JastAdd will avoid touching ASTs without parents.
ws.setBody(body);
return ws;
}
Aggregations