use of abs.frontend.ast.FieldDecl in project abstools by abstools.
the class AbsASTBuilderUtil method makeFieldDecl.
public static final FieldDecl makeFieldDecl(Access access, String name) {
FieldDecl fd = new FieldDecl();
fd.setName(name);
fd.setAccess(access);
return fd;
}
use of abs.frontend.ast.FieldDecl in project abstools by abstools.
the class ABSUnitTestCaseBuilder method makeGetAndAssertStatementsForHeapRef.
void makeGetAndAssertStatementsForHeapRef(String testName, Set<String> heapNames, Map<ABSRef, ABSObject> finalHeap, ABSRef ref, ABSObject state, Set<String> visited, Block block) {
String rn = heapRefBuilder.heapReferenceForTest(testName, getABSDataValue(ref));
if (!visited.add(rn)) {
return;
}
Map<String, ABSData> fields = getABSObjectFields(state);
ClassDecl clazz = getDecl(model, ClassDecl.class, new DeclNamePredicate<ClassDecl>(getABSObjectType(state)));
abs.frontend.ast.List<FieldDecl> fieldDecls = clazz.getFieldList();
for (int i = 0; i < fieldDecls.getNumChild(); i++) {
FieldDecl field = fieldDecls.getChild(i);
String fn = field.getName();
if (fields.containsKey(fn)) {
ABSData d = fields.get(fn);
block.addStmtNoTransform(getVarDecl(testCaseNameBuilder.resultOfGetterMethodName(fn), field.getAccess().treeCopyNoTransform(), getCall(new VarUse(rn), testCaseNameBuilder.getterMethodName(fn), true)));
makeOracle(testName, heapNames, finalHeap, testCaseNameBuilder.resultOfGetterMethodName(fn), field.getAccess().treeCopyNoTransform(), d, visited, block);
}
}
}
use of abs.frontend.ast.FieldDecl in project abstools by abstools.
the class ABSUnitTestCaseTranslatorHelper method createTestClass.
ClassDecl createTestClass(InterfaceDecl inf) {
ClassDecl ct = new ClassDecl(testCaseNameBuilder.className(inf.getName()), new abs.frontend.ast.List<Annotation>(), new abs.frontend.ast.List<ParamDecl>(), new abs.frontend.ast.List<InterfaceTypeUse>(), new Opt<InitBlock>(), new abs.frontend.ast.List<CaseBranchStmt>(), new abs.frontend.ast.List<FieldDecl>(), new abs.frontend.ast.List<MethodImpl>());
ct.addAnnotation(getTestAnnotation(suiteType));
ct.addImplementedInterfaceUse(new InterfaceTypeUse(inf.getName(), new abs.frontend.ast.List<abs.frontend.ast.Annotation>()));
for (MethodSig m : inf.getAllMethodSigs()) {
ct.addMethod(createMethodImpl(m));
}
FieldDecl assertImpl = new FieldDecl();
assertImpl.setName(ASSERT_HELPER);
assertImpl.setAccess(absAssertImpl.getImplementedInterfaceUse(0).treeCopyNoTransform());
ct.addField(assertImpl);
InitBlock block = new InitBlock();
block.addStmtNoTransform(getVAssign(ASSERT_HELPER, newObj(absAssertImpl, false)));
ct.setInitBlock(block);
return ct;
}
use of abs.frontend.ast.FieldDecl in project abstools by abstools.
the class DeltaForGetSetFieldsBuilder method updateDelta.
/**
* Add a delta that adds Getters and Setters for clazz.
*
* @param extensions
* @param interf
* @param clazz
*/
void updateDelta(Map<String, String> typeHierarchy, InterfaceTypeUse interf, ClassDecl clazz) {
String className = clazz.getName();
String deltaOnClassName = testCaseNameBuilder.deltaOnClass(className);
String interfaceForModifyingClassFieldName = testCaseNameBuilder.interfaceForModifyingFieldOfClass(className);
DeltaDecl dd = getDelta(deltaOnClassName);
if (dd != null) {
typeHierarchy.put(interf.getName(), interfaceForModifyingClassFieldName);
return;
}
dd = new DeltaDecl();
dd.setName(deltaOnClassName);
dd.addDeltaAccess(new DeltaAccess(clazz.getModuleDecl().getName()));
// add Setters and Getters
ModifyClassModifier mcm = new ModifyClassModifier();
mcm.setName(className);
InterfaceDecl ai = new InterfaceDecl();
ai.setName(interfaceForModifyingClassFieldName);
// extends the existing interface
InterfaceTypeUse inf = interf.treeCopyNoTransform();
ai.addExtendedInterfaceUse(inf.treeCopyNoTransform());
mcm.addAddedInterface(new InterfaceTypeUse(ai.getName(), new abs.frontend.ast.List<abs.frontend.ast.Annotation>()));
typeHierarchy.put(inf.getName(), interfaceForModifyingClassFieldName);
for (MethodImpl m : clazz.getMethodList()) {
if (RUN_METHOD.equals(m.getMethodSig().getName())) {
mcm.addModifier(removeRun());
break;
}
}
for (FieldDecl fd : clazz.getFieldList()) {
AddMethodModifier smm = addSetter(fd.getName(), fd.getAccess().treeCopyNoTransform());
AddMethodModifier gmm = addGetter(fd.getName(), fd.getAccess().treeCopyNoTransform());
mcm.addModifier(smm);
mcm.addModifier(gmm);
ai.addBody(smm.getMethodImpl().getMethodSig());
ai.addBody(gmm.getMethodImpl().getMethodSig());
}
dd.addModuleModifier(new AddInterfaceModifier(ai));
dd.addModuleModifier(mcm);
deltas.add(new DeltaWrapper(dd, false));
}
use of abs.frontend.ast.FieldDecl 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"));
}
}
Aggregations