Search in sources :

Example 16 with AgreeContract

use of com.rockwellcollins.atc.agree.agree.AgreeContract in project AGREE by loonwerks.

the class AgreeValidator method checkAssign.

@Check(CheckType.FAST)
public void checkAssign(AssignStatement assign) {
    if (!(assign.getId() instanceof NamedElement)) {
        error(assign.getId(), "The Id on the left hand side of an assignment statement " + "must not contain a \".\"");
        return;
    }
    NamedElement namedEl = assign.getId();
    Expr expr = assign.getExpr();
    if (namedEl == null || expr == null) {
        return;
    }
    ComponentImplementation compImpl = EcoreUtil2.getContainerOfType(assign, ComponentImplementation.class);
    if (compImpl == null) {
        error(assign, "Assignment statements are allowed only in component implementations");
        return;
    }
    if (namedEl.eContainer() instanceof InputStatement) {
        error(assign, "Assignment to agree_input variables is illegal.");
        return;
    }
    if (compImpl != null) {
        List<EObject> assignableElements = new ArrayList<>();
        List<AgreeContract> implContracts = EcoreUtil2.getAllContentsOfType(compImpl, AgreeContract.class);
        for (AgreeContract ac : implContracts) {
            assignableElements.addAll(EcoreUtil2.getAllContentsOfType(ac, EqStatement.class).stream().map(eq -> eq.getLhs()).flatMap(List::stream).collect(Collectors.toList()));
        }
        ComponentType compType = compImpl.getType();
        if (compType != null) {
            List<AgreeContract> typeContracts = EcoreUtil2.getAllContentsOfType(compType, AgreeContract.class);
            for (AgreeContract ac : typeContracts) {
                assignableElements.addAll(EcoreUtil2.getAllContentsOfType(ac, EqStatement.class).stream().map(eq -> eq.getLhs()).flatMap(List::stream).collect(Collectors.toList()));
            }
        }
        assignableElements.addAll(compImpl.getAllFeatures().stream().map(cf -> flattenFeatureGroups(Collections.singletonList(cf))).flatMap(List::stream).filter(feat -> feat instanceof EventDataPort || feat instanceof DataPort).filter(feat -> DirectionType.OUT.equals(((Port) feat).getDirection())).collect(Collectors.toList()));
        if (!assignableElements.contains(namedEl)) {
            error("LHS of assignment must be an AGREE 'eq' variable or an output port of this component", assign, AgreePackage.Literals.ASSIGN_STATEMENT__ID);
        }
    }
    TypeDef lhsType = (AgreeTypeSystem.inferFromNamedElement(namedEl));
    TypeDef rhsType = (AgreeTypeSystem.infer(expr));
    if (!AgreeTypeSystem.typesEqual(lhsType, rhsType)) {
        error(assign, "The left hand side of the assignment statement is of type '" + nameOfTypeDef(lhsType) + "' but the right hand side is of type '" + nameOfTypeDef(rhsType) + "'");
    }
    for (EObject container : EcoreUtil2.getAllContainers(assign)) {
        if (container instanceof Classifier) {
            for (AnnexSubclause annexSubclause : AnnexUtil.getAllAnnexSubclauses((Classifier) container, AgreePackage.eINSTANCE.getAgreeContractSubclause())) {
                for (AgreeContract contract : EcoreUtil2.getAllContentsOfType(annexSubclause, AgreeContract.class)) {
                    if (contract != null) {
                        for (SpecStatement spec : contract.getSpecs()) {
                            if (spec instanceof AssignStatement && spec != assign) {
                                NamedElement otherEl = ((AssignStatement) spec).getId();
                                if (otherEl.equals(namedEl)) {
                                    error(spec, "Mulitiple assignments to variable '" + namedEl.getName() + "'");
                                    error(assign, "Mulitiple assignments to variable '" + namedEl.getName() + "'");
                                }
                            } else if (spec instanceof EqStatement) {
                                EqStatement eqStmt = (EqStatement) spec;
                                for (NamedElement otherEl : eqStmt.getLhs()) {
                                    if (eqStmt.getExpr() != null && otherEl.equals(namedEl)) {
                                        error(spec, "Mulitiple assignments to variable '" + namedEl.getName() + "'");
                                        error(assign, "Mulitiple assignments to variable '" + namedEl.getName() + "'");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
Also used : ComponentImplementation(org.osate.aadl2.ComponentImplementation) AgreeContract(com.rockwellcollins.atc.agree.agree.AgreeContract) EnumLitExpr(com.rockwellcollins.atc.agree.agree.EnumLitExpr) IndicesExpr(com.rockwellcollins.atc.agree.agree.IndicesExpr) AnnexUtil(org.osate.annexsupport.AnnexUtil) TimeRiseExpr(com.rockwellcollins.atc.agree.agree.TimeRiseExpr) RecordDef(com.rockwellcollins.atc.agree.agree.RecordDef) FnDef(com.rockwellcollins.atc.agree.agree.FnDef) DoubleDotRef(com.rockwellcollins.atc.agree.agree.DoubleDotRef) FlatmapExpr(com.rockwellcollins.atc.agree.agree.FlatmapExpr) TimeFallExpr(com.rockwellcollins.atc.agree.agree.TimeFallExpr) RealLitExpr(com.rockwellcollins.atc.agree.agree.RealLitExpr) GetPropertyExpr(com.rockwellcollins.atc.agree.agree.GetPropertyExpr) Map(java.util.Map) OrderStatement(com.rockwellcollins.atc.agree.agree.OrderStatement) InputStatement(com.rockwellcollins.atc.agree.agree.InputStatement) BigInteger(java.math.BigInteger) Check(org.eclipse.xtext.validation.Check) WheneverOccursStatement(com.rockwellcollins.atc.agree.agree.WheneverOccursStatement) CalenStatement(com.rockwellcollins.atc.agree.agree.CalenStatement) AgreeContract(com.rockwellcollins.atc.agree.agree.AgreeContract) SporadicStatement(com.rockwellcollins.atc.agree.agree.SporadicStatement) PrimType(com.rockwellcollins.atc.agree.agree.PrimType) Set(java.util.Set) ComponentRef(com.rockwellcollins.atc.agree.agree.ComponentRef) AadlPackage(org.osate.aadl2.AadlPackage) MNSynchStatement(com.rockwellcollins.atc.agree.agree.MNSynchStatement) ModelUnit(org.osate.aadl2.ModelUnit) ConnectionStatement(com.rockwellcollins.atc.agree.agree.ConnectionStatement) SpecStatement(com.rockwellcollins.atc.agree.agree.SpecStatement) GuaranteeStatement(com.rockwellcollins.atc.agree.agree.GuaranteeStatement) TimeInterval(com.rockwellcollins.atc.agree.agree.TimeInterval) DataType(org.osate.aadl2.DataType) TimeOfExpr(com.rockwellcollins.atc.agree.agree.TimeOfExpr) AgreePackage(com.rockwellcollins.atc.agree.agree.AgreePackage) Feature(org.osate.aadl2.Feature) ComponentImplementation(org.osate.aadl2.ComponentImplementation) AgreeTypeSystem.nameOfTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.nameOfTypeDef) ArrayList(java.util.ArrayList) ComponentClassifier(org.osate.aadl2.ComponentClassifier) EnumStatement(com.rockwellcollins.atc.agree.agree.EnumStatement) CheckType(org.eclipse.xtext.validation.CheckType) LiftContractStatement(com.rockwellcollins.atc.agree.agree.LiftContractStatement) Aadl2Package(org.osate.aadl2.Aadl2Package) Subcomponent(org.osate.aadl2.Subcomponent) AgreeAADLEnumerationUtils(com.rockwellcollins.atc.agree.AgreeAADLEnumerationUtils) PrevExpr(com.rockwellcollins.atc.agree.agree.PrevExpr) FeatureGroup(org.osate.aadl2.FeatureGroup) ArrayTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.ArrayTypeDef) AadlUtil(org.osate.aadl2.modelsupport.util.AadlUtil) FoldRightExpr(com.rockwellcollins.atc.agree.agree.FoldRightExpr) TagExpr(com.rockwellcollins.atc.agree.agree.TagExpr) EventExpr(com.rockwellcollins.atc.agree.agree.EventExpr) LatchedExpr(com.rockwellcollins.atc.agree.agree.LatchedExpr) ReachableStatement(com.rockwellcollins.atc.agree.agree.ReachableStatement) PropertyConstant(org.osate.aadl2.PropertyConstant) EventPort(org.osate.aadl2.EventPort) NamedElmExpr(com.rockwellcollins.atc.agree.agree.NamedElmExpr) FeatureGroupType(org.osate.aadl2.FeatureGroupType) RealCast(com.rockwellcollins.atc.agree.agree.RealCast) DataPort(org.osate.aadl2.DataPort) ConstStatement(com.rockwellcollins.atc.agree.agree.ConstStatement) LibraryFnDef(com.rockwellcollins.atc.agree.agree.LibraryFnDef) PeriodicStatement(com.rockwellcollins.atc.agree.agree.PeriodicStatement) SelectionExpr(com.rockwellcollins.atc.agree.agree.SelectionExpr) AnnexSubclause(org.osate.aadl2.AnnexSubclause) NamedElement(org.osate.aadl2.NamedElement) UninterpretedFnDef(com.rockwellcollins.atc.agree.agree.UninterpretedFnDef) NodeStmt(com.rockwellcollins.atc.agree.agree.NodeStmt) DataImplementation(org.osate.aadl2.DataImplementation) AsynchStatement(com.rockwellcollins.atc.agree.agree.AsynchStatement) NamedID(com.rockwellcollins.atc.agree.agree.NamedID) AgreeContractLibrary(com.rockwellcollins.atc.agree.agree.AgreeContractLibrary) Port(org.osate.aadl2.Port) IfThenElseExpr(com.rockwellcollins.atc.agree.agree.IfThenElseExpr) ArraySubExpr(com.rockwellcollins.atc.agree.agree.ArraySubExpr) HashMultimap(com.google.common.collect.HashMultimap) Classifier(org.osate.aadl2.Classifier) ComponentType(org.osate.aadl2.ComponentType) Type(com.rockwellcollins.atc.agree.agree.Type) LatchedStatement(com.rockwellcollins.atc.agree.agree.LatchedStatement) AgreeTypeSystem(com.rockwellcollins.atc.agree.AgreeTypeSystem) PreExpr(com.rockwellcollins.atc.agree.agree.PreExpr) AgreeContractSubclause(com.rockwellcollins.atc.agree.agree.AgreeContractSubclause) AssertStatement(com.rockwellcollins.atc.agree.agree.AssertStatement) NodeEq(com.rockwellcollins.atc.agree.agree.NodeEq) NodeLemma(com.rockwellcollins.atc.agree.agree.NodeLemma) EObject(org.eclipse.emf.ecore.EObject) Connection(org.osate.aadl2.Connection) RecordLitExpr(com.rockwellcollins.atc.agree.agree.RecordLitExpr) Collectors(java.util.stream.Collectors) BinaryExpr(com.rockwellcollins.atc.agree.agree.BinaryExpr) NodeDef(com.rockwellcollins.atc.agree.agree.NodeDef) List(java.util.List) UnaryExpr(com.rockwellcollins.atc.agree.agree.UnaryExpr) Property(org.osate.aadl2.Property) ExistsExpr(com.rockwellcollins.atc.agree.agree.ExistsExpr) RecordTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.RecordTypeDef) FoldLeftExpr(com.rockwellcollins.atc.agree.agree.FoldLeftExpr) SynchStatement(com.rockwellcollins.atc.agree.agree.SynchStatement) AnnexLibrary(org.osate.aadl2.AnnexLibrary) RecordUpdateExpr(com.rockwellcollins.atc.agree.agree.RecordUpdateExpr) TypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.TypeDef) ForallExpr(com.rockwellcollins.atc.agree.agree.ForallExpr) Arg(com.rockwellcollins.atc.agree.agree.Arg) AgreeSubclause(com.rockwellcollins.atc.agree.agree.AgreeSubclause) WhenHoldsStatement(com.rockwellcollins.atc.agree.agree.WhenHoldsStatement) FloorCast(com.rockwellcollins.atc.agree.agree.FloorCast) HashMap(java.util.HashMap) LinearizationDef(com.rockwellcollins.atc.agree.agree.LinearizationDef) Expr(com.rockwellcollins.atc.agree.agree.Expr) HashSet(java.util.HashSet) DataSubcomponent(org.osate.aadl2.DataSubcomponent) InitialStatement(com.rockwellcollins.atc.agree.agree.InitialStatement) EcoreUtil2(org.eclipse.xtext.EcoreUtil2) DirectionType(org.osate.aadl2.DirectionType) WheneverBecomesTrueStatement(com.rockwellcollins.atc.agree.agree.WheneverBecomesTrueStatement) ExprCycleVisitor(com.rockwellcollins.atc.agree.visitors.ExprCycleVisitor) LinkedList(java.util.LinkedList) PropertyStatement(com.rockwellcollins.atc.agree.agree.PropertyStatement) ThisRef(com.rockwellcollins.atc.agree.agree.ThisRef) Iterator(java.util.Iterator) AssignStatement(com.rockwellcollins.atc.agree.agree.AssignStatement) ArrayUpdateExpr(com.rockwellcollins.atc.agree.agree.ArrayUpdateExpr) AssumeStatement(com.rockwellcollins.atc.agree.agree.AssumeStatement) EqStatement(com.rockwellcollins.atc.agree.agree.EqStatement) BoolLitExpr(com.rockwellcollins.atc.agree.agree.BoolLitExpr) NodeBodyExpr(com.rockwellcollins.atc.agree.agree.NodeBodyExpr) EList(org.eclipse.emf.common.util.EList) IntLitExpr(com.rockwellcollins.atc.agree.agree.IntLitExpr) LemmaStatement(com.rockwellcollins.atc.agree.agree.LemmaStatement) NamedSpecStatement(com.rockwellcollins.atc.agree.agree.NamedSpecStatement) EventDataPort(org.osate.aadl2.EventDataPort) LinearizationInterval(com.rockwellcollins.atc.agree.agree.LinearizationInterval) CallExpr(com.rockwellcollins.atc.agree.agree.CallExpr) WheneverImpliesStatement(com.rockwellcollins.atc.agree.agree.WheneverImpliesStatement) WheneverHoldsStatement(com.rockwellcollins.atc.agree.agree.WheneverHoldsStatement) Abstraction(com.rockwellcollins.atc.agree.agree.Abstraction) WhenOccursStatment(com.rockwellcollins.atc.agree.agree.WhenOccursStatment) Collections(java.util.Collections) ArrayLiteralExpr(com.rockwellcollins.atc.agree.agree.ArrayLiteralExpr) ComponentType(org.osate.aadl2.ComponentType) EventPort(org.osate.aadl2.EventPort) DataPort(org.osate.aadl2.DataPort) Port(org.osate.aadl2.Port) EventDataPort(org.osate.aadl2.EventDataPort) ArrayList(java.util.ArrayList) SpecStatement(com.rockwellcollins.atc.agree.agree.SpecStatement) NamedSpecStatement(com.rockwellcollins.atc.agree.agree.NamedSpecStatement) ComponentClassifier(org.osate.aadl2.ComponentClassifier) Classifier(org.osate.aadl2.Classifier) AssignStatement(com.rockwellcollins.atc.agree.agree.AssignStatement) DataPort(org.osate.aadl2.DataPort) EventDataPort(org.osate.aadl2.EventDataPort) EnumLitExpr(com.rockwellcollins.atc.agree.agree.EnumLitExpr) IndicesExpr(com.rockwellcollins.atc.agree.agree.IndicesExpr) TimeRiseExpr(com.rockwellcollins.atc.agree.agree.TimeRiseExpr) FlatmapExpr(com.rockwellcollins.atc.agree.agree.FlatmapExpr) TimeFallExpr(com.rockwellcollins.atc.agree.agree.TimeFallExpr) RealLitExpr(com.rockwellcollins.atc.agree.agree.RealLitExpr) GetPropertyExpr(com.rockwellcollins.atc.agree.agree.GetPropertyExpr) TimeOfExpr(com.rockwellcollins.atc.agree.agree.TimeOfExpr) PrevExpr(com.rockwellcollins.atc.agree.agree.PrevExpr) FoldRightExpr(com.rockwellcollins.atc.agree.agree.FoldRightExpr) TagExpr(com.rockwellcollins.atc.agree.agree.TagExpr) EventExpr(com.rockwellcollins.atc.agree.agree.EventExpr) LatchedExpr(com.rockwellcollins.atc.agree.agree.LatchedExpr) NamedElmExpr(com.rockwellcollins.atc.agree.agree.NamedElmExpr) SelectionExpr(com.rockwellcollins.atc.agree.agree.SelectionExpr) IfThenElseExpr(com.rockwellcollins.atc.agree.agree.IfThenElseExpr) ArraySubExpr(com.rockwellcollins.atc.agree.agree.ArraySubExpr) PreExpr(com.rockwellcollins.atc.agree.agree.PreExpr) RecordLitExpr(com.rockwellcollins.atc.agree.agree.RecordLitExpr) BinaryExpr(com.rockwellcollins.atc.agree.agree.BinaryExpr) UnaryExpr(com.rockwellcollins.atc.agree.agree.UnaryExpr) ExistsExpr(com.rockwellcollins.atc.agree.agree.ExistsExpr) FoldLeftExpr(com.rockwellcollins.atc.agree.agree.FoldLeftExpr) RecordUpdateExpr(com.rockwellcollins.atc.agree.agree.RecordUpdateExpr) ForallExpr(com.rockwellcollins.atc.agree.agree.ForallExpr) Expr(com.rockwellcollins.atc.agree.agree.Expr) ArrayUpdateExpr(com.rockwellcollins.atc.agree.agree.ArrayUpdateExpr) BoolLitExpr(com.rockwellcollins.atc.agree.agree.BoolLitExpr) NodeBodyExpr(com.rockwellcollins.atc.agree.agree.NodeBodyExpr) IntLitExpr(com.rockwellcollins.atc.agree.agree.IntLitExpr) CallExpr(com.rockwellcollins.atc.agree.agree.CallExpr) ArrayLiteralExpr(com.rockwellcollins.atc.agree.agree.ArrayLiteralExpr) AgreeTypeSystem.nameOfTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.nameOfTypeDef) ArrayTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.ArrayTypeDef) RecordTypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.RecordTypeDef) TypeDef(com.rockwellcollins.atc.agree.AgreeTypeSystem.TypeDef) EObject(org.eclipse.emf.ecore.EObject) ArrayList(java.util.ArrayList) List(java.util.List) LinkedList(java.util.LinkedList) EList(org.eclipse.emf.common.util.EList) EqStatement(com.rockwellcollins.atc.agree.agree.EqStatement) InputStatement(com.rockwellcollins.atc.agree.agree.InputStatement) EventDataPort(org.osate.aadl2.EventDataPort) NamedElement(org.osate.aadl2.NamedElement) AnnexSubclause(org.osate.aadl2.AnnexSubclause) Check(org.eclipse.xtext.validation.Check)

Aggregations

AgreeContract (com.rockwellcollins.atc.agree.agree.AgreeContract)16 SpecStatement (com.rockwellcollins.atc.agree.agree.SpecStatement)9 AadlPackage (org.osate.aadl2.AadlPackage)9 ConstStatement (com.rockwellcollins.atc.agree.agree.ConstStatement)8 ArrayList (java.util.ArrayList)8 AnnexLibrary (org.osate.aadl2.AnnexLibrary)8 NamedElement (org.osate.aadl2.NamedElement)8 HashMap (java.util.HashMap)7 AnnexSubclause (org.osate.aadl2.AnnexSubclause)7 Classifier (org.osate.aadl2.Classifier)7 ComponentClassifier (org.osate.aadl2.ComponentClassifier)7 ComponentImplementation (org.osate.aadl2.ComponentImplementation)7 EList (org.eclipse.emf.common.util.EList)6 ComponentType (org.osate.aadl2.ComponentType)6 AgreeContractLibrary (com.rockwellcollins.atc.agree.agree.AgreeContractLibrary)5 AgreeContractSubclause (com.rockwellcollins.atc.agree.agree.AgreeContractSubclause)5 EqStatement (com.rockwellcollins.atc.agree.agree.EqStatement)5 NodeDef (com.rockwellcollins.atc.agree.agree.NodeDef)5 Map (java.util.Map)5 Arg (com.rockwellcollins.atc.agree.agree.Arg)4