use of com.rockwellcollins.atc.agree.agree.Arg in project AGREE by loonwerks.
the class AgreeAnnexContentAssist method getNestedDotIDCandidates.
private List<String> getNestedDotIDCandidates(SelectionExpr id) {
NamedElement base = ((NamedElmExpr) id).getElm();
NamedElement namedEl = null;
if (base instanceof Arg) {
Type type = ((Arg) base).getType();
DoubleDotRef elID = ((DoubleDotRef) type);
namedEl = elID.getElm();
// =======
// DoubleDotRef elID = ((RecordType) type).getRecord();
// namedEl = elID.getElm();
// >>>>>>> origin/develop
} else if (base instanceof DataPort) {
namedEl = ((DataPort) base).getDataFeatureClassifier();
} else if (base instanceof EventDataPort) {
namedEl = ((EventDataPort) base).getDataFeatureClassifier();
} else if (base instanceof AadlPackage) {
return getNestedDotIDCandidates((AadlPackage) base);
} else {
return new ArrayList<>();
}
return getNestedDotIDCandidates(namedEl);
}
use of com.rockwellcollins.atc.agree.agree.Arg in project AGREE by loonwerks.
the class EquationStatementHandler method rename.
@Override
public void rename(final RenameContext ctx) {
final EqStatement bo = ctx.getBusinessObject(EqStatement.class).get();
final String[] names = getNames(ctx);
for (int i = 0; i < names.length; i++) {
final String name = names[i];
if (i < bo.getLhs().size()) {
bo.getLhs().get(0).setName(name);
} else {
final Arg newArg = AgreeFactory.eINSTANCE.createArg();
newArg.setName(name);
final PrimType type = AgreeFactory.eINSTANCE.createPrimType();
type.setName("bool");
newArg.setType(type);
bo.getLhs().add(newArg);
}
}
// Remove extra names on left-hand side of equation
while (bo.getLhs().size() > names.length) {
bo.getLhs().remove(bo.getLhs().size() - 1);
}
}
use of com.rockwellcollins.atc.agree.agree.Arg in project AGREE by loonwerks.
the class AgreeValidator method getArgNames.
private List<NamedElement> getArgNames(DoubleDotRef recType) {
NamedElement rec = recType.getElm();
// =======
// private List<NamedElement> getArgNames(DoubleDotRef recId) {
//
// NamedElement rec = recId.getElm();
// >>>>>>> origin/develop
List<NamedElement> names = new ArrayList<>();
if (rec instanceof RecordDef) {
RecordDef recDef = (RecordDef) rec;
for (Arg arg : recDef.getArgs()) {
names.add(arg);
}
} else if (rec instanceof DataImplementation) {
DataImplementation dataImpl = (DataImplementation) rec;
for (Subcomponent sub : dataImpl.getAllSubcomponents()) {
names.add(sub);
}
} else {
error(recType, "Record type '" + rec.getName() + "' must be a feature group or a record type definition");
}
return names;
}
use of com.rockwellcollins.atc.agree.agree.Arg in project AGREE by loonwerks.
the class AgreeValidator method checkMultiAssignEq.
private void checkMultiAssignEq(EObject src, List<Arg> lhsArgs, Expr rhsExpr) {
if (rhsExpr == null) {
return;
}
if (lhsArgs.size() == 1) {
// we should only need to check for cycles for single equations
String name = lhsArgs.get(0).getName();
ExprCycleVisitor cycleVisitor = new ExprCycleVisitor(name);
Set<EObject> cycleObjects = cycleVisitor.doSwitch(rhsExpr);
if (cycleObjects == null) {
throw new IllegalArgumentException("something went wrong with the cycle checker");
}
for (EObject obj : cycleObjects) {
error(obj, "Cyclic reference to variable '" + name + "'");
}
}
if (argsContainRangeValue(lhsArgs)) {
error(src, "Equation statements cannot contain a ranged value and a right hand side expression");
}
List<TypeDef> agreeLhsTypes = new ArrayList<>();
for (Arg arg : lhsArgs) {
agreeLhsTypes.add(AgreeTypeSystem.typeDefFromType(arg.getType()));
}
List<TypeDef> agreeRhsTypes = new ArrayList<>();
if (rhsExpr instanceof CallExpr) {
NamedElement namedEl = ((CallExpr) rhsExpr).getRef().getElm();
if (namedEl instanceof NodeDef) {
NodeDef nodeDef = (NodeDef) namedEl;
for (Arg var : nodeDef.getRets()) {
agreeRhsTypes.add(AgreeTypeSystem.typeDefFromType(var.getType()));
}
} else if (namedEl instanceof FnDef) {
FnDef fnDef = (FnDef) namedEl;
agreeRhsTypes.add(AgreeTypeSystem.typeDefFromType(fnDef.getType()));
} else if (namedEl instanceof UninterpretedFnDef) {
UninterpretedFnDef uninterpretedFnDef = (UninterpretedFnDef) namedEl;
agreeRhsTypes.add(AgreeTypeSystem.typeDefFromType(uninterpretedFnDef.getType()));
} else {
// parse error
return;
}
} else {
checkTypeExists(rhsExpr);
TypeDef rhsType = AgreeTypeSystem.infer(rhsExpr);
agreeRhsTypes.add(rhsType);
}
if (agreeLhsTypes.size() != agreeRhsTypes.size()) {
error(src, "Equation assigns " + agreeLhsTypes.size() + " variables, but right side returns " + agreeRhsTypes.size() + " values");
return;
}
for (int i = 0; i < agreeLhsTypes.size(); i++) {
TypeDef lhsType = agreeLhsTypes.get(i);
TypeDef rhsType = agreeRhsTypes.get(i);
if (!AgreeTypeSystem.typesEqual(rhsType, lhsType)) {
error(src, "The variable '" + lhsArgs.get(i).getName() + "' on the left side of equation is of type '" + nameOfTypeDef(lhsType) + "' but must be of type '" + nameOfTypeDef(rhsType) + "'");
}
}
}
use of com.rockwellcollins.atc.agree.agree.Arg in project AGREE by loonwerks.
the class AgreeValidator method checkRecordUpdateExpr.
@Check(CheckType.FAST)
public void checkRecordUpdateExpr(RecordUpdateExpr upExpr) {
if (isInLinearizationBody(upExpr)) {
error(upExpr, "Record update expressions not allowed in linearization body expression");
return;
}
checkTypeExists(upExpr.getRecord());
TypeDef recordType = AgreeTypeSystem.infer(upExpr.getRecord());
if (recordType instanceof RecordTypeDef) {
// scoping should ensure the key is a proper Arg
Arg arg = (Arg) upExpr.getKey();
TypeDef keyType = AgreeTypeSystem.typeDefFromType(arg.getType());
checkTypeExists(upExpr.getExpr());
TypeDef expType = AgreeTypeSystem.infer(upExpr.getExpr());
if (!AgreeTypeSystem.typesEqual(keyType, expType)) {
error(upExpr, "the update field is of type '" + nameOfTypeDef(keyType) + "', but the expression is of type '" + nameOfTypeDef(expType) + "'");
}
} else {
error("Record to be updated must be a data implementation or AGREE record type. " + "Found type '" + nameOfTypeDef(recordType) + "'.", upExpr, AgreePackage.Literals.RECORD_UPDATE_EXPR__RECORD, -1);
}
}
Aggregations