diff options
author | Ed Willink | 2016-09-09 09:24:16 +0000 |
---|---|---|
committer | Ed Willink | 2016-09-19 11:17:45 +0000 |
commit | 9f085f66e27da33706c7bccddc90efb8db5c607d (patch) | |
tree | 35b8a08289a2357057ed4ec08488a8a154a40cd3 | |
parent | 8b79971bb034eab985ab20796b348ee8595e72c5 (diff) | |
download | org.eclipse.qvtd-9f085f66e27da33706c7bccddc90efb8db5c607d.tar.gz org.eclipse.qvtd-9f085f66e27da33706c7bccddc90efb8db5c607d.tar.xz org.eclipse.qvtd-9f085f66e27da33706c7bccddc90efb8db5c607d.zip |
[500369] Support SetStatement
31 files changed, 483 insertions, 526 deletions
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java index fca2e1dd9..17d9b49d9 100644 --- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java +++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/analyzer/QVTiAS2CGVisitor.java @@ -105,6 +105,7 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtimperative.Area; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; @@ -117,10 +118,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; @@ -392,10 +391,7 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit for (@NonNull BottomPattern pBottomPattern : pBottomPatterns) { List<@NonNull Assignment> assignment = ClassUtil.nullFree(pBottomPattern.getAssignment()); for (@NonNull Assignment pAssignment : assignment) { - if (pAssignment instanceof PropertyAssignment) { - cgPropertyAssignments.add(doVisit(CGPropertyAssignment.class, pAssignment)); - } - else if (pAssignment instanceof ConnectionAssignment) { + if (pAssignment instanceof ConnectionAssignment) { cgConnectionAssignments.add(doVisit(CGConnectionAssignment.class, pAssignment)); } else { @@ -709,6 +705,11 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit } @Override + public @Nullable CGNamedElement visitBottomStatement(@NonNull BottomStatement object) { + return visitStatement(object); + } + + @Override public @Nullable CGNamedElement visitConnectionAssignment(@NonNull ConnectionAssignment asConnectionAssignment) { Variable asVariable = asConnectionAssignment.getTargetVariable(); if (asVariable == null) { @@ -913,21 +914,77 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit } @Override - public @Nullable CGNamedElement visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) { - Transformation asTransformation = ClassUtil.nonNullModel(QVTbaseUtil.getContainingTransformation(asNavigationAssignment)); + public @Nullable CGNamedElement visitPattern(@NonNull Pattern object) { + return visiting(object); + } + + @Override + public @Nullable CGIfExp visitPredicate(@NonNull Predicate asPredicate) { + CGIfExp cgPredicate = CGModelFactory.eINSTANCE.createCGIfExp(); + cgPredicate.setTypeId(analyzer.getTypeId(TypeId.BOOLEAN)); + cgPredicate.setRequired(true); + OCLExpression asConditionExpression = asPredicate.getConditionExpression(); + assert asConditionExpression != null; + cgPredicate.setCondition(doVisit(CGValuedElement.class, asConditionExpression)); + CGConstantExp cgElse = analyzer.createCGConstantExp(asConditionExpression, analyzer.getBoolean(false)); + setAst(cgElse, asConditionExpression); + cgElse.setTypeId(analyzer.getTypeId(TypeId.BOOLEAN)); + cgElse.setRequired(true); + cgPredicate.setElseExpression(cgElse); + return cgPredicate; + } + + /* @Override + public @Nullable CGNamedElement visitMiddlePropertyAssignment(@NonNull MiddlePropertyAssignment asPropertyAssignment) { +// Property asProperty = ClassUtil.nonNullModel(asPropertyAssignment.getTargetProperty()); + CGMiddlePropertyAssignment cgPropertyAssignment = QVTiCGModelFactory.eINSTANCE.createCGMiddlePropertyAssignment(); +// setPivot(cgPropertyAssignment, asPredicate); + cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asPropertyAssignment.getSlotExpression())); + Property asProperty = asPropertyAssignment.getTargetProperty(); + cgPropertyAssignment.setReferredProperty(asProperty); +// cgPredicate.setName(asPredicate.getName()); + cgPropertyAssignment.setTypeId(analyzer.getTypeId(TypeId.OCL_VOID)); +// cgMappingCallBinding.setValueName(localnameasMappingCallBinding.getBoundVariable().getName()); + cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asPropertyAssignment.getValue())); + EStructuralFeature eStructuralFeature = (EStructuralFeature) asProperty.getESObject(); + if (eStructuralFeature != null) { + try { + genModelHelper.getGetAccessor(eStructuralFeature); + cgPropertyAssignment.setEStructuralFeature(eStructuralFeature); + } catch (GenModelException e) { + } + } + return cgPropertyAssignment; + } */ + + @Override + public @Nullable CGNamedElement visitRealizedVariable(@NonNull RealizedVariable object) { + // CGExecutorType cgExecutorType = analyzer.createExecutorType(pTypeExp.getReferredType()); + // cgTypeExp.setExecutorType(cgExecutorType); + return visiting(object); + } + + @Override + public @Nullable CGNamedElement visitRule(@NonNull Rule object) { + return visiting(object); + } + + @Override + public @Nullable CGNamedElement visitSetStatement(@NonNull SetStatement asSetStatement) { + Transformation asTransformation = ClassUtil.nonNullModel(QVTbaseUtil.getContainingTransformation(asSetStatement)); QVTiTransformationAnalysis transformationAnalysis = analyzer.getCodeGenerator().getTransformationAnalysis(asTransformation); - Integer cacheIndex = transformationAnalysis.getCacheIndex(asNavigationAssignment); + Integer cacheIndex = transformationAnalysis.getCacheIndex(asSetStatement); if (cacheIndex != null) { // Property asProperty = ClassUtil.nonNullModel(asPropertyAssignment.getTargetProperty()); CGMiddlePropertyAssignment cgPropertyAssignment = QVTiCGModelFactory.eINSTANCE.createCGMiddlePropertyAssignment(); - setAst(cgPropertyAssignment, asNavigationAssignment); - cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asNavigationAssignment.getSlotExpression())); - Property asProperty = QVTimperativeUtil.getTargetProperty(asNavigationAssignment); + setAst(cgPropertyAssignment, asSetStatement); + cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asSetStatement.getSlotExpression())); + Property asProperty = QVTimperativeUtil.getTargetProperty(asSetStatement); cgPropertyAssignment.setReferredProperty(asProperty); // cgPredicate.setName(asPredicate.getName()); cgPropertyAssignment.setTypeId(analyzer.getTypeId(TypeId.OCL_VOID)); // cgMappingCallBinding.setValueName(localnameasMappingCallBinding.getBoundVariable().getName()); - cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asNavigationAssignment.getValue())); + cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asSetStatement.getValue())); EStructuralFeature eStructuralFeature = (EStructuralFeature) asProperty.getESObject(); if (eStructuralFeature != null) { try { @@ -940,8 +997,8 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit return cgPropertyAssignment; } else { - Property asTargetProperty = QVTimperativeUtil.getTargetProperty(asNavigationAssignment); - LibraryProperty libraryProperty = metamodelManager.getImplementation(asNavigationAssignment, null, asTargetProperty); + Property asTargetProperty = QVTimperativeUtil.getTargetProperty(asSetStatement); + LibraryProperty libraryProperty = metamodelManager.getImplementation(asSetStatement, null, asTargetProperty); CGPropertyAssignment cgPropertyAssignment = null; if (isEcoreProperty(libraryProperty)) { EStructuralFeature eStructuralFeature = (EStructuralFeature) asTargetProperty.getESObject(); @@ -974,13 +1031,13 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit if (cgPropertyAssignment == null) { cgPropertyAssignment = QVTiCGModelFactory.eINSTANCE.createCGPropertyAssignment(); } - setAst(cgPropertyAssignment, asNavigationAssignment); - cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asNavigationAssignment.getSlotExpression())); + setAst(cgPropertyAssignment, asSetStatement); + cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asSetStatement.getSlotExpression())); cgPropertyAssignment.setReferredProperty(asTargetProperty); // cgPredicate.setName(asPredicate.getName()); cgPropertyAssignment.setTypeId(analyzer.getTypeId(TypeId.OCL_VOID)); // cgMappingCallBinding.setValueName(localnameasMappingCallBinding.getBoundVariable().getName()); - cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asNavigationAssignment.getValue())); + cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asSetStatement.getValue())); CGExecutorProperty cgExecutorProperty = analyzer.createExecutorProperty(asTargetProperty); cgPropertyAssignment.setExecutorProperty(cgExecutorProperty); @@ -989,72 +1046,6 @@ public class QVTiAS2CGVisitor extends AS2CGVisitor implements QVTimperativeVisit } @Override - public @Nullable CGNamedElement visitPattern(@NonNull Pattern object) { - return visiting(object); - } - - @Override - public @Nullable CGIfExp visitPredicate(@NonNull Predicate asPredicate) { - CGIfExp cgPredicate = CGModelFactory.eINSTANCE.createCGIfExp(); - cgPredicate.setTypeId(analyzer.getTypeId(TypeId.BOOLEAN)); - cgPredicate.setRequired(true); - OCLExpression asConditionExpression = asPredicate.getConditionExpression(); - assert asConditionExpression != null; - cgPredicate.setCondition(doVisit(CGValuedElement.class, asConditionExpression)); - CGConstantExp cgElse = analyzer.createCGConstantExp(asConditionExpression, analyzer.getBoolean(false)); - setAst(cgElse, asConditionExpression); - cgElse.setTypeId(analyzer.getTypeId(TypeId.BOOLEAN)); - cgElse.setRequired(true); - cgPredicate.setElseExpression(cgElse); - return cgPredicate; - } - - /* @Override - public @Nullable CGNamedElement visitMiddlePropertyAssignment(@NonNull MiddlePropertyAssignment asPropertyAssignment) { -// Property asProperty = ClassUtil.nonNullModel(asPropertyAssignment.getTargetProperty()); - CGMiddlePropertyAssignment cgPropertyAssignment = QVTiCGModelFactory.eINSTANCE.createCGMiddlePropertyAssignment(); -// setPivot(cgPropertyAssignment, asPredicate); - cgPropertyAssignment.setSlotValue(doVisit(CGValuedElement.class, asPropertyAssignment.getSlotExpression())); - Property asProperty = asPropertyAssignment.getTargetProperty(); - cgPropertyAssignment.setReferredProperty(asProperty); -// cgPredicate.setName(asPredicate.getName()); - cgPropertyAssignment.setTypeId(analyzer.getTypeId(TypeId.OCL_VOID)); -// cgMappingCallBinding.setValueName(localnameasMappingCallBinding.getBoundVariable().getName()); - cgPropertyAssignment.setInitValue(doVisit(CGValuedElement.class, asPropertyAssignment.getValue())); - EStructuralFeature eStructuralFeature = (EStructuralFeature) asProperty.getESObject(); - if (eStructuralFeature != null) { - try { - genModelHelper.getGetAccessor(eStructuralFeature); - cgPropertyAssignment.setEStructuralFeature(eStructuralFeature); - } catch (GenModelException e) { - } - } - return cgPropertyAssignment; - } */ - - @Override - public @Nullable CGNamedElement visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment asPropertyAssignment) { - return visitNavigationAssignment(asPropertyAssignment); - } - - @Override - public @Nullable CGNamedElement visitPropertyAssignment(@NonNull PropertyAssignment asPropertyAssignment) { - return visitNavigationAssignment(asPropertyAssignment); - } - - @Override - public @Nullable CGNamedElement visitRealizedVariable(@NonNull RealizedVariable object) { - // CGExecutorType cgExecutorType = analyzer.createExecutorType(pTypeExp.getReferredType()); - // cgTypeExp.setExecutorType(cgExecutorType); - return visiting(object); - } - - @Override - public @Nullable CGNamedElement visitRule(@NonNull Rule object) { - return visiting(object); - } - - @Override public @Nullable CGNamedElement visitStatement(@NonNull Statement object) { return visiting(object); } diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java index ded250000..96cf4d679 100644 --- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java +++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java @@ -100,15 +100,11 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtbase.analysis.DomainUsage; import org.eclipse.qvtd.pivot.qvtimperative.Area; -import org.eclipse.qvtd.pivot.qvtimperative.Assignment; -import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; import org.eclipse.qvtd.runtime.evaluation.AbstractInvocation; @@ -188,24 +184,6 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato } protected void doAddRealization(@NonNull CGRealizedVariable cgRealizedVariable) { - RealizedVariable pRealizedVariable = (RealizedVariable)cgRealizedVariable.getAst(); - Area pArea = QVTimperativeUtil.getContainingArea(pRealizedVariable); - if (pArea != null) { - BottomPattern pBottomPattern = pArea.getBottomPattern(); - if (pBottomPattern != null) { - for (@NonNull Assignment pAssignment : ClassUtil.nullFree(pBottomPattern.getAssignment())) { - if (pAssignment instanceof PropertyAssignment) { - Property pProperty = ((PropertyAssignment)pAssignment).getTargetProperty(); - if (pProperty != null) { - Property pOppositeProperty = pProperty.getOpposite(); - if ((pOppositeProperty != null) && pOppositeProperty.isIsComposite()) { - // FIXME must check for null asssignment and correct target return; - } - } - } - } - } - } CGTypedModel cgTypedModel = cgRealizedVariable.getTypedModel(); // js.append(QVTiGlobalContext.MODELS_NAME); @@ -343,10 +321,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato CGValuedElement cgInit = getExpression(cgPropertyAssignment.getInitValue()); EPackage ePackage = ClassUtil.nonNullModel(eStructuralFeature.getEContainingClass().getEPackage()); boolean isHazardous = false; - Element asNavigationAssignment = cgPropertyAssignment.getAst(); - Mapping asMapping = QVTimperativeUtil.getContainingMapping(asNavigationAssignment); - if ((asMapping != null) && (asNavigationAssignment instanceof NavigationAssignment)) { - isHazardous = transformationAnalysis.isHazardousWrite(asMapping, (NavigationAssignment)asNavigationAssignment); + Element asSetStatement = cgPropertyAssignment.getAst(); + Mapping asMapping = QVTimperativeUtil.getContainingMapping(asSetStatement); + if ((asMapping != null) && (asSetStatement instanceof SetStatement)) { + isHazardous = transformationAnalysis.isHazardousWrite(asMapping, (SetStatement)asSetStatement); } if (isHazardous || isIncremental) { js.append("objectManager.assigned("); @@ -370,10 +348,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato CGValuedElement cgInit = getExpression(cgPropertyAssignment.getInitValue()); EPackage ePackage = ClassUtil.nonNullModel(eStructuralFeature.getEContainingClass().getEPackage()); boolean isHazardous = false; - Element asNavigationAssignment = cgPropertyAssignment.getAst(); - Mapping asMapping = QVTimperativeUtil.getContainingMapping(asNavigationAssignment); - if ((asMapping != null) && (asNavigationAssignment instanceof NavigationAssignment)) { - isHazardous = transformationAnalysis.isHazardousWrite(asMapping, (NavigationAssignment)asNavigationAssignment); + Element asSetStatement = cgPropertyAssignment.getAst(); + Mapping asMapping = QVTimperativeUtil.getContainingMapping(asSetStatement); + if ((asMapping != null) && (asSetStatement instanceof SetStatement)) { + isHazardous = transformationAnalysis.isHazardousWrite(asMapping, (SetStatement)asSetStatement); } if (isHazardous || isIncremental) { js.append("objectManager.assigned("); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/BasicRegion2Mapping.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/BasicRegion2Mapping.java index 6e3a8bd75..492be8464 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/BasicRegion2Mapping.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/BasicRegion2Mapping.java @@ -92,8 +92,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.util.AbstractExtendingQVTimperativeVisitor; import org.eclipse.qvtd.pivot.qvtimperative.utilities.AssignmentComparator; @@ -723,7 +723,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping return variable; } - private void createClassPropertyAssignments(@NonNull Iterable<@NonNull List<@NonNull NavigableEdge>> classAssignments) { + private void createClassSetStatements(@NonNull Iterable<@NonNull List<@NonNull NavigableEdge>> classAssignments) { for (@NonNull List<@NonNull NavigableEdge> edges : classAssignments) { for (@NonNull NavigableEdge edge : edges) { Node sourceNode = edge.getSource(); @@ -731,8 +731,8 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping OCLExpression slotVariableExp = createVariableExp(sourceNode); Property property = edge.getProperty(); OCLExpression targetVariableExp = createVariableExp(targetNode); - PropertyAssignment propertyAssignment = QVTimperativeUtil.createPropertyAssignment(slotVariableExp, property, targetVariableExp); - mapping.getBottomPattern().getAssignment().add(propertyAssignment); + SetStatement setStatement = QVTimperativeUtil.createSetStatement((Variable) ((VariableExp)slotVariableExp).getReferredVariable(), property, targetVariableExp); + mapping.getOwnedStatements().add(setStatement); } } } @@ -1161,8 +1161,8 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping valueExp = expressionCreator.getExpression(targetNode); // FIXME debugging } if (valueExp != null) { - PropertyAssignment propertyAssignment = QVTimperativeUtil.createPropertyAssignment(slotVariableExp, property, valueExp); - bottomPattern.getAssignment().add(propertyAssignment); + SetStatement propertyAssignment = QVTimperativeUtil.createSetStatement((Variable) ((VariableExp)slotVariableExp).getReferredVariable(), property, valueExp); + mapping.getOwnedStatements().add(propertyAssignment); } else { System.err.println("No assignment in " + this + " to " + slotVariableExp + "." + property); @@ -1183,7 +1183,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping if (classAssignments != null) { pruneClassAssignments(classAssignments); Collection<@NonNull List<@NonNull NavigableEdge>> values = classAssignments.values(); - createClassPropertyAssignments(values); + createClassSetStatements(values); } @SuppressWarnings("null") @NonNull EList<@NonNull Assignment> bottomAssignments = bottomPattern.getAssignment(); diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/AbstractQVTimperativeStepperVisitor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/AbstractQVTimperativeStepperVisitor.java index 9be5aae9b..764a4e2d1 100644 --- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/AbstractQVTimperativeStepperVisitor.java +++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/AbstractQVTimperativeStepperVisitor.java @@ -106,23 +106,13 @@ implements QVTimperativeVisitor<IStepper> } @Override - public @Nullable IStepper visitNavigationAssignment(org.eclipse.qvtd.pivot.qvtimperative.@NonNull NavigationAssignment object) { - return visitAssignment(object); - } - - @Override - public @Nullable IStepper visitOppositePropertyAssignment(org.eclipse.qvtd.pivot.qvtimperative.@NonNull OppositePropertyAssignment object) { - return visitNavigationAssignment(object); - } - - @Override - public @Nullable IStepper visitPropertyAssignment(org.eclipse.qvtd.pivot.qvtimperative.@NonNull PropertyAssignment object) { - return visitNavigationAssignment(object); + public @Nullable IStepper visitRealizedVariable(org.eclipse.qvtd.pivot.qvtimperative.@NonNull RealizedVariable object) { + return visitVariable(object); } @Override - public @Nullable IStepper visitRealizedVariable(org.eclipse.qvtd.pivot.qvtimperative.@NonNull RealizedVariable object) { - return visitVariable(object); + public @Nullable IStepper visitSetStatement(org.eclipse.qvtd.pivot.qvtimperative.@NonNull SetStatement object) { + return visitBottomStatement(object); } @Override diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/QVTiStepperVisitor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/QVTiStepperVisitor.java index 8e6b08f01..5776d4259 100644 --- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/QVTiStepperVisitor.java +++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/stepper/QVTiStepperVisitor.java @@ -20,6 +20,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Predicate; import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; @@ -51,6 +52,11 @@ public class QVTiStepperVisitor extends AbstractQVTimperativeStepperVisitor } @Override + public IStepper visitBottomStatement(@NonNull BottomStatement object) { + return NonStepper.INSTANCE; + } + + @Override public @Nullable IStepper visitConnectionAssignment(@NonNull ConnectionAssignment object) { return visitAssignment(object); } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/AbstractDomainUsageAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/AbstractDomainUsageAnalysis.java index 965a38bc5..9df1ebe27 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/AbstractDomainUsageAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/AbstractDomainUsageAnalysis.java @@ -83,10 +83,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.util.AbstractExtendingQVTimperativeVisitor; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; @@ -108,22 +106,6 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim return element2usage.get(element); } - protected @NonNull DomainUsage doNavigationAssignment(@NonNull Property property, @NonNull NavigationAssignment object) { - DomainUsage slotUsage = visit(object.getSlotExpression()); - DomainUsage valueUsage = visit(object.getValue()); - DomainUsage knownSourceUsage = getRootAnalysis().property2containingClassUsage.get(property); - if (knownSourceUsage != null) { - DomainUsage knownTargetUsage = getRootAnalysis().getUsage(property); - assert knownTargetUsage != null; - intersection(knownSourceUsage, slotUsage); - intersection(knownTargetUsage, valueUsage); - return knownSourceUsage; //intersection(knownTargetUsage, valueUsage); - } - else { - return slotUsage; //intersection(slotUsage, valueUsage); - } - } - protected @NonNull DomainUsage doNavigationCallExp(@NonNull Property property, @NonNull NavigationCallExp object) { DomainUsage actualSourceUsage = visit(object.getOwnedSource()); DomainUsage knownPropertyUsage = visit(property); @@ -144,6 +126,22 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim return usage; } + protected @NonNull DomainUsage doSetStatement(@NonNull Property property, @NonNull SetStatement object) { + DomainUsage slotUsage = visit(object.getSlotExpression()); + DomainUsage valueUsage = visit(object.getValue()); + DomainUsage knownSourceUsage = getRootAnalysis().property2containingClassUsage.get(property); + if (knownSourceUsage != null) { + DomainUsage knownTargetUsage = getRootAnalysis().getUsage(property); + assert knownTargetUsage != null; + intersection(knownSourceUsage, slotUsage); + intersection(knownTargetUsage, valueUsage); + return knownSourceUsage; //intersection(knownTargetUsage, valueUsage); + } + else { + return slotUsage; //intersection(slotUsage, valueUsage); + } + } + protected @NonNull DomainUsage getAllInstancesUsage(@NonNull OperationCallExp object, @NonNull DomainUsage sourceUsage) { return sourceUsage; } @@ -572,15 +570,6 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim } @Override - public @NonNull DomainUsage visitNavigationAssignment(@NonNull NavigationAssignment object) { - Property property = QVTimperativeUtil.getTargetProperty(object); - // if ("middleRoot.name := hsvRoot.name".equals(object.toString())) { - // property = object.getTargetProperty(); - // } - return doNavigationAssignment(property, object); - } - - @Override public @NonNull DomainUsage visitNullLiteralExp(@NonNull NullLiteralExp object) { return getRootAnalysis().createVariableUsage(getRootAnalysis().getAnyMask()); } @@ -710,11 +699,6 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim } @Override - public @NonNull DomainUsage visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment object) { - return visitNavigationAssignment(object); - } - - @Override public @NonNull DomainUsage visitOppositePropertyCallExp(@NonNull OppositePropertyCallExp object) { Property property = ClassUtil.nonNullState(object.getReferredProperty()); Property oppositeProperty = ClassUtil.nonNullState(property.getOpposite()); @@ -753,11 +737,6 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim } @Override - public @NonNull DomainUsage visitPropertyAssignment(@NonNull PropertyAssignment object) { - return visitNavigationAssignment(object); - } - - @Override public @NonNull DomainUsage visitPropertyCallExp(@NonNull PropertyCallExp object) { Property property = ClassUtil.nonNullState(object.getReferredProperty()); return doNavigationCallExp(property, object); @@ -782,6 +761,15 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTim } @Override + public @NonNull DomainUsage visitSetStatement(@NonNull SetStatement object) { + Property property = QVTimperativeUtil.getTargetProperty(object); + // if ("middleRoot.name := hsvRoot.name".equals(object.toString())) { + // property = object.getTargetProperty(); + // } + return doSetStatement(property, object); + } + + @Override public @NonNull DomainUsage visitShadowExp(@NonNull ShadowExp object) { DomainUsage usage = visit(object.getType()); for (@SuppressWarnings("null")@NonNull ShadowPart part : object.getOwnedParts()) { diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/RootDomainUsageAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/RootDomainUsageAnalysis.java index af20aba41..b8506c013 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/RootDomainUsageAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/analysis/RootDomainUsageAnalysis.java @@ -55,7 +55,7 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtimperative.Area; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.util.QVTimperativeVisitor; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; @@ -372,19 +372,19 @@ public class RootDomainUsageAnalysis extends AbstractDomainUsageAnalysis impleme return analysis; } - protected void analyzePropertyAssignments(@NonNull Transformation transformation) { + protected void analyzeSetStatements(@NonNull Transformation transformation) { for (TreeIterator<EObject> tit = transformation.eAllContents(); tit.hasNext(); ) { EObject eObject = tit.next(); - if (eObject instanceof PropertyAssignment) { - PropertyAssignment propertyAssignment = (PropertyAssignment)eObject; + if (eObject instanceof SetStatement) { + SetStatement setStatement = (SetStatement)eObject; // if ("s.name := sn".equals(eObject.toString())) { // eObject.toString(); // } - OCLExpression slotExpression = propertyAssignment.getSlotExpression(); + OCLExpression slotExpression = setStatement.getSlotExpression(); assert slotExpression != null; DomainUsage domainUsage = getUsage(slotExpression); if (!domainUsage.isOutput() && !domainUsage.isMiddle()) { - Property targetProperty = ClassUtil.nonNullState(propertyAssignment.getTargetProperty()); + Property targetProperty = QVTimperativeUtil.getTargetProperty(setStatement); // System.out.println("Dirty " + targetProperty + " for " + eObject); dirtyProperties.add(targetProperty); EObject eProperty = targetProperty.getESObject(); @@ -493,7 +493,7 @@ public class RootDomainUsageAnalysis extends AbstractDomainUsageAnalysis impleme setUsage(ownedContext, getAnyUsage()); } visit(transformation); - analyzePropertyAssignments(transformation); + analyzeSetStatements(transformation); return element2usage; } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/attributes/SetStatementAttribution.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/attributes/SetStatementAttribution.java new file mode 100644 index 000000000..93e4dca10 --- /dev/null +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/attributes/SetStatementAttribution.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2013, 2014 Willink Transformations and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * E.D.Willink - initial API and implementation + *******************************************************************************/ +package org.eclipse.qvtd.pivot.qvtimperative.attributes; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.ocl.pivot.PivotPackage; +import org.eclipse.ocl.pivot.internal.scoping.EmptyAttribution; +import org.eclipse.ocl.pivot.internal.scoping.EnvironmentView; +import org.eclipse.ocl.pivot.internal.scoping.ScopeView; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; + +public class SetStatementAttribution extends EmptyAttribution +{ + public static final SetStatementAttribution INSTANCE = new SetStatementAttribution(); + + @Override + public ScopeView computeLookup(@NonNull EObject target, @NonNull EnvironmentView environmentView, @NonNull ScopeView scopeView) { + SetStatement asSetStatement = (SetStatement)target; + if (environmentView.getRequiredType() == PivotPackage.Literals.PROPERTY) { // FIXME should be detecting ancestor + environmentView.addElementsOfScope(asSetStatement.getSlotExpression().getType(), scopeView); + return null; + } + else { + return super.computeLookup(target, environmentView, scopeView); + } + } +} diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java index c0cad2d4a..9ed5e3766 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java @@ -63,8 +63,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; @@ -436,17 +436,6 @@ public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor } @Override - public void internalExecuteNavigationAssignment(@NonNull NavigationAssignment navigationAssignment, @NonNull Object slotObject, @Nullable Object ecoreValue, @Nullable Object childKey) { - Property targetProperty = QVTimperativeUtil.getTargetProperty(navigationAssignment); - targetProperty.initValue(slotObject, ecoreValue); - QVTiModelManager modelManager = getModelManager(); - Integer cacheIndex = modelManager.getTransformationAnalysis().getCacheIndex(navigationAssignment); - if (cacheIndex != null) { - modelManager.setUnnavigableOpposite(cacheIndex, slotObject, ecoreValue); - } - } - - @Override public @Nullable Object internalExecuteOperationCallExp(@NonNull OperationCallExp operationCallExp, @Nullable Object @NonNull [] boxedSourceAndArgumentValues) { Operation referredOperation = operationCallExp.getReferredOperation(); @@ -478,6 +467,17 @@ public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor } @Override + public void internalExecuteSetStatement(@NonNull SetStatement setStatement, @NonNull Object slotObject, @Nullable Object ecoreValue, @Nullable Object childKey) { + Property targetProperty = QVTimperativeUtil.getTargetProperty(setStatement); + targetProperty.initValue(slotObject, ecoreValue); + QVTiModelManager modelManager = getModelManager(); + Integer cacheIndex = modelManager.getTransformationAnalysis().getCacheIndex(setStatement); + if (cacheIndex != null) { + modelManager.setUnnavigableOpposite(cacheIndex, slotObject, ecoreValue); + } + } + + @Override public @Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor) { Rule rule = NameUtil.getNameable(transformation.getRule(), QVTimperativeUtil.ROOT_MAPPING_NAME); if (rule == null) { diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiAbstractTracingEvaluationVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiAbstractTracingEvaluationVisitor.java index 91ab89153..ebaa45d0e 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiAbstractTracingEvaluationVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiAbstractTracingEvaluationVisitor.java @@ -32,17 +32,18 @@ import org.eclipse.ocl.pivot.values.InvalidValueException; import org.eclipse.qvtd.pivot.qvtbase.Predicate; import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; +import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; /** * The Class QVTiTracingEvaluationVisitor is a decorator visitor that prints @@ -296,20 +297,20 @@ public abstract class QVTiAbstractTracingEvaluationVisitor extends QVTiEvaluatio * @see org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEvaluationVisitorDecorator#visitPropertyAssignment(org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment) */ @Override - public @Nullable Object visitPropertyAssignment(@NonNull PropertyAssignment propertyAssignment) { + public @Nullable Object visitSetStatement(@NonNull SetStatement setStatement) { try { - Object value = safeVisit(propertyAssignment.getValue()); + Object value = safeVisit(setStatement.getValue()); // Unbox to asign to ecore type value = delegate.getEnvironmentFactory().getIdResolver().unboxedValueOf(value); - logger.info(getIndent() + "VisitPropertyAssignment " + propertyAssignment.getSlotExpression() - + "." + propertyAssignment.getTargetProperty().getName() + " = " + prettyPrint(value)); + logger.info(getIndent() + "VisitSetStatement " + setStatement.getSlotExpression() + + "." + QVTimperativeUtil.getTargetProperty(setStatement).getName() + " = " + prettyPrint(value)); } catch (InvalidValueException ex) { - logger.info(getIndent() + "VisitPropertyAssignment " + propertyAssignment.getSlotExpression() - + "." + propertyAssignment.getTargetProperty().getName() + " = InvalidValueException" ); + logger.info(getIndent() + "VisitSetStatement " + setStatement.getSlotExpression() + + "." + QVTimperativeUtil.getTargetProperty(setStatement).getName() + " = InvalidValueException" ); } //indentLevel++; - Object result = delegate.visitPropertyAssignment(propertyAssignment); + Object result = delegate.visitSetStatement(setStatement); //indentLevel--; return result; } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java index db27dd9aa..5cad01098 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitor.java @@ -39,6 +39,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; @@ -51,10 +52,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; @@ -114,6 +113,11 @@ public class QVTiEvaluationVisitor extends BasicEvaluationVisitor implements IQV } @Override + public @Nullable Object visitBottomStatement(@NonNull BottomStatement object) { + return visitStatement(object); // MappingStatement is abstract + } + + @Override public @Nullable Object visitConnectionAssignment(@NonNull ConnectionAssignment connectionAssignment) { ConnectionVariable targetVariable = connectionAssignment.getTargetVariable() ; if (targetVariable != null) { @@ -266,47 +270,6 @@ public class QVTiEvaluationVisitor extends BasicEvaluationVisitor implements IQV return visitStatement(object); // MappingStatement is abstract } - @Override - public @Nullable Object visitNavigationAssignment(@NonNull NavigationAssignment navigationAssignment) { - Object slotObject = navigationAssignment.getSlotExpression().accept(undecoratedVisitor); - if (slotObject instanceof EObject) { - Integer childKey = null; - try { - Object boxedValue = navigationAssignment.getValue().accept(undecoratedVisitor); - Property targetProperty = QVTimperativeUtil.getTargetProperty(navigationAssignment); - Class<?> instanceClass = PivotUtil.getEcoreInstanceClass(targetProperty); - Object ecoreValue = idResolver.ecoreValueOf(instanceClass, boxedValue); - Property oppositeProperty = targetProperty.getOpposite(); - if (oppositeProperty != null) { - Type type = oppositeProperty.getType(); - if (type instanceof CollectionType) { - boolean isOrdered = ((CollectionType)type).isOrdered(); - if (isOrdered) { - - } - } - } - executor.internalExecuteNavigationAssignment(navigationAssignment, slotObject, ecoreValue, childKey); - return null; - } - catch (InvocationFailedException e) { - executor.internalExecuteNavigationAssignment(navigationAssignment, slotObject, e, childKey); - // throw e; - } - // } else if (slotObject == null){ - // throw new InvalidValueException("Null source for '" + navigationAssignment.toString() + "'"); - } else { - throw new IllegalArgumentException("Unsupported " + navigationAssignment.eClass().getName() - + " specification. The assignment slot expression '" + navigationAssignment.toString() + "'evaluates to non-ecore value: " + NameUtil.debugFullName(slotObject)); - } - return true; - } - - @Override - public @Nullable Object visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment navigationAssignment) { - return visitNavigationAssignment(navigationAssignment); - } - /* @Override public Object visitOppositePropertyCallExp(@NonNull OppositePropertyCallExp oppositePropertyCallExp) { QVTiModelManager modelManager = (QVTiModelManager) context.getModelManager(); @@ -349,11 +312,6 @@ public class QVTiEvaluationVisitor extends BasicEvaluationVisitor implements IQV } @Override - public @Nullable Object visitPropertyAssignment(@NonNull PropertyAssignment navigationAssignment) { - return visitNavigationAssignment(navigationAssignment); - } - - @Override public @Nullable Object visitRealizedVariable(@NonNull RealizedVariable realizedVariable) { return executor.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor); } @@ -364,6 +322,42 @@ public class QVTiEvaluationVisitor extends BasicEvaluationVisitor implements IQV } @Override + public @Nullable Object visitSetStatement(@NonNull SetStatement setStatement) { + Object slotObject = setStatement.getSlotExpression().accept(undecoratedVisitor); + if (slotObject instanceof EObject) { + Integer childKey = null; + try { + Object boxedValue = setStatement.getValue().accept(undecoratedVisitor); + Property targetProperty = QVTimperativeUtil.getTargetProperty(setStatement); + Class<?> instanceClass = PivotUtil.getEcoreInstanceClass(targetProperty); + Object ecoreValue = idResolver.ecoreValueOf(instanceClass, boxedValue); + Property oppositeProperty = targetProperty.getOpposite(); + if (oppositeProperty != null) { + Type type = oppositeProperty.getType(); + if (type instanceof CollectionType) { + boolean isOrdered = ((CollectionType)type).isOrdered(); + if (isOrdered) { + + } + } + } + executor.internalExecuteSetStatement(setStatement, slotObject, ecoreValue, childKey); + return null; + } + catch (InvocationFailedException e) { + executor.internalExecuteSetStatement(setStatement, slotObject, e, childKey); // FIXME This leads to an AssertionError in PropertyImpl.initValue + // throw e; + } + // } else if (slotObject == null){ + // throw new InvalidValueException("Null source for '" + navigationAssignment.toString() + "'"); + } else { + throw new IllegalArgumentException("Unsupported " + setStatement.eClass().getName() + + " specification. The assignment slot expression '" + setStatement.toString() + "'evaluates to non-ecore value: " + NameUtil.debugFullName(slotObject)); + } + return true; + } + + @Override public @Nullable Object visitStatement(@NonNull Statement object) { return visitNamedElement(object); // Statement is abstract } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitorDecorator.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitorDecorator.java index fc52421ed..927d1710f 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitorDecorator.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiEvaluationVisitorDecorator.java @@ -30,15 +30,15 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; /** @@ -294,24 +294,24 @@ implements IQVTiEvaluationVisitor { * Delegates to my decorated visitor. */ @Override - public @Nullable Object visitPropertyAssignment(@NonNull PropertyAssignment propertyAssignment) { - return delegate.visitPropertyAssignment(propertyAssignment); + public @Nullable Object visitRealizedVariable(@NonNull RealizedVariable realizedVariable) { + return delegate.visitRealizedVariable(realizedVariable); } /** * Delegates to my decorated visitor. */ @Override - public @Nullable Object visitRealizedVariable(@NonNull RealizedVariable realizedVariable) { - return delegate.visitRealizedVariable(realizedVariable); + public @Nullable Object visitRule(@NonNull Rule rule) { + return delegate.visitRule(rule); } /** * Delegates to my decorated visitor. */ @Override - public @Nullable Object visitRule(@NonNull Rule rule) { - return delegate.visitRule(rule); + public @Nullable Object visitSetStatement(@NonNull SetStatement setStatement) { + return delegate.visitSetStatement(setStatement); } /** diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java index a5a7116bf..6a4750095 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiExecutor.java @@ -20,8 +20,8 @@ import org.eclipse.ocl.pivot.internal.evaluation.ExecutorInternal; import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; public interface QVTiExecutor extends ExecutorInternal { @@ -34,8 +34,8 @@ public interface QVTiExecutor extends ExecutorInternal @NonNull QVTiModelManager getModelManager(); @Nullable Object internalExecuteMapping(@NonNull Mapping mapping, @NonNull EvaluationVisitor undecoratedVisitor); @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull Object @NonNull [] boundValues, @NonNull EvaluationVisitor undecoratedVisitor); - void internalExecuteNavigationAssignment(@NonNull NavigationAssignment navigationAssignment, @NonNull Object slotObject, @Nullable Object ecoreValue, @Nullable Object childKey); @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor); + void internalExecuteSetStatement(@NonNull SetStatement setStatement, @NonNull Object slotObject, @Nullable Object ecoreValue, @Nullable Object childKey); @Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor); void loadModel(@NonNull String inName, @NonNull URI inURI, @Nullable String contentType); void replace(@NonNull TypedElement referredVariable, @Nullable Object value, boolean checkType); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java index 106704501..198dd8856 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java @@ -32,8 +32,8 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; import org.eclipse.qvtd.runtime.evaluation.AbstractComputation; import org.eclipse.qvtd.runtime.evaluation.AbstractInvocation; @@ -266,20 +266,36 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor } @Override - public void internalExecuteNavigationAssignment(@NonNull NavigationAssignment navigationAssignment, @NonNull Object sourceObject, @Nullable Object ecoreValue, @Nullable Object childKey) { - super.internalExecuteNavigationAssignment(navigationAssignment, sourceObject, ecoreValue, childKey); + public @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor) { + Object element = super.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor); + if ((element != null) && (mode == Mode.INCREMENTAL)) { + Invocation.Incremental currentInvocation2 = currentInvocation; + assert currentInvocation2 != null; + objectManager.created(currentInvocation2, element); + /* DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(realizedVariable); + ClassStatus classStatus = statusManager.getClassStatus(domainUsage, realizedVariable.getType(), (EObject)element); + MappingStatus mappingStatus = findMappingStatus(); + assert mappingStatus != null; + mappingStatus.getOutputs().add(classStatus); */ + } + return element; + } + + @Override + public void internalExecuteSetStatement(@NonNull SetStatement setStatement, @NonNull Object sourceObject, @Nullable Object ecoreValue, @Nullable Object childKey) { + super.internalExecuteSetStatement(setStatement, sourceObject, ecoreValue, childKey); if (mode == Mode.LAZY) { - Mapping asMapping = QVTimperativeUtil.getContainingMapping(navigationAssignment); + Mapping asMapping = QVTimperativeUtil.getContainingMapping(setStatement); assert asMapping != null; - if (transformationAnalysis.isHazardousWrite(asMapping, navigationAssignment)) { - Property targetProperty = QVTimperativeUtil.getTargetProperty(navigationAssignment); + if (transformationAnalysis.isHazardousWrite(asMapping, setStatement)) { + Property targetProperty = QVTimperativeUtil.getTargetProperty(setStatement); assert targetProperty != null; EStructuralFeature eFeature = (EStructuralFeature)targetProperty.getESObject(); objectManager.assigned(sourceObject, eFeature, ecoreValue, childKey); } } else { - Property targetProperty = QVTimperativeUtil.getTargetProperty(navigationAssignment); + Property targetProperty = QVTimperativeUtil.getTargetProperty(setStatement); assert targetProperty != null; EStructuralFeature eFeature = (EStructuralFeature)targetProperty.getESObject(); Invocation.Incremental currentInvocation2 = currentInvocation; @@ -287,20 +303,4 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor objectManager.assigned(currentInvocation2, sourceObject, eFeature, ecoreValue, childKey); } } - - @Override - public @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor) { - Object element = super.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor); - if ((element != null) && (mode == Mode.INCREMENTAL)) { - Invocation.Incremental currentInvocation2 = currentInvocation; - assert currentInvocation2 != null; - objectManager.created(currentInvocation2, element); - /* DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(realizedVariable); - ClassStatus classStatus = statusManager.getClassStatus(domainUsage, realizedVariable.getType(), (EObject)element); - MappingStatus mappingStatus = findMappingStatus(); - assert mappingStatus != null; - mappingStatus.getOutputs().add(classStatus); */ - } - return element; - } } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java index 3aa5326f7..61de06241 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java @@ -32,6 +32,7 @@ import org.eclipse.ocl.pivot.PrimitiveType; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.PropertyCallExp; import org.eclipse.ocl.pivot.Type; +import org.eclipse.ocl.pivot.VariableExp; import org.eclipse.ocl.pivot.ids.IdManager; import org.eclipse.ocl.pivot.ids.OperationId; import org.eclipse.ocl.pivot.ids.TypeId; @@ -50,8 +51,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.analysis.QVTimperativeDomainUsageAnalysis; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; @@ -63,7 +63,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; * Salient characteristics are: * <br> * - the source types of allInstances() calls - * - cache indexes of MiddlePropertyAssignment/MiddlePropertyCallExp + * - cache indexes of MiddleSetStatement/MiddlePropertyCallExp */ public class QVTiTransformationAnalysis { @@ -77,59 +77,59 @@ public class QVTiTransformationAnalysis /** * Set of all types for which allInstances() is invoked. */ - private final @NonNull Set<org.eclipse.ocl.pivot.@NonNull Class> allInstancesClasses = new HashSet<org.eclipse.ocl.pivot.@NonNull Class>(); + private final @NonNull Set<org.eclipse.ocl.pivot.@NonNull Class> allInstancesClasses = new HashSet<>(); /** * Map from navigable property to sequential index in any TypedModel. */ - private final @NonNull Map<@NonNull Property, @NonNull Integer> property2cacheIndex = new HashMap<@NonNull Property, @NonNull Integer>(); + private final @NonNull Map<@NonNull Property, @NonNull Integer> property2cacheIndex = new HashMap<>(); /** * Map from navigable property to sequential index in a checkable TypedModel. */ - private final @NonNull Map<Property, Integer> sourceProperty2cacheIndex = new HashMap<Property, Integer>(); + private final @NonNull Map<@NonNull Property, @NonNull Integer> sourceProperty2cacheIndex = new HashMap<>(); /** * Map from propertyAssignment to the cache index of an un-navigable lookup cache to be updated by the assignment. */ - private final @NonNull Map<NavigationAssignment, Integer> navigationAssignment2cacheIndex = new HashMap<NavigationAssignment, Integer>(); + private final @NonNull Map<@NonNull SetStatement, @NonNull Integer> setStatement2cacheIndex = new HashMap<>(); /** * Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache. */ - private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>(); + private final @NonNull Map<@NonNull OppositePropertyCallExp, @NonNull Integer> oppositePropertyCallExp2cacheIndex = new HashMap<>(); /** * Map from operation to the properties that it may access. */ - private final @NonNull Map<Operation, Set<NavigationCallExp>> operation2property = new HashMap<Operation, Set<NavigationCallExp>>(); + private final @NonNull Map<@NonNull Operation, @NonNull Set<@NonNull NavigationCallExp>> operation2property = new HashMap<>(); /** * Map from mapping to the properties that it may access. */ - private final @NonNull Map<Mapping, Set<NavigationCallExp>> mapping2property = new HashMap<Mapping, Set<NavigationCallExp>>(); + private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> mapping2property = new HashMap<>(); /** * Map from mapping to the properties that it may assign. */ - private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments = new HashMap<Mapping, Set<PropertyAssignment>>(); + private final @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull SetStatement>> mapping2propertyAssignments = new HashMap<>(); /** * Mappings that have an isPolled input. */ - private final @NonNull Set<Mapping> hazardousMappings = new HashSet<Mapping>(); + private final @NonNull Set<@NonNull Mapping> hazardousMappings = new HashSet<>(); - private final @NonNull Set<Property> hazardousProperties = new HashSet<Property>(); + private final @NonNull Set<@NonNull Property> hazardousProperties = new HashSet<>(); /** - * The PropertyAssignments to each Property. + * The SetStatements to each Property. */ - private final @NonNull Map<Property, Set<PropertyAssignment>> property2propertyAssignments = new HashMap<Property, Set<PropertyAssignment>>(); + private final @NonNull Map<@NonNull Property, @NonNull Set<@NonNull SetStatement>> property2propertyAssignments = new HashMap<>(); /** * Map of all oclContainer() accesses. */ - private final @NonNull Map<Type, List<Type>> parentClass2childClasses = new HashMap<Type, List<Type>>(); + private final @NonNull Map<@NonNull Type, @NonNull List<@NonNull Type>> parentClass2childClasses = new HashMap<>(); public QVTiTransformationAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory) { this.environmentFactory = environmentFactory; @@ -164,61 +164,65 @@ public class QVTiTransformationAnalysis return cacheIndex; } - private @NonNull Set<NavigationCallExp> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) { - Set<NavigationCallExp> accessedProperties = mapping2property.get(mapping); + private @NonNull Set<@NonNull NavigationCallExp> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) { + Set<@NonNull NavigationCallExp> accessedProperties = mapping2property.get(mapping); if (accessedProperties != null) { return accessedProperties; } - accessedProperties = new HashSet<NavigationCallExp>(); + accessedProperties = new HashSet<>(); mapping2property.put(mapping, accessedProperties); analyzeTree(accessedProperties, mapping.eAllContents()); return accessedProperties; } - private @NonNull Set<PropertyAssignment> analyzeMappingPropertyAssignments(@NonNull Mapping mapping) { - Set<PropertyAssignment> assignedProperties = mapping2propertyAssignments.get(mapping); + private @NonNull Set<@NonNull SetStatement> analyzeMappingSetStatements(@NonNull Mapping mapping) { + Set<@NonNull SetStatement> assignedProperties = mapping2propertyAssignments.get(mapping); if (assignedProperties == null) { - assignedProperties = new HashSet<PropertyAssignment>(); + assignedProperties = new HashSet<>(); mapping2propertyAssignments.put(mapping, assignedProperties); } for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) { EObject eObject = treeIterator.next(); - if (eObject instanceof PropertyAssignment) { - assignedProperties.add((PropertyAssignment) eObject); + if (eObject instanceof SetStatement) { + assignedProperties.add((SetStatement) eObject); } } return assignedProperties; } - private @NonNull Set<NavigationCallExp> analyzeOperation(@NonNull Operation operation) { - Set<NavigationCallExp> operationProperties = operation2property.get(operation); + private @NonNull Set<@NonNull NavigationCallExp> analyzeOperation(@NonNull Operation operation) { + Set<@NonNull NavigationCallExp> operationProperties = operation2property.get(operation); if (operationProperties != null) { return operationProperties; } - operationProperties = new HashSet<NavigationCallExp>(); + operationProperties = new HashSet<>(); operation2property.put(operation, operationProperties); analyzeTree(operationProperties, operation.eAllContents()); return operationProperties; } private void analyzeProperties() { - Set<Mapping> hazardousMappings = getHazardousMappings(); - for (Map.Entry<Mapping, Set<NavigationCallExp>> entry : getMapping2Property().entrySet()) { + Set<@NonNull Mapping> hazardousMappings = getHazardousMappings(); + for (Map.Entry<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> entry : getMapping2Property().entrySet()) { Mapping mapping = entry.getKey(); if (hazardousMappings.contains(mapping)) { - for (@SuppressWarnings("null")@NonNull NavigationCallExp hazardousPropertyCallExp : entry.getValue()) { + for (@NonNull NavigationCallExp hazardousPropertyCallExp : entry.getValue()) { Property hazardousProperty = PivotUtil.getReferredProperty(hazardousPropertyCallExp); hazardousProperties.add(hazardousProperty); - hazardousProperties.add(hazardousProperty.getOpposite()); + Property oppositeProperty = hazardousProperty.getOpposite(); + if (oppositeProperty != null) { + hazardousProperties.add(oppositeProperty); + } } } } - for (Set<PropertyAssignment> propertyAssignments : mapping2propertyAssignments.values()) { - for (PropertyAssignment propertyAssignment : propertyAssignments) { + for (@NonNull Set<@NonNull SetStatement> propertyAssignments : mapping2propertyAssignments.values()) { + for (@NonNull SetStatement propertyAssignment : propertyAssignments) { Property property = propertyAssignment.getTargetProperty(); - Set<PropertyAssignment> assignments = property2propertyAssignments.get(property); + assert property != null; + Set<@NonNull SetStatement> assignments = property2propertyAssignments.get(property); if (assignments == null) { - assignments = new HashSet<PropertyAssignment>(); + assignments = new HashSet<>(); property2propertyAssignments.put(property, assignments); } assignments.add(propertyAssignment); @@ -242,10 +246,12 @@ public class QVTiTransformationAnalysis LibraryFeature implementation = referredProperty.getImplementation(); if (implementation instanceof OclElementOclContainerProperty) { Type childType = asPropertyCallExp.getOwnedSource().getType(); + assert childType != null; Type parentType = asPropertyCallExp.getType(); - List<Type> childClasses = parentClass2childClasses .get(parentType); + assert parentType != null; + List<@NonNull Type> childClasses = parentClass2childClasses .get(parentType); if (childClasses == null) { - childClasses = new ArrayList<Type>(); + childClasses = new ArrayList<>(); parentClass2childClasses.put(parentType, childClasses); } if (!childClasses.contains(childType)) { @@ -276,7 +282,7 @@ public class QVTiTransformationAnalysis // // First pass // - identify all allInstances() source types - // - identify all PropertyAssignments + // - identify all SetStatements // - identify all assigned PropertyCallExp and allocate a cacheIndex // Type oclElementType = environmentFactory.getStandardLibrary().getOclElementType(); @@ -284,13 +290,13 @@ public class QVTiTransformationAnalysis OperationId allInstancesOperationId = oclElementType.getTypeId().getOperationId(0, "allInstances", IdManager.getParametersId()); OperationId objectsOfKindOperationId = modelType.getTypeId().getOperationId(1, "objectsOfKind", IdManager.getParametersId(TypeId.T_1)); OperationId objectsOfTypeOperationId = modelType.getTypeId().getOperationId(1, "objectsOfType", IdManager.getParametersId(TypeId.T_1)); - List<PropertyAssignment> propertyAssignments = new ArrayList<PropertyAssignment>(); + List<@NonNull SetStatement> propertyAssignments = new ArrayList<>(); for (TreeIterator<EObject> tit = transformation.eAllContents(); tit.hasNext(); ) { EObject eObject = tit.next(); if (eObject instanceof Mapping) { Mapping mapping = (Mapping)eObject; analyzeMappingPropertyAccesses(mapping); - analyzeMappingPropertyAssignments(mapping); + analyzeMappingSetStatements(mapping); if (mapping.getCheckedProperties().size() > 0) { hazardousMappings.add(mapping); } @@ -310,6 +316,7 @@ public class QVTiTransformationAnalysis MappingCallBinding mappingCallBinding = (MappingCallBinding)eObject; if (mappingCallBinding.isIsPolled()) { Mapping mapping = mappingCallBinding.getMappingCall().getReferredMapping(); + assert mapping != null; hazardousMappings.add(mapping); } } @@ -321,8 +328,8 @@ public class QVTiTransformationAnalysis oppositePropertyCallExp2cacheIndex.put(oppositePropertyCallExp, cacheIndex); } } - else if (eObject instanceof PropertyAssignment) { - propertyAssignments.add((PropertyAssignment)eObject); + else if (eObject instanceof SetStatement) { + propertyAssignments.add((SetStatement)eObject); } else if (eObject instanceof OperationCallExp) { OperationCallExp operationCallExp = (OperationCallExp)eObject; @@ -353,14 +360,14 @@ public class QVTiTransformationAnalysis } // // Second pass - // - install cacheIndex allocated to MiddlePropertyCallExp in each MiddlePropertyAssignment + // - install cacheIndex allocated to MiddlePropertyCallExp in each MiddleSetStatement // - for (PropertyAssignment propertyAssignment : propertyAssignments) { + for (@NonNull SetStatement propertyAssignment : propertyAssignments) { Property navigableProperty = propertyAssignment.getTargetProperty(); if (navigableProperty != null) { Integer cacheIndex = property2cacheIndex.get(navigableProperty); if (cacheIndex != null) { // No need to set cacheIndex if it is never accessed by an OppositePropertyCallExp - navigationAssignment2cacheIndex.put(propertyAssignment, cacheIndex); + setStatement2cacheIndex.put(propertyAssignment, cacheIndex); } } } @@ -376,8 +383,8 @@ public class QVTiTransformationAnalysis return oppositePropertyCallExp2cacheIndex.get(oppositePropertyCallExp); } - public @Nullable Integer getCacheIndex(@NonNull NavigationAssignment navigationAssignment) { - return navigationAssignment2cacheIndex.get(navigationAssignment); + public @Nullable Integer getCacheIndex(@NonNull SetStatement setStatement) { + return setStatement2cacheIndex.get(setStatement); } public int getCacheIndexes() { @@ -392,7 +399,7 @@ public class QVTiTransformationAnalysis return domainAnalysis; } - public @NonNull Set<Mapping> getHazardousMappings() { + public @NonNull Set<@NonNull Mapping> getHazardousMappings() { return hazardousMappings; } @@ -400,14 +407,14 @@ public class QVTiTransformationAnalysis * Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass. */ public @NonNull Map<org.eclipse.ocl.pivot.@NonNull Class, @Nullable List<org.eclipse.ocl.pivot.@NonNull Class>> getInstancesClassAnalysis(@NonNull Iterable<org.eclipse.ocl.pivot.@NonNull Class> instanceClasses) { - Map<org.eclipse.ocl.pivot.@NonNull Class, @Nullable List<org.eclipse.ocl.pivot.@NonNull Class>> instancesClassAnalysis = new HashMap<org.eclipse.ocl.pivot.@NonNull Class, @Nullable List<org.eclipse.ocl.pivot.@NonNull Class>>(); + Map<org.eclipse.ocl.pivot.@NonNull Class, @Nullable List<org.eclipse.ocl.pivot.@NonNull Class>> instancesClassAnalysis = new HashMap<>(); MetamodelManagerInternal metamodelManager = environmentFactory.getMetamodelManager(); for (org.eclipse.ocl.pivot.@NonNull Class instanceClass : instanceClasses) { CompleteClass completeInstanceClass = metamodelManager.getCompleteClass(instanceClass); instancesClassAnalysis.put(completeInstanceClass.getPrimaryClass(), null); } for (org.eclipse.ocl.pivot.@NonNull Class instanceClass : instancesClassAnalysis.keySet()) { - List<org.eclipse.ocl.pivot.Class> superInstanceClasses = new ArrayList<org.eclipse.ocl.pivot.Class>(); + List<org.eclipse.ocl.pivot.Class> superInstanceClasses = new ArrayList<>(); superInstanceClasses.add(instanceClass); CompleteClass completeClass = metamodelManager.getCompleteClass(instanceClass); for (@NonNull CompleteClass superCompleteClass : completeClass.getProperSuperCompleteClasses()) { @@ -421,11 +428,11 @@ public class QVTiTransformationAnalysis return instancesClassAnalysis; } - public @NonNull Map<Mapping, Set<NavigationCallExp>> getMapping2Property() { + public @NonNull Map<@NonNull Mapping, @NonNull Set<@NonNull NavigationCallExp>> getMapping2Property() { return mapping2property; } - public @NonNull Map<Mapping, Set<PropertyAssignment>> getMapping2PropertyAssignments() { + public @NonNull Map<Mapping, @NonNull Set<@NonNull SetStatement>> getMapping2SetStatements() { return mapping2propertyAssignments; } @@ -450,7 +457,7 @@ public class QVTiTransformationAnalysis return opposite2cacheIndex; } */ - public @NonNull Map<Property, Integer> getSourceCaches() { + public @NonNull Map<@NonNull Property, @NonNull Integer> getSourceCaches() { return sourceProperty2cacheIndex; } @@ -465,11 +472,11 @@ public class QVTiTransformationAnalysis public boolean hasHazardousWrite(@NonNull MappingCall mappingCall) { Mapping mapping = mappingCall.getReferredMapping(); - Set<PropertyAssignment> propertyAssignments = mapping2propertyAssignments.get(mapping); + Set<@NonNull SetStatement> propertyAssignments = mapping2propertyAssignments.get(mapping); if (propertyAssignments == null) { return false; } - for (PropertyAssignment propertyAssignment : propertyAssignments) { + for (@NonNull SetStatement propertyAssignment : propertyAssignments) { Property assignedProperty = propertyAssignment.getTargetProperty(); if (hazardousProperties.contains(assignedProperty)) { return true; @@ -482,11 +489,11 @@ public class QVTiTransformationAnalysis } public boolean isAssigned(@NonNull Property targetProperty, @NonNull DomainUsage domainUsage) { - Set<PropertyAssignment> propertyAssignments = property2propertyAssignments.get(targetProperty); + Set<@NonNull SetStatement> propertyAssignments = property2propertyAssignments.get(targetProperty); if (propertyAssignments == null) { return false; } - for (PropertyAssignment propertyAssignment : propertyAssignments) { + for (@NonNull SetStatement propertyAssignment : propertyAssignments) { OCLExpression slotExpression = propertyAssignment.getSlotExpression(); DomainUsage slotUsage = domainAnalysis.basicGetUsage(slotExpression); if (domainUsage == slotUsage) { @@ -507,11 +514,11 @@ public class QVTiTransformationAnalysis Type parentType = targetProperty.getOwningClass(); Type childType = targetProperty.getType(); assert childType != null; - for (Map.Entry<Type, List<Type>> entry : parentClass2childClasses.entrySet()) { + for (Map.Entry<@NonNull Type, @NonNull List<@NonNull Type>> entry : parentClass2childClasses.entrySet()) { Type entryType = entry.getKey(); assert entryType != null; if (parentType.conformsTo(standardLibrary, entryType)) { - for (Type type : entry.getValue()) { + for (@NonNull Type type : entry.getValue()) { if (type.conformsTo(standardLibrary, childType)) { return true; } @@ -552,9 +559,9 @@ public class QVTiTransformationAnalysis return false; } - public boolean isHazardousWrite(@NonNull Mapping asMapping, @NonNull NavigationAssignment asNavigationAssignment) { - Property asProperty = QVTimperativeUtil.getTargetProperty(asNavigationAssignment); - OCLExpression asSource = asNavigationAssignment.getSlotExpression(); + public boolean isHazardousWrite(@NonNull Mapping asMapping, @NonNull SetStatement asSetStatement) { + Property asProperty = QVTimperativeUtil.getTargetProperty(asSetStatement); + VariableExp asSource = asSetStatement.getSlotExpression(); DomainUsage domainUsage = getDomainUsageAnalysis().basicGetUsage(asSource); if (domainUsage != null) { TypedModel typedModel = domainUsage.getTypedModel(asSource); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTuneUpVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTuneUpVisitor.java index 6ca1cc67b..4d4a67055 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTuneUpVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTuneUpVisitor.java @@ -47,7 +47,6 @@ import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativeFactory; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; @@ -108,22 +107,6 @@ public class QVTiTuneUpVisitor extends AbstractExtendingQVTimperativeVisitor<Boo else if (assignment instanceof VariableAssignment) { variableAssignments.add(assignment); } - else if (assignment instanceof PropertyAssignment) { - PropertyAssignment propertyAssignment = (PropertyAssignment)assignment; - OCLExpression slot = propertyAssignment.getSlotExpression(); - if ((slot != null) && (slot.accept(this) != Boolean.TRUE)) { - propertyAssignment.setSlotExpression(null); // Avoid a child stealing detection - VariableExp variableExp = rewritePropertyAssignmentTerm(object, variableAssignments, slot); - propertyAssignment.setSlotExpression(variableExp); - } - OCLExpression value = propertyAssignment.getValue(); - if ((value != null) && (value.accept(this) != Boolean.TRUE)) { - propertyAssignment.setValue(null); // Avoid a child stealing detection - VariableExp variableExp = rewritePropertyAssignmentTerm(object, variableAssignments, value); - propertyAssignment.setValue(variableExp); - } - propertyAssignments.add(propertyAssignment); - } else { assignment.accept(this); } @@ -273,6 +256,11 @@ public class QVTiTuneUpVisitor extends AbstractExtendingQVTimperativeVisitor<Boo } @Override + public Boolean visitStatement(@NonNull Statement object) { + return Boolean.TRUE; + } + + @Override public @Nullable Boolean visitTransformation(@NonNull Transformation object) { for (Rule rule : object.getRule()) { rule.accept(this); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/scoping/QVTimperativePivotScoping.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/scoping/QVTimperativePivotScoping.java index 06d8d21c9..99353a9fa 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/scoping/QVTimperativePivotScoping.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/scoping/QVTimperativePivotScoping.java @@ -19,6 +19,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.attributes.CoreDomainAttribution; import org.eclipse.qvtd.pivot.qvtimperative.attributes.MappingAttribution; import org.eclipse.qvtd.pivot.qvtimperative.attributes.MappingCallBindingAttribution; import org.eclipse.qvtd.pivot.qvtimperative.attributes.MappingLoopAttribution; +import org.eclipse.qvtd.pivot.qvtimperative.attributes.SetStatementAttribution; import org.eclipse.qvtd.pivot.qvtimperative.attributes.QVTimperativeBottomPatternAttribution; import org.eclipse.qvtd.pivot.qvtimperative.attributes.QVTimperativeGuardPatternAttribution; @@ -32,5 +33,6 @@ public class QVTimperativePivotScoping registry.put(QVTimperativePackage.Literals.MAPPING, MappingAttribution.INSTANCE); registry.put(QVTimperativePackage.Literals.MAPPING_CALL_BINDING, MappingCallBindingAttribution.INSTANCE); registry.put(QVTimperativePackage.Literals.MAPPING_LOOP, MappingLoopAttribution.INSTANCE); + registry.put(QVTimperativePackage.Literals.SET_STATEMENT, SetStatementAttribution.INSTANCE); } } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/AssignmentComparator.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/AssignmentComparator.java index a14d33486..5f777de17 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/AssignmentComparator.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/AssignmentComparator.java @@ -21,14 +21,12 @@ import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Variable; import org.eclipse.ocl.pivot.VariableDeclaration; import org.eclipse.ocl.pivot.VariableExp; import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.ocl.pivot.utilities.TreeIterable; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; /** @@ -45,29 +43,8 @@ public class AssignmentComparator implements Comparator<@NonNull Assignment> @Override public int compare(@NonNull Assignment o1, @NonNull Assignment o2) { - if (o1 instanceof PropertyAssignment) { - if (o2 instanceof PropertyAssignment) { - Property p1 = ((PropertyAssignment)o1).getTargetProperty(); - Property p2 = ((PropertyAssignment)o2).getTargetProperty(); - String n1 = p1.getName(); - String n2 = p2.getName(); - int diff = ClassUtil.safeCompareTo(n1, n2); - if (diff != 0) { - return diff; - } - n1 = p1.toString(); - n2 = p2.toString(); - return ClassUtil.safeCompareTo(n1, n2); - } - else { - return 1; - } - } - else if (o1 instanceof VariableAssignment) { - if (o2 instanceof PropertyAssignment) { - return -1; - } - else if (o2 instanceof VariableAssignment) { + if (o1 instanceof VariableAssignment) { + if (o2 instanceof VariableAssignment) { Map<@NonNull Variable, @NonNull Set<@NonNull Variable>> variable2referencedVariables2 = variable2referencedVariables; if (variable2referencedVariables2 == null) { variable2referencedVariables2 = variable2referencedVariables = computeReferencedVariableClosure(); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeHelper.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeHelper.java index 22e28964e..ca5041ea0 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeHelper.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeHelper.java @@ -20,11 +20,9 @@ import org.eclipse.ocl.pivot.utilities.EnvironmentFactory; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseHelper; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativeFactory; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; /** @@ -52,23 +50,6 @@ public class QVTimperativeHelper extends QVTbaseHelper return asVariable; } - public @NonNull NavigationAssignment createNavigationAssignment(@NonNull OCLExpression asSlotExpression, @NonNull Property asProperty, @NonNull OCLExpression asValueExpression) { - NavigationAssignment asNavigationAssignment; - if (asProperty.isIsImplicit()) { - OppositePropertyAssignment asPropertyAssignment = QVTimperativeFactory.eINSTANCE.createOppositePropertyAssignment(); - asPropertyAssignment.setTargetProperty(asProperty.getOpposite()); - asNavigationAssignment = asPropertyAssignment; - } - else { - PropertyAssignment asPropertyAssignment = QVTimperativeFactory.eINSTANCE.createPropertyAssignment(); - asPropertyAssignment.setTargetProperty(asProperty); - asNavigationAssignment = asPropertyAssignment; - } - asNavigationAssignment.setSlotExpression(asSlotExpression); - asNavigationAssignment.setValue(asValueExpression); - return asNavigationAssignment; - } - public @NonNull RealizedVariable createRealizedVariable(@NonNull String name, @NonNull Type type) { RealizedVariable realizedVariable = QVTimperativeFactory.eINSTANCE.createRealizedVariable(); realizedVariable.setName(name); @@ -77,6 +58,10 @@ public class QVTimperativeHelper extends QVTbaseHelper return realizedVariable; } + public @NonNull SetStatement createSetStatement(@NonNull Variable asVariable, @NonNull Property asProperty, @NonNull OCLExpression asValueExpression) { + return QVTimperativeUtil.createSetStatement(asVariable, asProperty, asValueExpression); + } + public @NonNull VariableAssignment createVariableAssignment(@NonNull Variable asVariable, @NonNull OCLExpression asValueExpression) { VariableAssignment asVariableAssignment = QVTimperativeFactory.eINSTANCE.createVariableAssignment(); asVariableAssignment.setTargetVariable(asVariable); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativePrettyPrintVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativePrettyPrintVisitor.java index e9baec9b8..75ede3489 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativePrettyPrintVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativePrettyPrintVisitor.java @@ -22,6 +22,7 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbasePrettyPrintVisitor; import org.eclipse.qvtd.pivot.qvtimperative.Area; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; @@ -34,10 +35,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; @@ -89,6 +88,11 @@ public class QVTimperativePrettyPrintVisitor extends QVTbasePrettyPrintVisitor i } @Override + public Object visitBottomStatement(@NonNull BottomStatement object) { + return visitStatement(object); + } + + @Override public Object visitConnectionAssignment(@NonNull ConnectionAssignment asConnectionAssignment) { context.appendName(asConnectionAssignment.getTargetVariable()); context.append(" += "); @@ -215,33 +219,12 @@ public class QVTimperativePrettyPrintVisitor extends QVTbasePrettyPrintVisitor i } @Override - public Object visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) { - safeVisit(asNavigationAssignment.getSlotExpression()); - context.append("."); - context.appendName(QVTimperativeUtil.getTargetProperty(asNavigationAssignment)); - context.append(" := "); - safeVisit(asNavigationAssignment.getValue()); - context.append(";\n"); - return null; - } - - @Override - public Object visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment asNavigationAssignment) { - return visitNavigationAssignment(asNavigationAssignment); - } - - @Override public Object visitPredicate(@NonNull Predicate pPredicate) { safeVisit(pPredicate.getConditionExpression()); return null; } @Override - public Object visitPropertyAssignment(@NonNull PropertyAssignment asNavigationAssignment) { - return visitNavigationAssignment(asNavigationAssignment); - } - - @Override public Object visitRealizedVariable(@NonNull RealizedVariable pRealizedVariable) { context.append("realize "); visitVariable(pRealizedVariable); @@ -249,6 +232,18 @@ public class QVTimperativePrettyPrintVisitor extends QVTbasePrettyPrintVisitor i } @Override + public Object visitSetStatement(@NonNull SetStatement asSetStatement) { + context.append("set "); + safeVisit(asSetStatement.getSlotExpression()); + context.append("."); + context.appendName(QVTimperativeUtil.getTargetProperty(asSetStatement)); + context.append(" := "); + safeVisit(asSetStatement.getValue()); + context.append(";\n"); + return null; + } + + @Override public Object visitStatement(@NonNull Statement object) { return visiting(object); } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeToStringVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeToStringVisitor.java index 9f5313401..a9e7abd71 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeToStringVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeToStringVisitor.java @@ -19,6 +19,7 @@ import org.eclipse.ocl.pivot.utilities.ToStringVisitor; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseToStringVisitor; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; @@ -31,11 +32,9 @@ import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; @@ -88,6 +87,11 @@ public class QVTimperativeToStringVisitor extends QVTbaseToStringVisitor impleme } @Override + public String visitBottomStatement(@NonNull BottomStatement object) { + return visitStatement(object); + } + + @Override public @Nullable String visitConnectionAssignment(@NonNull ConnectionAssignment connectionAssignment) { appendName(connectionAssignment.getTargetVariable()); append(" += "); @@ -182,33 +186,24 @@ public class QVTimperativeToStringVisitor extends QVTbaseToStringVisitor impleme @Override public @Nullable String visitMappingStatement(@NonNull MappingStatement object) { - return null; + return visitStatement(object); } @Override - public String visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) { - safeVisit(asNavigationAssignment.getSlotExpression()); - append("."); - appendName(QVTimperativeUtil.getTargetProperty(asNavigationAssignment)); - append(" := "); - safeVisit(asNavigationAssignment.getValue()); + public String visitRealizedVariable(@NonNull RealizedVariable variable) { + // append("realized "); + visitVariable(variable); return null; } @Override - public String visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment asNavigationAssignment) { - return visitNavigationAssignment(asNavigationAssignment); - } - - @Override - public String visitPropertyAssignment(@NonNull PropertyAssignment asNavigationAssignment) { - return visitNavigationAssignment(asNavigationAssignment); - } - - @Override - public String visitRealizedVariable(@NonNull RealizedVariable variable) { - // append("realized "); - visitVariable(variable); + public String visitSetStatement(@NonNull SetStatement asSetStatement) { + append("set "); + safeVisit(asSetStatement.getSlotExpression()); + append("."); + appendName(QVTimperativeUtil.getTargetProperty(asSetStatement)); + append(" := "); + safeVisit(asSetStatement.getValue()); return null; } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java index 3fea951d7..e0b11f954 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/utilities/QVTimperativeUtil.java @@ -49,18 +49,16 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory.Create import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtimperative.Area; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativeFactory; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory; @@ -205,14 +203,6 @@ public class QVTimperativeUtil extends QVTbaseUtil return property; } - public static @NonNull PropertyAssignment createPropertyAssignment(@NonNull OCLExpression slotExpression, @NonNull Property targetProperty, @NonNull OCLExpression value) { - PropertyAssignment propertyAssignment = QVTimperativeFactory.eINSTANCE.createPropertyAssignment(); - propertyAssignment.setSlotExpression(slotExpression); - propertyAssignment.setTargetProperty(targetProperty); - propertyAssignment.setValue(value); - return propertyAssignment; - } - /* public static @NonNull PropertyCallExp createPropertyCallExp(@NonNull OCLExpression source, @NonNull Property property) { PropertyCallExp propertyCallExp = PivotFactory.eINSTANCE.createPropertyCallExp(); propertyCallExp.setOwnedSource(source); @@ -229,6 +219,21 @@ public class QVTimperativeUtil extends QVTbaseUtil return realizedVariable; } + public static @NonNull SetStatement createSetStatement(@NonNull Variable asVariable, @NonNull Property asProperty, @NonNull OCLExpression asValueExpression) { + SetStatement asSetAssignment = QVTimperativeFactory.eINSTANCE.createSetStatement(); + if (asProperty.isIsImplicit()) { + asSetAssignment.setTargetProperty(asProperty.getOpposite()); + asSetAssignment.setIsOpposite(true); + } + else { + asSetAssignment.setTargetProperty(asProperty); + asSetAssignment.setIsOpposite(false); + } + asSetAssignment.setSlotExpression(createVariableExp(asVariable)); + asSetAssignment.setValue(asValueExpression); + return asSetAssignment; + } + public static @NonNull Transformation createTransformation(@NonNull String name) { Transformation transformation = QVTbaseFactory.eINSTANCE.createTransformation(); transformation.setName(name); @@ -295,15 +300,9 @@ public class QVTimperativeUtil extends QVTbaseUtil return (ImperativeDomain)getDomain((Rule)rule, typedModel); } - public static @NonNull Property getTargetProperty(@NonNull NavigationAssignment asNavigationAssignment) { - if (asNavigationAssignment instanceof PropertyAssignment) { - return ClassUtil.nonNullState(((PropertyAssignment)asNavigationAssignment).getTargetProperty()); - } - else if (asNavigationAssignment instanceof OppositePropertyAssignment) { - Property referredProperty = ClassUtil.nonNullState(((OppositePropertyAssignment)asNavigationAssignment).getTargetProperty()); - return ClassUtil.nonNullState(referredProperty.getOpposite()); - } - throw new UnsupportedOperationException("Unsupported " + asNavigationAssignment.eClass().getName()); + public static @NonNull Property getTargetProperty(@NonNull SetStatement asSetStatement) { + Property referredProperty = ClassUtil.nonNullState(asSetStatement.getTargetProperty()); + return asSetStatement.isIsOpposite() ? ClassUtil.nonNullState(referredProperty.getOpposite()) : referredProperty; } public static @Nullable TypedModel getTypedModel(@Nullable Area area) { diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/icons/PropertyAssignment.gif b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/icons/SetStatement.gif Binary files differindex 085b712fb..085b712fb 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/icons/PropertyAssignment.gif +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/icons/SetStatement.gif diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/labeling/QVTimperativeLabelProvider.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/labeling/QVTimperativeLabelProvider.java index 906763cd7..c359486af 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/labeling/QVTimperativeLabelProvider.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/labeling/QVTimperativeLabelProvider.java @@ -28,8 +28,8 @@ import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.xtext.qvtbase.ui.labeling.QVTbaseLabelProvider; import org.eclipse.qvtd.xtext.qvtimperativecs.DomainCS; @@ -91,8 +91,8 @@ public class QVTimperativeLabelProvider extends QVTbaseLabelProvider return "MappingCallBinding.gif"; } - protected String image(PropertyAssignment ele) { - return QVTIMPERATIVE_UI_ICONS + "PropertyAssignment.gif"; + protected String image(SetStatement ele) { + return QVTIMPERATIVE_UI_ICONS + "SetStatement.gif"; } protected String image(RealizedVariable ele) { @@ -147,7 +147,7 @@ public class QVTimperativeLabelProvider extends QVTbaseLabelProvider return "«predicate»"; } - protected String text(PropertyAssignment ele) { + protected String text(SetStatement ele) { assert ele != null; Namespace namespace = PivotUtil.getNamespace(ele.eContainer()); if (namespace == null) { diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/outline/QVTimperativeOutlineTreeProvider.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/outline/QVTimperativeOutlineTreeProvider.java index 8ae0a14e9..d4a71f168 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/outline/QVTimperativeOutlineTreeProvider.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative.ui/src/org/eclipse/qvtd/xtext/qvtimperative/ui/outline/QVTimperativeOutlineTreeProvider.java @@ -20,7 +20,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.xtext.qvtbase.ui.outline.QVTbaseOutlineTreeProvider; import org.eclipse.qvtd.xtext.qvtimperativecs.DirectionCS; @@ -77,7 +77,7 @@ public class QVTimperativeOutlineTreeProvider extends QVTbaseOutlineTreeProvider } } - protected void _createChildren(IOutlineNode parentNode, PropertyAssignment ele) { + protected void _createChildren(IOutlineNode parentNode, SetStatement ele) { createNode(parentNode, ele.getValue()); } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/as2cs/QVTimperativeDeclarationVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/as2cs/QVTimperativeDeclarationVisitor.java index 96b2d7e44..94317c5ea 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/as2cs/QVTimperativeDeclarationVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/as2cs/QVTimperativeDeclarationVisitor.java @@ -58,7 +58,6 @@ import org.eclipse.ocl.xtext.basecs.RootPackageCS; import org.eclipse.ocl.xtext.basecs.TypedRefCS; import org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSPackage; import org.eclipse.ocl.xtext.essentialoclcs.ExpCS; -import org.eclipse.ocl.xtext.essentialoclcs.NameExpCS; import org.eclipse.ocl.xtext.essentialoclcs.VariableCS; import org.eclipse.qvtd.pivot.qvtbase.BaseModel; import org.eclipse.qvtd.pivot.qvtbase.Domain; @@ -73,22 +72,21 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtimperative.Area; import org.eclipse.qvtd.pivot.qvtimperative.Assignment; import org.eclipse.qvtd.pivot.qvtimperative.BottomPattern; +import org.eclipse.qvtd.pivot.qvtimperative.BottomStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionAssignment; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; -import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativeDomain; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; +import org.eclipse.qvtd.pivot.qvtimperative.ImperativePattern; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.NavigationAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.OppositePropertyAssignment; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; @@ -114,6 +112,7 @@ import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateOrAssignmentCS; import org.eclipse.qvtd.xtext.qvtimperativecs.QVTimperativeCSPackage; import org.eclipse.qvtd.xtext.qvtimperativecs.QueryCS; import org.eclipse.qvtd.xtext.qvtimperativecs.RealizedVariableCS; +import org.eclipse.qvtd.xtext.qvtimperativecs.SetStatementCS; import org.eclipse.qvtd.xtext.qvtimperativecs.StatementCS; import org.eclipse.qvtd.xtext.qvtimperativecs.TopLevelCS; import org.eclipse.qvtd.xtext.qvtimperativecs.TransformationCS; @@ -396,6 +395,11 @@ public class QVTimperativeDeclarationVisitor extends QVTbaseDeclarationVisitor i } @Override + public ElementCS visitBottomStatement(@NonNull BottomStatement object) { + return visitStatement(object); + } + + @Override public ElementCS visitConnectionAssignment(@NonNull ConnectionAssignment asConnectionAssignment) { PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTimperativeCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asConnectionAssignment); csAssignment.setPivot(asConnectionAssignment); @@ -590,22 +594,6 @@ public class QVTimperativeDeclarationVisitor extends QVTbaseDeclarationVisitor i } @Override - public ElementCS visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) { - PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTimperativeCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asNavigationAssignment); - ExpCS csSlotExp = createExpCS(asNavigationAssignment.getSlotExpression()); - NameExpCS csPropName = createNameExpCS(QVTimperativeUtil.getTargetProperty(asNavigationAssignment)); - csAssignment.setOwnedTarget(createInfixExpCS(csSlotExp, ".", csPropName)); - csAssignment.setOwnedInitExpression(createExpCS(asNavigationAssignment.getValue())); - csAssignment.setIsDefault(asNavigationAssignment.isIsDefault()); - return csAssignment; - } - - @Override - public ElementCS visitOppositePropertyAssignment(@NonNull OppositePropertyAssignment asNavigationAssignment) { - return visitNavigationAssignment(asNavigationAssignment); - } - - @Override public ElementCS visitPackage(org.eclipse.ocl.pivot.@NonNull Package asPackage) { // List<org.eclipse.ocl.pivot.@NonNull Class> asClasses = ClassUtil.nullFree(asPackage.getOwnedClasses()); // List<org.eclipse.ocl.pivot.@NonNull Package> asPackages = ClassUtil.nullFree(asPackage.getOwnedPackages()); @@ -660,18 +648,6 @@ public class QVTimperativeDeclarationVisitor extends QVTbaseDeclarationVisitor i } @Override - public ElementCS visitPropertyAssignment(@NonNull PropertyAssignment asPropertyAssignment) { - PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTimperativeCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asPropertyAssignment); - csAssignment.setPivot(asPropertyAssignment); - ExpCS csSlotExp = createExpCS(asPropertyAssignment.getSlotExpression()); - NameExpCS csPropName = createNameExpCS(asPropertyAssignment.getTargetProperty()); - csAssignment.setOwnedTarget(createInfixExpCS(csSlotExp, ".", csPropName)); - csAssignment.setOwnedInitExpression(createExpCS(asPropertyAssignment.getValue())); - csAssignment.setIsDefault(asPropertyAssignment.isIsDefault()); - return csAssignment; - } - - @Override public ElementCS visitRealizedVariable(@NonNull RealizedVariable asRealizedVariable) { RealizedVariableCS csRealizedVariable = context.refreshNamedElement(RealizedVariableCS.class, QVTimperativeCSPackage.Literals.REALIZED_VARIABLE_CS, asRealizedVariable); csRealizedVariable.setPivot(asRealizedVariable); @@ -686,6 +662,15 @@ public class QVTimperativeDeclarationVisitor extends QVTbaseDeclarationVisitor i } @Override + public ElementCS visitSetStatement(@NonNull SetStatement asSetStatement) { + SetStatementCS csStatement = context.refreshElement(SetStatementCS.class, QVTimperativeCSPackage.Literals.SET_STATEMENT_CS, asSetStatement); + csStatement.setReferredVariable((Variable) asSetStatement.getSlotExpression().getReferredVariable()); + csStatement.setReferredProperty(QVTimperativeUtil.getTargetProperty(asSetStatement)); + csStatement.setOwnedInitExpression(createExpCS(asSetStatement.getValue())); + return csStatement; + } + + @Override public ElementCS visitStatement(@NonNull Statement object) { return visiting(object); } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSContainmentVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSContainmentVisitor.java index e5f2f52ee..0604e4e29 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSContainmentVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSContainmentVisitor.java @@ -58,10 +58,10 @@ import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; import org.eclipse.qvtd.pivot.qvtimperative.MappingStatement; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativeFactory; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.Statement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.xtext.qvtimperativecs.BottomPatternCS; @@ -77,6 +77,7 @@ import org.eclipse.qvtd.xtext.qvtimperativecs.ParamDeclarationCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PatternCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateOrAssignmentCS; +import org.eclipse.qvtd.xtext.qvtimperativecs.SetStatementCS; import org.eclipse.qvtd.xtext.qvtimperativecs.QueryCS; import org.eclipse.qvtd.xtext.qvtimperativecs.RealizedVariableCS; import org.eclipse.qvtd.xtext.qvtimperativecs.TopLevelCS; @@ -356,7 +357,7 @@ public class QVTimperativeCSContainmentVisitor extends AbstractQVTimperativeCSCo } } else { - context.refreshModelElement(PropertyAssignment.class, QVTimperativePackage.Literals.PROPERTY_ASSIGNMENT, csElement); + throw new IllegalStateException(); } return null; } @@ -381,6 +382,12 @@ public class QVTimperativeCSContainmentVisitor extends AbstractQVTimperativeCSCo } @Override + public @Nullable Continuation<?> visitSetStatementCS(@NonNull SetStatementCS csElement) { + context.refreshModelElement(SetStatement.class, QVTimperativePackage.Literals.SET_STATEMENT, csElement); + return null; + } + + @Override public Continuation<?> visitTopLevelCS(@NonNull TopLevelCS csElement) { importPackages(csElement); @NonNull ImperativeModel asModel = refreshRoot(ImperativeModel.class, QVTimperativePackage.Literals.IMPERATIVE_MODEL, csElement); diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPostOrderVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPostOrderVisitor.java index 0b77eafbd..38b164cbb 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPostOrderVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPostOrderVisitor.java @@ -18,6 +18,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CollectionType; import org.eclipse.ocl.pivot.NavigationCallExp; import org.eclipse.ocl.pivot.OCLExpression; +import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.Variable; import org.eclipse.ocl.pivot.VariableExp; @@ -41,9 +42,9 @@ import org.eclipse.qvtd.pivot.qvtimperative.GuardPattern; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.MappingLoop; -import org.eclipse.qvtd.pivot.qvtimperative.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativeFactory; import org.eclipse.qvtd.pivot.qvtimperative.RealizedVariable; +import org.eclipse.qvtd.pivot.qvtimperative.SetStatement; import org.eclipse.qvtd.pivot.qvtimperative.VariableAssignment; import org.eclipse.qvtd.pivot.qvtimperative.VariablePredicate; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; @@ -60,6 +61,7 @@ import org.eclipse.qvtd.xtext.qvtimperativecs.ParamDeclarationCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PatternCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateOrAssignmentCS; +import org.eclipse.qvtd.xtext.qvtimperativecs.SetStatementCS; import org.eclipse.qvtd.xtext.qvtimperativecs.QueryCS; import org.eclipse.qvtd.xtext.qvtimperativecs.RealizeableVariableCS; import org.eclipse.qvtd.xtext.qvtimperativecs.RealizedVariableCS; @@ -94,7 +96,7 @@ public class QVTimperativeCSPostOrderVisitor extends AbstractQVTimperativeCSPost super(context); } - protected @Nullable Assignment refreshPropertyAssignment(@NonNull NavigationCallExp propertyCallExp, @NonNull PredicateOrAssignmentCS csConstraint) { + /* protected @Nullable Statement refreshPropertyAssignment(@NonNull NavigationCallExp propertyCallExp, @NonNull PredicateOrAssignmentCS csConstraint) { @Nullable PropertyAssignment propertyAssignment; // Property referredProperty = propertyCallExp.getReferredProperty(); // Property oppositeProperty = referredProperty.getOpposite(); @@ -110,7 +112,7 @@ public class QVTimperativeCSPostOrderVisitor extends AbstractQVTimperativeCSPost // propertyAssignment.setIsOpposite(target instanceof FeatureCallExp); // FIXME isOpposite } return propertyAssignment; - } + } */ protected @Nullable Assignment refreshVariableAssignment(@NonNull VariableExp variableExp, @NonNull PredicateOrAssignmentCS csConstraint) { Assignment assignment = PivotUtil.getPivot(Assignment.class, csConstraint); @@ -146,7 +148,8 @@ public class QVTimperativeCSPostOrderVisitor extends AbstractQVTimperativeCSPost if (csInitialiser != null) { Assignment assignment = null; if (target instanceof NavigationCallExp) { - assignment = refreshPropertyAssignment((NavigationCallExp)target, csConstraint); + throw new IllegalStateException(); + // assignment = refreshPropertyAssignment((NavigationCallExp)target, csConstraint); } else if (target instanceof VariableExp) { assignment = refreshVariableAssignment((VariableExp)target, csConstraint); @@ -351,6 +354,23 @@ public class QVTimperativeCSPostOrderVisitor extends AbstractQVTimperativeCSPost } @Override + public Continuation<?> visitSetStatementCS(@NonNull SetStatementCS csElement) { + SetStatement setStatement = PivotUtil.getPivot(SetStatement.class, csElement); + if (setStatement != null) { + Variable targetVariable = csElement.getReferredVariable(); + setStatement.setSlotExpression(PivotUtil.createVariableExp(targetVariable)); + Property targetProperty = csElement.getReferredProperty(); + ExpCS csInitialiser = csElement.getOwnedInitExpression(); + OCLExpression target = csInitialiser != null ? context.visitLeft2Right(OCLExpression.class, csInitialiser) : null; + setStatement.setTargetProperty(targetProperty); + // propertyAssignment.setIsOpposite(target instanceof FeatureCallExp); // FIXME isOpposite + setStatement.setValue(target); + // pAssignments.add(assignment); + } + return null; + } + + @Override public Continuation<?> visitTopLevelCS(@NonNull TopLevelCS object) { return null; } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPreOrderVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPreOrderVisitor.java index e2e54890e..afecec058 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPreOrderVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/cs2as/QVTimperativeCSPreOrderVisitor.java @@ -52,6 +52,7 @@ import org.eclipse.qvtd.xtext.qvtimperativecs.MappingLoopCS; import org.eclipse.qvtd.xtext.qvtimperativecs.ParamDeclarationCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateCS; import org.eclipse.qvtd.xtext.qvtimperativecs.PredicateOrAssignmentCS; +import org.eclipse.qvtd.xtext.qvtimperativecs.SetStatementCS; import org.eclipse.qvtd.xtext.qvtimperativecs.QueryCS; import org.eclipse.qvtd.xtext.qvtimperativecs.RealizeableVariableCS; import org.eclipse.qvtd.xtext.qvtimperativecs.TopLevelCS; @@ -291,6 +292,11 @@ public class QVTimperativeCSPreOrderVisitor extends AbstractQVTimperativeCSPreOr } @Override + public Continuation<?> visitSetStatementCS(@NonNull SetStatementCS csElement) { + return null; + } + + @Override public Continuation<?> visitTopLevelCS(@NonNull TopLevelCS csElement) { return null; } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/formatting/QVTimperativeFormatter.java b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/formatting/QVTimperativeFormatter.java index a3a76420c..f4e4ecdc6 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/formatting/QVTimperativeFormatter.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtimperative/src/org/eclipse/qvtd/xtext/qvtimperative/formatting/QVTimperativeFormatter.java @@ -29,6 +29,7 @@ import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess. import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.QueryCSElements; import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.RealizedVariableCSElements; import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.ScopeNameCSElements; +import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.SetStatementCSElements; import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.SourceBottomPatternCSElements; import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.SourceDomainCSElements; import org.eclipse.qvtd.xtext.qvtimperative.services.QVTimperativeGrammarAccess.SourceGuardPatternCSElements; @@ -222,8 +223,8 @@ public class QVTimperativeFormatter extends AbstractEssentialOCLFormatter MappingCSElements a = f.getMappingCSAccess(); c.setLinewrap(2).before(a.getMapKeyword_2()); c.setNoSpace().before(a.getSemicolonKeyword_6_2()); - c.setNoSpace().between(a.getLeftCurlyBracketKeyword_7(), a.getRightCurlyBracketKeyword_11()); - setBraces(c, a.getLeftCurlyBracketKeyword_7(), a.getRightCurlyBracketKeyword_11()); + c.setNoSpace().between(a.getLeftCurlyBracketKeyword_7(), a.getRightCurlyBracketKeyword_12()); + setBraces(c, a.getLeftCurlyBracketKeyword_7(), a.getRightCurlyBracketKeyword_12()); // c.setLinewrap(2).between(a.getDomainsAssignment_5(), a.getDomainsAssignment_5()); c.setLinewrap(1).before(a.getOwnedDomainsAssignment_8()); c.setLinewrap(1).before(a.getWhereKeyword_9_0()); @@ -337,6 +338,11 @@ public class QVTimperativeFormatter extends AbstractEssentialOCLFormatter c.setNoSpace().around(a.getColonColonKeyword_2_1()); } { + SetStatementCSElements a = f.getSetStatementCSAccess(); + c.setLinewrap(1).before(a.getSetKeyword_0()); + c.setNoSpace().before(a.getSemicolonKeyword_6()); + } + { SourceBottomPatternCSElements a = f.getSourceBottomPatternCSAccess(); c.setNoLinewrap().before(a.getLeftCurlyBracketKeyword_1()); c.setLinewrap().after(a.getLeftCurlyBracketKeyword_1()); diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java index 7bf996340..8eab30e06 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java @@ -444,6 +444,7 @@ public class QVTiInterpreterTests extends LoadTestCase public void testClassesCS2AS_bug456900() throws Exception { MyQVT myQVT = createQVT(); QVTiEnvironmentFactory environmentFactory = myQVT.getEnvironmentFactory(); + environmentFactory.setEvaluationTracingEnabled(true); MyQvtiExecutor testEvaluator = new MyQvtiExecutor(environmentFactory, "ClassesCS2AS/bug456900", "ClassesCS2AS.qvti"); testEvaluator.saveTransformation(null); testEvaluator.loadModel("leftCS", "example_input.xmi"); |