diff options
author | Ed Willink | 2016-11-17 20:44:45 +0000 |
---|---|---|
committer | Ed Willink | 2016-11-17 20:44:45 +0000 |
commit | 05ff46c48bfa221e548e85c0dcdb19c8453bd896 (patch) | |
tree | 12f9b5b315b6e708ffdff7ef7987bd157d9b84d2 | |
parent | df0cff81fb09a5b3620a06674e5036706f9ab3f0 (diff) | |
download | org.eclipse.qvtd-05ff46c48bfa221e548e85c0dcdb19c8453bd896.tar.gz org.eclipse.qvtd-05ff46c48bfa221e548e85c0dcdb19c8453bd896.tar.xz org.eclipse.qvtd-05ff46c48bfa221e548e85c0dcdb19c8453bd896.zip |
[507702] Support semantically distinct derived Variable classes
23 files changed, 325 insertions, 221 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/common/AbstractQVTc2QVTc.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/common/AbstractQVTc2QVTc.java index ad678038f..bbdb6bb77 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/common/AbstractQVTc2QVTc.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/common/AbstractQVTc2QVTc.java @@ -36,6 +36,7 @@ import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.OperationCallExp; import org.eclipse.ocl.pivot.Package; import org.eclipse.ocl.pivot.Parameter; +import org.eclipse.ocl.pivot.ParameterVariable; import org.eclipse.ocl.pivot.PivotFactory; import org.eclipse.ocl.pivot.PivotPackage; import org.eclipse.ocl.pivot.Property; @@ -57,9 +58,11 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; @@ -178,6 +181,15 @@ public abstract class AbstractQVTc2QVTc } @Override + public @NonNull BottomVariable visitBottomVariable(@NonNull BottomVariable vIn) { + BottomVariable vOut = QVTcoreFactory.eINSTANCE.createBottomVariable(); + context.addTrace(vIn, vOut); + vOut.setName(vIn.getName()); + createAll(vIn.getOwnedComments(), vOut.getOwnedComments()); + return vOut; + } + + @Override public @Nullable Element visitComment(@NonNull Comment cIn) { Comment cOut = PivotFactory.eINSTANCE.createComment(); context.addTrace(cIn, cOut); @@ -248,6 +260,15 @@ public abstract class AbstractQVTc2QVTc } @Override + public @NonNull GuardVariable visitGuardVariable(@NonNull GuardVariable vIn) { + GuardVariable vOut = QVTcoreFactory.eINSTANCE.createGuardVariable(); + context.addTrace(vIn, vOut); + vOut.setName(vIn.getName()); + createAll(vIn.getOwnedComments(), vOut.getOwnedComments()); + return vOut; + } + + @Override public @Nullable Element visitImport(@NonNull Import iIn) { Import iOut = context.createImport(iIn); createAll(iIn.getOwnedComments(), iOut.getOwnedComments()); @@ -293,6 +314,15 @@ public abstract class AbstractQVTc2QVTc } @Override + public @NonNull ParameterVariable visitParameterVariable(@NonNull ParameterVariable vIn) { + ParameterVariable vOut = PivotFactory.eINSTANCE.createParameterVariable(); + context.addTrace(vIn, vOut); + vOut.setName(vIn.getName()); + createAll(vIn.getOwnedComments(), vOut.getOwnedComments()); + return vOut; + } + + @Override public @Nullable Element visitPredicate(@NonNull Predicate pIn) { Predicate pOut = QVTbaseFactory.eINSTANCE.createPredicate(); context.addTrace(pIn, pOut); @@ -353,15 +383,6 @@ public abstract class AbstractQVTc2QVTc } @Override - public @NonNull Variable visitVariable(@NonNull Variable vIn) { - Variable vOut = PivotFactory.eINSTANCE.createVariable(); - context.addTrace(vIn, vOut); - vOut.setName(vIn.getName()); - createAll(vIn.getOwnedComments(), vOut.getOwnedComments()); - return vOut; - } - - @Override public @Nullable Element visitVariableAssignment(@NonNull VariableAssignment vaIn) { VariableAssignment vaOut = QVTcoreFactory.eINSTANCE.createVariableAssignment(); context.addTrace(vaIn, vaOut); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtc2qvtu/QVTc2QVTu.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtc2qvtu/QVTc2QVTu.java index d7b54d3f5..95a3b4e05 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtc2qvtu/QVTc2QVTu.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtc2qvtu/QVTc2QVTu.java @@ -44,6 +44,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtcore.Area; import org.eclipse.qvtd.pivot.qvtcore.Assignment; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; @@ -450,7 +451,7 @@ public class QVTc2QVTu extends AbstractQVTc2QVTc public @NonNull Variable visitRealizedVariable(@NonNull RealizedVariable rvIn) { Area aIn = getContainingArea(rvIn); if (isInputDomain(aIn)) { - Variable vOut = PivotFactory.eINSTANCE.createVariable(); + BottomVariable vOut = QVTcoreFactory.eINSTANCE.createBottomVariable(); assert vOut != null; context.addTrace(rvIn, vOut); vOut.setName(rvIn.getName()); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/IsConstantExpressionVisitor.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/IsConstantExpressionVisitor.java index d320d4a66..ddce15e9e 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/IsConstantExpressionVisitor.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtp2qvts/IsConstantExpressionVisitor.java @@ -11,7 +11,6 @@ package org.eclipse.qvtd.compiler.internal.qvtp2qvts; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; @@ -36,41 +35,44 @@ import org.eclipse.ocl.pivot.TupleLiteralPart; import org.eclipse.ocl.pivot.TypeExp; import org.eclipse.ocl.pivot.Variable; import org.eclipse.ocl.pivot.VariableExp; -import org.eclipse.ocl.pivot.util.AbstractExtendingVisitor; import org.eclipse.ocl.pivot.util.Visitable; +import org.eclipse.ocl.pivot.utilities.PivotUtil; +import org.eclipse.qvtd.pivot.qvtcore.util.AbstractExtendingQVTcoreVisitor; + +import com.google.common.collect.Iterables; /** * The INSTANCE of the IsConstantExpressionVisitor visits an expression tree to determine whether * the tree evaluates to an unconditionally constant value. - * - * Any use of a VariableExp with an indeterminate initializer causes a non-constant verdict. - * + * + * Any use of a VariableExp with an indeterminate initializer causes a non-constant verdict. + * * Use of a LoopExp iterator within its loop is constant, provided the loop source is constant. - * + * * Use of NavigationCallExp is constant, provided the navigation source is constant. - * + * * Use of OperationCallExp is constant, provided the source and arguments are constant; OCL has only queries. */ -public class IsConstantExpressionVisitor extends AbstractExtendingVisitor<Boolean, Object> +public class IsConstantExpressionVisitor extends AbstractExtendingQVTcoreVisitor<@NonNull Boolean, @Nullable Object> { /** * Objects (variables) asserted to be constant by the caller. */ - protected final @Nullable Set<Object> knownConstants; + protected final @Nullable Set<@NonNull Object> knownConstants; /** * Objects (variables) asserted to be constant by the caller or effectively constant as a consequence * of use within an iteration. */ - private /*@LazyNonNull*/ Set<Object> myConstants = null; + private /*@LazyNonNull*/ Set<@NonNull Object> myConstants = null; /** * Construct an IsConstantExpressionVisitor that may be used to determine whether expressions * are constant-valued. If knownConstants is provided any references to them are interpreted * as constant-valued. */ - public IsConstantExpressionVisitor(@Nullable Set<Object> knownConstants) { - super(IsConstantExpressionVisitor.class); + public IsConstantExpressionVisitor(@Nullable Set<@NonNull Object> knownConstants) { + super(null); this.knownConstants = knownConstants; } @@ -145,14 +147,14 @@ public class IsConstantExpressionVisitor extends AbstractExtendingVisitor<Boolea } if (myConstants == null) { if (knownConstants != null) { - myConstants = new HashSet<Object>(knownConstants); + myConstants = new HashSet<>(knownConstants); } else { - myConstants = new HashSet<Object>(); + myConstants = new HashSet<>(); } } - List<Variable> ownedIterators = loopExp.getOwnedIterators(); - myConstants.addAll(ownedIterators); + Iterable<@NonNull Variable> ownedIterators = PivotUtil.getOwnedIterators(loopExp); + Iterables.addAll(myConstants, ownedIterators); return isConstant(ownedIterators) && isConstant(loopExp.getOwnedBody()); } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/CoreVariableAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/CoreVariableAnalysis.java index a3a23daf4..7bc560717 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/CoreVariableAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/CoreVariableAnalysis.java @@ -27,7 +27,7 @@ public class CoreVariableAnalysis extends AbstractVariableAnalysis public CoreVariableAnalysis(@NonNull VariablesAnalysis variablesAnalysis, @NonNull String name, @NonNull Type type, @Nullable OCLExpression initValue) { super(variablesAnalysis, name); - this.cVariable = variablesAnalysis.createVariable(this.name, type, true, initValue); + this.cVariable = variablesAnalysis.createBottomVariable(this.name, type, true, initValue); } public CoreVariableAnalysis(@NonNull VariablesAnalysis variablesAnalysis, @NonNull String name, @NonNull Type type) { diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/RelationVariableAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/RelationVariableAnalysis.java index 388cb954f..3aa562557 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/RelationVariableAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/RelationVariableAnalysis.java @@ -32,6 +32,7 @@ import org.eclipse.qvtd.pivot.qvtcore.CorePattern; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.RealizedVariable; import org.eclipse.qvtd.pivot.qvtcore.VariableAssignment; +import org.eclipse.qvtd.pivot.qvtcore.utilities.QVTcoreUtil; import org.eclipse.qvtd.pivot.qvtrelation.Key; import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp; import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; @@ -77,7 +78,7 @@ public class RelationVariableAnalysis extends AbstractVariableAnalysis } } Variable cVariable2 = getCoreVariable(); - List<@NonNull Assignment> cMiddleBottomAssignments = variablesAnalysis.getMiddleBottomPattern().getAssignment(); + List<@NonNull Assignment> cMiddleBottomAssignments = QVTcoreUtil.getOwnedAssignments(variablesAnalysis.getMiddleBottomPattern()); if (!targetProperty.isIsMany() || (cExpression.getType() instanceof CollectionType)) { VariableExp cSlotVariableExp = variablesAnalysis.createVariableExp(cVariable2); NavigationAssignment cAssignment = variablesAnalysis.createNavigationAssignment(cSlotVariableExp, targetProperty, cExpression); @@ -293,12 +294,12 @@ public class RelationVariableAnalysis extends AbstractVariableAnalysis // Type type = ClassUtil.nonNullState(rVariable.getType()); if (isKeyed) { - cVariable2 = variablesAnalysis.createVariable(name, type, true, null); + cVariable2 = variablesAnalysis.createBottomVariable(name, type, true, null); initializeKeyedVariable(cVariable2); cPattern.getVariable().add(cVariable2); } else if (!isRealized) { - cVariable2 = variablesAnalysis.createVariable(name, type, rVariable.isIsRequired(), null); + cVariable2 = variablesAnalysis.createBottomVariable(name, type, rVariable.isIsRequired(), null); cPattern.getVariable().add(cVariable2); } else { diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/VariablesAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/VariablesAnalysis.java index 2125b39dd..5eb7f462e 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/VariablesAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/VariablesAnalysis.java @@ -335,7 +335,7 @@ import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; OCLExpression cExpression = createVariableExp(cVariable); NavigationAssignment cAssignment = createNavigationAssignment(cSlotVariableExp, cTargetProperty, cExpression); QVTr2QVTc.SYNTHESIS.println(" addPropertyAssignment " + cAssignment); - assertNewAssignment(cMiddleBottomPattern.getAssignment(), cAssignment); + assertNewAssignment(QVTcoreUtil.getOwnedAssignments(cMiddleBottomPattern), cAssignment); cMiddleBottomPattern.getAssignment().add(cAssignment); } return cVariable; @@ -350,7 +350,7 @@ import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; } } - public void assertNewAssignment(@NonNull List<@NonNull Assignment> oldAssignments, @NonNull NavigationAssignment newAssignment) { + public void assertNewAssignment(@NonNull Iterable<@NonNull Assignment> oldAssignments, @NonNull NavigationAssignment newAssignment) { // if ("tr.action := sm".equals(newAssignment.toString())) { // newAssignment.toString(); // } @@ -358,7 +358,7 @@ import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; if (newSlotExpression instanceof VariableExp) { VariableDeclaration newVariable = ((VariableExp)newSlotExpression).getReferredVariable(); Property targetProperty = QVTcoreUtil.getTargetProperty(newAssignment); - for (Assignment oldAssignment : oldAssignments) { + for (@NonNull Assignment oldAssignment : oldAssignments) { if (oldAssignment instanceof NavigationAssignment) { if (QVTcoreUtil.getTargetProperty((NavigationAssignment)oldAssignment) == targetProperty) { OCLExpression oldSlotExpression = ((NavigationAssignment)oldAssignment).getSlotExpression(); 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 9ffbbf851..689e4c0f1 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 @@ -222,6 +222,43 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping return newTypedElements; } + private @NonNull Variable createIteratorVariable(@NonNull Variable oldVariable) { + String name = oldVariable.getName(); + assert name != null; + Type type = oldVariable.getType(); + assert type != null; + assert oldVariable.getOwnedInit() == null; + Variable newVariable = helper.createIteratorVariable(name, type, oldVariable.isIsRequired()); + Node variableNode = getNode(oldVariable); + if (variableNode != null) { + node2variable.put(variableNode, newVariable); + } + return newVariable; + } + + private @NonNull List<@NonNull Variable> createIteratorVariables(@NonNull List<@NonNull Variable> oldVariables) { + List<@NonNull Variable> newVariables = new ArrayList<>(oldVariables.size()); + for (@NonNull Variable oldVariable : oldVariables) { + Variable newVariable = createIteratorVariable(oldVariable); + newVariables.add(newVariable); + } + return newVariables; + } + + private @NonNull Variable createLetVariable(@NonNull Variable oldVariable) { + String name = oldVariable.getName(); + assert name != null; + Type type = oldVariable.getType(); + assert type != null; + OCLExpression newInit = ClassUtil.nonNullState(create(oldVariable.getOwnedInit())); + Variable newVariable = helper.createLetVariable(name, type, oldVariable.isIsRequired(), newInit); + Node variableNode = getNode(oldVariable); + if (variableNode != null) { + node2variable.put(variableNode, newVariable); + } + return newVariable; + } + private @NonNull OCLExpression createNonNull(@Nullable OCLExpression oldTypedElement) { assert oldTypedElement != null; Node node = context.getNode(oldTypedElement); @@ -231,16 +268,30 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping return create(node); } - private @NonNull List<@NonNull Variable> createVariables(@NonNull List<@NonNull Variable> oldVariables) { + private @NonNull Variable createResultVariable(@NonNull Variable oldVariable) { + String name = oldVariable.getName(); + assert name != null; + Type type = oldVariable.getType(); + assert type != null; + OCLExpression newInit = ClassUtil.nonNullState(create(oldVariable.getOwnedInit())); + Variable newVariable = helper.createResultVariable(name, type, oldVariable.isIsRequired(), newInit); + Node variableNode = getNode(oldVariable); + if (variableNode != null) { + node2variable.put(variableNode, newVariable); + } + return newVariable; + } + + /* private @NonNull List<@NonNull Variable> createVariables(@NonNull List<@NonNull Variable> oldVariables) { List<@NonNull Variable> newVariables = new ArrayList<>(oldVariables.size()); for (@NonNull Variable oldVariable : oldVariables) { Variable newVariable = createVariable(oldVariable); newVariables.add(newVariable); } return newVariables; - } + } */ - private @NonNull Variable createVariable(@NonNull Variable oldVariable) { + /* private @NonNull Variable createVariable(@NonNull Variable oldVariable) { String name = oldVariable.getName(); assert name != null; Type type = oldVariable.getType(); @@ -251,7 +302,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping node2variable.put(variableNode, newVariable); } return newVariable; - } + } */ public @Nullable OCLExpression getExpression(@NonNull Node node) { if (node.isExplicitNull()) { @@ -375,8 +426,8 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping public @NonNull OCLExpression visitIterateExp(@NonNull IterateExp pIterateExp) { OCLExpression iSource = create(pIterateExp.getOwnedSource()); assert iSource != null; - List<@NonNull ? extends Variable> iIterators = createVariables(ClassUtil.nullFree(pIterateExp.getOwnedIterators())); - Variable result = createVariable(ClassUtil.nonNull(pIterateExp.getOwnedResult())); + List<@NonNull ? extends Variable> iIterators = createIteratorVariables(ClassUtil.nullFree(pIterateExp.getOwnedIterators())); + Variable result = createResultVariable(ClassUtil.nonNull(pIterateExp.getOwnedResult())); Iteration referredIteration = (Iteration) visitor.create(pIterateExp.getReferredIteration()); assert referredIteration != null; OCLExpression iBody = getInlineExpressionCreator().create(pIterateExp.getOwnedBody()); @@ -388,7 +439,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping public @NonNull OCLExpression visitIteratorExp(@NonNull IteratorExp pIteratorExp) { OCLExpression iSource = create(pIteratorExp.getOwnedSource()); assert iSource != null; - List<@NonNull ? extends Variable> iIterators = createVariables(ClassUtil.nullFree(pIteratorExp.getOwnedIterators())); + List<@NonNull ? extends Variable> iIterators = createIteratorVariables(ClassUtil.nullFree(pIteratorExp.getOwnedIterators())); Iteration referredIteration = (Iteration) visitor.create(pIteratorExp.getReferredIteration()); assert referredIteration != null; OCLExpression iBody = getInlineExpressionCreator().create(pIteratorExp.getOwnedBody()); @@ -398,7 +449,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping @Override public @NonNull OCLExpression visitLetExp(@NonNull LetExp pLetExp) { - Variable asVariable = createVariable(ClassUtil.nonNull(pLetExp.getOwnedVariable())); + Variable asVariable = createLetVariable(ClassUtil.nonNull(pLetExp.getOwnedVariable())); OCLExpression asInExpression = create(pLetExp.getOwnedIn()); assert asInExpression != null; return helper.createLetExp(asVariable, asInExpression); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/RootRegion2Mapping.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/RootRegion2Mapping.java index 08edbf696..3ca8ab69d 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/RootRegion2Mapping.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvti/RootRegion2Mapping.java @@ -25,6 +25,7 @@ import org.eclipse.ocl.pivot.CollectionType; import org.eclipse.ocl.pivot.DataType; import org.eclipse.ocl.pivot.InvalidType; import org.eclipse.ocl.pivot.Iteration; +import org.eclipse.ocl.pivot.IteratorVariable; import org.eclipse.ocl.pivot.OCLExpression; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.Property; @@ -36,7 +37,6 @@ import org.eclipse.ocl.pivot.VoidType; import org.eclipse.ocl.pivot.ids.IdResolver; import org.eclipse.ocl.pivot.internal.complete.StandardLibraryInternal; import org.eclipse.ocl.pivot.utilities.NameUtil; -import org.eclipse.ocl.pivot.utilities.PivotUtil; import org.eclipse.qvtd.compiler.internal.qvtp2qvts.Edge; import org.eclipse.qvtd.compiler.internal.qvtp2qvts.NavigableEdge; import org.eclipse.qvtd.compiler.internal.qvtp2qvts.Node; @@ -264,7 +264,7 @@ public class RootRegion2Mapping extends AbstractScheduledRegion2Mapping assert collectionType != null; Type elementType = ((CollectionType)collectionType).getElementType(); assert elementType != null; - @NonNull Variable asIterator = PivotUtil.createVariable("i", elementType, true, null); + @NonNull IteratorVariable asIterator = helper.createIteratorVariable("i", elementType, true); Property child2parentProperty = edge.getProperty().getOpposite(); assert child2parentProperty != null; OCLExpression propertyCallExp = helper.createNavigationCallExp(helper.createVariableExp(asIterator), child2parentProperty); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtu2qvtm/QVTu2QVTm.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtu2qvtm/QVTu2QVTm.java index edebc8bf5..f2199e936 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtu2qvtm/QVTu2QVTm.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtu2qvtm/QVTu2QVTm.java @@ -23,7 +23,6 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CompleteClass; import org.eclipse.ocl.pivot.Element; import org.eclipse.ocl.pivot.OCLExpression; -import org.eclipse.ocl.pivot.PivotFactory; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.Variable; @@ -31,6 +30,7 @@ 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.EnvironmentFactory; +import org.eclipse.ocl.pivot.utilities.PivotUtil; import org.eclipse.qvtd.compiler.internal.common.AbstractQVTc2QVTc; import org.eclipse.qvtd.compiler.internal.utilities.SymbolNameBuilder; import org.eclipse.qvtd.compiler.internal.utilities.SymbolNameReservation; @@ -146,46 +146,46 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc protected boolean analyze() { Area thisArea = getArea(getMapping()); if (thisArea != null) { - @SuppressWarnings("null")@NonNull GuardPattern thisGuardPattern = thisArea.getGuardPattern(); - guardPredicates.addAll(ClassUtil.nullFree(thisGuardPattern.getPredicate())); - gatherVariables(thisGuardPattern.getVariable(), MergedVariable.GUARD); - @SuppressWarnings("null")@NonNull BottomPattern thisBottomPattern = thisArea.getBottomPattern(); - gatherVariables(thisBottomPattern.getVariable(), MergedVariable.BOTTOM); - gatherAssignments(thisBottomPattern.getAssignment(), ASSIGNMENT); - bottomPredicates.addAll(ClassUtil.nullFree(thisBottomPattern.getPredicate())); - gatherVariables(thisBottomPattern.getRealizedVariable(), MergedVariable.BOTTOM); + GuardPattern thisGuardPattern = QVTcoreUtil.getGuardPattern(thisArea); + guardPredicates.addAll(QVTbaseUtil.getOwnedPredicates(thisGuardPattern)); + gatherVariables(QVTcoreUtil.getOwnedVariables(thisGuardPattern), MergedVariable.GUARD); + BottomPattern thisBottomPattern = QVTcoreUtil.getBottomPattern(thisArea); + gatherVariables(QVTcoreUtil.getOwnedVariables(thisBottomPattern), MergedVariable.BOTTOM); + gatherAssignments(QVTcoreUtil.getOwnedAssignments(thisBottomPattern), ASSIGNMENT); + bottomPredicates.addAll(QVTbaseUtil.getOwnedPredicates(thisBottomPattern)); + gatherVariables(QVTcoreUtil.getOwnedRealizedVariables(thisBottomPattern), MergedVariable.BOTTOM); } for (@NonNull Area childArea : getChildAreas()) { - @SuppressWarnings("null")@NonNull GuardPattern childGuardPattern = childArea.getGuardPattern(); - guardPredicates.addAll(ClassUtil.nullFree(childGuardPattern.getPredicate())); - gatherVariables(childGuardPattern.getVariable(), MergedVariable.GUARD); - @SuppressWarnings("null")@NonNull BottomPattern childBottomPattern = childArea.getBottomPattern(); - gatherVariables(childBottomPattern.getVariable(), MergedVariable.BOTTOM); - gatherAssignments(childBottomPattern.getAssignment(), ASSIGNMENT); - bottomPredicates.addAll(ClassUtil.nullFree(childBottomPattern.getPredicate())); - gatherVariables(childBottomPattern.getRealizedVariable(), MergedVariable.BOTTOM); + GuardPattern childGuardPattern = QVTcoreUtil.getGuardPattern(childArea); + guardPredicates.addAll(QVTbaseUtil.getOwnedPredicates(childGuardPattern)); + gatherVariables(QVTcoreUtil.getOwnedVariables(childGuardPattern), MergedVariable.GUARD); + BottomPattern childBottomPattern = QVTcoreUtil.getBottomPattern(childArea); + gatherVariables(QVTcoreUtil.getOwnedVariables(childBottomPattern), MergedVariable.BOTTOM); + gatherAssignments(QVTcoreUtil.getOwnedAssignments(childBottomPattern), ASSIGNMENT); + bottomPredicates.addAll(QVTbaseUtil.getOwnedPredicates(childBottomPattern)); + gatherVariables(QVTcoreUtil.getOwnedRealizedVariables(childBottomPattern), MergedVariable.BOTTOM); } for (@NonNull Area parentArea : getParentAreas()) { assert (parentArea != thisArea); - @SuppressWarnings("null")@NonNull GuardPattern parentGuardPattern = parentArea.getGuardPattern(); - guardPredicates.addAll(ClassUtil.nullFree(parentGuardPattern.getPredicate())); - gatherVariables(parentGuardPattern.getVariable(), MergedVariable.GUARD); - @SuppressWarnings("null")@NonNull BottomPattern parentBottomPattern = parentArea.getBottomPattern(); - gatherVariables(parentBottomPattern.getVariable(), MergedVariable.GUARD); // Hoist - gatherAssignments(parentBottomPattern.getAssignment(), PREDICATE); - guardPredicates.addAll(ClassUtil.nullFree(parentBottomPattern.getPredicate())); // Hoist - gatherVariables(parentBottomPattern.getRealizedVariable(), MergedVariable.GUARD); // Hoist + GuardPattern parentGuardPattern = QVTcoreUtil.getGuardPattern(parentArea); + guardPredicates.addAll(QVTbaseUtil.getOwnedPredicates(parentGuardPattern)); + gatherVariables(QVTcoreUtil.getOwnedVariables(parentGuardPattern), MergedVariable.GUARD); + BottomPattern parentBottomPattern = QVTcoreUtil.getBottomPattern(parentArea); + gatherVariables(QVTcoreUtil.getOwnedVariables(parentBottomPattern), MergedVariable.GUARD); // Hoist + gatherAssignments(QVTcoreUtil.getOwnedAssignments(parentBottomPattern), PREDICATE); + guardPredicates.addAll(QVTbaseUtil.getOwnedPredicates(parentBottomPattern)); // Hoist + gatherVariables(QVTcoreUtil.getOwnedRealizedVariables(parentBottomPattern), MergedVariable.GUARD); // Hoist } for (@NonNull Area siblingArea : getSiblingAreas()) { if (siblingArea != thisArea) { - @SuppressWarnings("null")@NonNull GuardPattern siblingGuardPattern = siblingArea.getGuardPattern(); - guardPredicates.addAll(ClassUtil.nullFree(siblingGuardPattern.getPredicate())); - gatherVariables(siblingGuardPattern.getVariable(), MergedVariable.GUARD); - @SuppressWarnings("null")@NonNull BottomPattern siblingBottomPattern = siblingArea.getBottomPattern(); - gatherVariables(siblingBottomPattern.getVariable(), MergedVariable.BOTTOM); // FIXME legacy compatibility - gatherAssignments(siblingBottomPattern.getAssignment(), ASSIGNMENT); - bottomPredicates.addAll(ClassUtil.nullFree(siblingBottomPattern.getPredicate())); // FIXME legacy compatibility - gatherVariables(siblingBottomPattern.getRealizedVariable(), MergedVariable.BOTTOM); + GuardPattern siblingGuardPattern = QVTcoreUtil.getGuardPattern(siblingArea); + guardPredicates.addAll(QVTbaseUtil.getOwnedPredicates(siblingGuardPattern)); + gatherVariables(QVTcoreUtil.getOwnedVariables(siblingGuardPattern), MergedVariable.GUARD); + BottomPattern siblingBottomPattern = QVTcoreUtil.getBottomPattern(siblingArea); + gatherVariables(QVTcoreUtil.getOwnedVariables(siblingBottomPattern), MergedVariable.BOTTOM); // FIXME legacy compatibility + gatherAssignments(QVTcoreUtil.getOwnedAssignments(siblingBottomPattern), ASSIGNMENT); + bottomPredicates.addAll(QVTbaseUtil.getOwnedPredicates(siblingBottomPattern)); // FIXME legacy compatibility + gatherVariables(QVTcoreUtil.getOwnedRealizedVariables(siblingBottomPattern), MergedVariable.BOTTOM); } } return true; @@ -300,7 +300,7 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc BottomPattern mBottomPattern = QVTcoreFactory.eINSTANCE.createBottomPattern(); mArea.setBottomPattern(mBottomPattern); createVisitor.createAll(bottomPredicates, mBottomPattern.getPredicate()); - synthesizeNavigationAssignments(mBottomPattern.getAssignment()); + synthesizeNavigationAssignments(QVTcoreUtil.getOwnedAssignments(mBottomPattern)); if (variableName2mergedVariables != null) { for (@NonNull MergedVariable mergedVariable : variableName2mergedVariables.values()) { // FIXME Change to alphabetical sort mergedVariable.synthesize(mArea); @@ -314,11 +314,11 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc createVisitor.createAll(uArea.getOwnedComments(), mArea.getOwnedComments()); } // - @SuppressWarnings("null")@NonNull GuardPattern uGuardPattern = uArea.getGuardPattern(); + GuardPattern uGuardPattern = QVTcoreUtil.getGuardPattern(uArea); qvtu2qvtm.addTrace(uGuardPattern, mGuardPattern); createVisitor.createAll(uGuardPattern.getOwnedComments(), mGuardPattern.getOwnedComments()); // - @SuppressWarnings("null")@NonNull BottomPattern uBottomPattern = uArea.getBottomPattern(); + BottomPattern uBottomPattern = QVTcoreUtil.getBottomPattern(uArea); qvtu2qvtm.addTrace(uBottomPattern, mBottomPattern); createVisitor.createAll(uBottomPattern.getOwnedComments(), mArea.getOwnedComments()); } @@ -695,11 +695,12 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc mArea.getBottomPattern().getRealizedVariable().add(realizedVariable); } else { - mVariable = PivotFactory.eINSTANCE.createVariable(); if (isGuard) { + mVariable = QVTcoreFactory.eINSTANCE.createGuardVariable(); mArea.getGuardPattern().getVariable().add(mVariable); } else { + mVariable = QVTcoreFactory.eINSTANCE.createBottomVariable(); mArea.getBottomPattern().getVariable().add(mVariable); } } @@ -731,9 +732,9 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc assert assignments2 != null; VariableAssignment mVariableAssignment = createVisitor.create(assignments2.get(0)); assert mVariableAssignment != null; - for (@NonNull VariableAssignment uVariableAssignment : assignments2) { - // createVisitor.getContext().addTrace(uVariableAssignment, mVariableAssignment); - } + // for (@NonNull VariableAssignment uVariableAssignment : assignments2) { + // createVisitor.getContext().addTrace(uVariableAssignment, mVariableAssignment); + // } } } @@ -838,14 +839,14 @@ public class QVTu2QVTm extends AbstractQVTc2QVTc while (uNamedMapping.getContext() != null) { uNamedMapping = uNamedMapping.getContext(); } - s.appendString(String.valueOf(uNamedMapping.getName())); + s.appendString(PivotUtil.getName(uNamedMapping)); List<@NonNull String> guardVariableNames = new ArrayList<@NonNull String>(); for (@NonNull Variable guardVariable : ClassUtil.nullFree(uMapping.getGuardPattern().getVariable())) { - guardVariableNames.add(String.valueOf(guardVariable.getName())); + guardVariableNames.add(PivotUtil.getName(guardVariable)); } for (@NonNull Domain uDomain : ClassUtil.nullFree(uMapping.getDomain())) { for (@NonNull Variable guardVariable : ClassUtil.nullFree(((CoreDomain)uDomain).getGuardPattern().getVariable())) { - guardVariableNames.add(String.valueOf(guardVariable.getName())); + guardVariableNames.add(PivotUtil.getName(guardVariable)); } } Collections.sort(guardVariableNames); diff --git a/plugins/org.eclipse.qvtd.cs2as.compiler/src/org/eclipse/qvtd/cs2as/compiler/internal/OCL2QVTp.java b/plugins/org.eclipse.qvtd.cs2as.compiler/src/org/eclipse/qvtd/cs2as/compiler/internal/OCL2QVTp.java index f58b02d5c..8dabd0747 100644 --- a/plugins/org.eclipse.qvtd.cs2as.compiler/src/org/eclipse/qvtd/cs2as/compiler/internal/OCL2QVTp.java +++ b/plugins/org.eclipse.qvtd.cs2as.compiler/src/org/eclipse/qvtd/cs2as/compiler/internal/OCL2QVTp.java @@ -23,11 +23,9 @@ import static org.eclipse.qvtd.cs2as.compiler.internal.OCL2QVTpUtil.getUpdateMap import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; -import java.util.logging.Logger; import java.util.stream.Collectors; import org.eclipse.emf.common.util.URI; @@ -36,7 +34,6 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.Class; import org.eclipse.ocl.pivot.ExpressionInOCL; import org.eclipse.ocl.pivot.IfExp; @@ -74,10 +71,10 @@ import org.eclipse.qvtd.pivot.qvtcore.RealizedVariable; public class OCL2QVTp { - private @NonNull Logger logger = Logger.getLogger(getClass().getName()); + // private @NonNull Logger logger = Logger.getLogger(getClass().getName()); private @NonNull EnvironmentFactory envFact; private @NonNull String traceabilityPropName; - private @Nullable Map<?,?> saveOptions; + // private @Nullable Map<?,?> saveOptions; public static final @NonNull String RIGHT_MODEL_TYPE_NAME = "rightAS"; public static final @NonNull String LEFT_MODEL_TYPE_NAME = "leftCS"; @@ -356,7 +353,7 @@ public class OCL2QVTp { domain.setTypedModel(leftTypedModel); domain.setIsCheckable(true); - Variable variable = PivotFactory.eINSTANCE.createVariable(); + Variable variable = QVTcoreFactory.eINSTANCE.createGuardVariable(); variable.setName("l"+firstToUpperCase().apply(type.getName())); variable.setType(type); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtbase/src/org/eclipse/qvtd/pivot/qvtbase/utilities/QVTbaseUtil.java b/plugins/org.eclipse.qvtd.pivot.qvtbase/src/org/eclipse/qvtd/pivot/qvtbase/utilities/QVTbaseUtil.java index c36e0ac01..c11746717 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtbase/src/org/eclipse/qvtd/pivot/qvtbase/utilities/QVTbaseUtil.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtbase/src/org/eclipse/qvtd/pivot/qvtbase/utilities/QVTbaseUtil.java @@ -189,7 +189,7 @@ public class QVTbaseUtil extends PivotUtil // if (transformationType == null) { // FIXME BUG 487123 // throw new IllegalLibraryException("No Transformation type in standard library."); // FIXME need to be using a derived EnvironmentFactory // } - ownedContext = PivotFactory.eINSTANCE.createVariable(); + ownedContext = PivotFactory.eINSTANCE.createParameterVariable(); ownedContext.setName("this"); ownedContext.setType(transformation); // FIXME promote API // ownedContext.setTypeValue(transformation); @@ -208,7 +208,7 @@ public class QVTbaseUtil extends PivotUtil public static @NonNull Variable getContextVariable(@NonNull StandardLibraryInternal standardLibrary, @NonNull TypedModel typedModel) { Variable ownedContext = typedModel.getOwnedContext(); if (ownedContext == null) { - ownedContext = PivotFactory.eINSTANCE.createVariable(); + ownedContext = PivotFactory.eINSTANCE.createParameterVariable(); ownedContext.setName(typedModel.getName()); ownedContext.setType(standardLibrary.getLibraryType("Model")); // ownedContext.setTypeValue(typedModel); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreHelper.java b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreHelper.java index 777cb8965..b43b9d10c 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreHelper.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreHelper.java @@ -10,31 +10,18 @@ *******************************************************************************/ package org.eclipse.qvtd.pivot.qvtcore.utilities; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.eclipse.emf.common.util.TreeIterator; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EReference; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.ocl.pivot.CallExp; -import org.eclipse.ocl.pivot.CollectionType; -import org.eclipse.ocl.pivot.Element; -import org.eclipse.ocl.pivot.LetExp; import org.eclipse.ocl.pivot.OCLExpression; -import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.Variable; -import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager; -import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal; import org.eclipse.ocl.pivot.utilities.EnvironmentFactory; -import org.eclipse.ocl.pivot.utilities.NameUtil; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseHelper; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; @@ -52,6 +39,23 @@ public class QVTcoreHelper extends QVTbaseHelper super(environmentFactory); } + public @NonNull BottomVariable createBottomVariable(@NonNull String name, @NonNull Type asType, boolean isRequired, @Nullable OCLExpression asInitExpression) { + BottomVariable asVariable = QVTcoreFactory.eINSTANCE.createBottomVariable(); + asVariable.setName(name); + asVariable.setType(asType); + asVariable.setIsRequired(isRequired); + asVariable.setOwnedInit(asInitExpression); + return asVariable; + } + + public @NonNull GuardVariable createGuardVariable(@NonNull String name, @NonNull Type asType, boolean isRequired) { + GuardVariable asVariable = QVTcoreFactory.eINSTANCE.createGuardVariable(); + asVariable.setName(name); + asVariable.setType(asType); + asVariable.setIsRequired(isRequired); + return asVariable; + } + public @NonNull Mapping createMapping(@Nullable String name) { Mapping coreMapping = QVTcoreFactory.eINSTANCE.createMapping(); coreMapping.setName(name); @@ -93,94 +97,4 @@ public class QVTcoreHelper extends QVTbaseHelper asVariableAssignment.setValue(asValueExpression); return asVariableAssignment; } - - /** - * Rewrite asTree and all its descendants to replace all "?." and "?->" navigations by their safe counterparts. - * @deprecated-promote to PivotHelper for M4. - */ - @Deprecated - public void rewriteSafeNavigations(@NonNull Element asTree) { - // - // Locate all unsafe calls first to avoid CME from concurrent locate/rewrite. - // - List<@NonNull CallExp> unsafeCallExps = null; - if (asTree instanceof CallExp) { - unsafeCallExps = rewriteUnsafeCallExp_Gather(unsafeCallExps, (CallExp)asTree); - } - for (TreeIterator<EObject> tit = asTree.eAllContents(); tit.hasNext(); ) { - EObject eObject = tit.next(); - if (eObject instanceof CallExp) { - unsafeCallExps = rewriteUnsafeCallExp_Gather(unsafeCallExps, (CallExp)eObject); - } - } - // - // Rewrite the unsafe calls - // - if (unsafeCallExps != null) { - PivotMetamodelManager metamodelManager = (PivotMetamodelManager) environmentFactory.getMetamodelManager(); - org.eclipse.ocl.pivot.Class oclAnyType = environmentFactory.getStandardLibrary().getOclAnyType(); - Operation oclEqualsOperation = NameUtil.getNameable(oclAnyType.getOwnedOperations(), "="); - assert oclEqualsOperation != null; - org.eclipse.ocl.pivot.Class collectionType = environmentFactory.getStandardLibrary().getCollectionType(); - Operation excludingOperation = NameUtil.getNameable(collectionType.getOwnedOperations(), "excluding"); - assert excludingOperation != null; - for (CallExp unsafeCallExp : unsafeCallExps) { - OCLExpression source = unsafeCallExp.getOwnedSource(); - assert source != null; - if (source.getType() instanceof CollectionType) { - rewriteUnsafeCollectionCallExp(metamodelManager, excludingOperation, unsafeCallExp); - } - else { - rewriteUnsafeObjectCallExp(metamodelManager, oclEqualsOperation, unsafeCallExp); - } - } - } - } - - private @Nullable List<@NonNull CallExp> rewriteUnsafeCallExp_Gather(@Nullable List<@NonNull CallExp> unsafeCallExps, @NonNull CallExp callExp) { - OCLExpression source = callExp.getOwnedSource(); - if ((source != null) && callExp.isIsSafe()) { - if (unsafeCallExps == null) { - unsafeCallExps = new ArrayList<@NonNull CallExp>(); - } - unsafeCallExps.add(callExp); - } - return unsafeCallExps; - } - - private void rewriteUnsafeCollectionCallExp(@NonNull PivotMetamodelManager metamodelManager, @NonNull Operation excludingOperation, @NonNull CallExp unsafeCollectionCallExp) { - unsafeCollectionCallExp.setIsSafe(false); - EObject eContainer = unsafeCollectionCallExp.eContainer(); - EReference eContainmentFeature = unsafeCollectionCallExp.eContainmentFeature(); - PivotUtilInternal.resetContainer(unsafeCollectionCallExp); - // - OCLExpression nullExpression = metamodelManager.createNullLiteralExp(); - OCLExpression safeCollectionCallExp = createOperationCallExp(unsafeCollectionCallExp, excludingOperation, Collections.singletonList(nullExpression)); - // - eContainer.eSet(eContainmentFeature, safeCollectionCallExp); - } - - private void rewriteUnsafeObjectCallExp(@NonNull PivotMetamodelManager metamodelManager, @NonNull Operation oclEqualsOperation, @NonNull CallExp unsafeObjectCallExp) { - unsafeObjectCallExp.setIsSafe(false); - EObject eContainer = unsafeObjectCallExp.eContainer(); - EReference eContainmentFeature = unsafeObjectCallExp.eContainmentFeature(); - PivotUtilInternal.resetContainer(unsafeObjectCallExp); - OCLExpression oldSourceExpression = unsafeObjectCallExp.getOwnedSource(); - assert oldSourceExpression != null; - // - Variable unsafeSourceVariable = createVariable("unsafe", oldSourceExpression); - OCLExpression unsafeSourceExpression1 = createVariableExp(unsafeSourceVariable); - unsafeObjectCallExp.setOwnedSource(unsafeSourceExpression1); - // - OCLExpression unsafeSourceExpression2 = createVariableExp(unsafeSourceVariable); - OCLExpression nullExpression = metamodelManager.createNullLiteralExp(); - OCLExpression isUnsafeExpression = createOperationCallExp(unsafeSourceExpression2, oclEqualsOperation, Collections.singletonList(nullExpression)); - // - OCLExpression thenExpression = metamodelManager.createNullLiteralExp(); - OCLExpression safeObjectCallExp = metamodelManager.createIfExp(isUnsafeExpression, thenExpression, unsafeObjectCallExp); - // - LetExp safeExp = createLetExp(unsafeSourceVariable, safeObjectCallExp); - // - eContainer.eSet(eContainmentFeature, safeExp); - } }
\ No newline at end of file diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcorePrettyPrintVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcorePrettyPrintVisitor.java index 9c55c9790..57c232e18 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcorePrettyPrintVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcorePrettyPrintVisitor.java @@ -21,11 +21,13 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbasePrettyPrintVisitor; import org.eclipse.qvtd.pivot.qvtcore.Area; import org.eclipse.qvtd.pivot.qvtcore.Assignment; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; import org.eclipse.qvtd.pivot.qvtcore.EnforcementOperation; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; @@ -80,6 +82,11 @@ public class QVTcorePrettyPrintVisitor extends QVTbasePrettyPrintVisitor impleme } @Override + public Object visitBottomVariable(@NonNull BottomVariable object) { + return visitVariable(object); + } + + @Override public Object visitCoreDomain(@NonNull CoreDomain object) { // TODO Auto-generated method stub return null; @@ -120,6 +127,11 @@ public class QVTcorePrettyPrintVisitor extends QVTbasePrettyPrintVisitor impleme } @Override + public Object visitGuardVariable(@NonNull GuardVariable object) { + return visitVariable(object); + } + + @Override public Object visitMapping(@NonNull Mapping pMapping) { context.append("map "); context.appendName(pMapping); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreToStringVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreToStringVisitor.java index 47c1a2cc4..4fab8fe58 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreToStringVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreToStringVisitor.java @@ -17,11 +17,13 @@ import org.eclipse.ocl.pivot.utilities.ToStringVisitor; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseToStringVisitor; import org.eclipse.qvtd.pivot.qvtcore.Assignment; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; import org.eclipse.qvtd.pivot.qvtcore.EnforcementOperation; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; @@ -78,6 +80,11 @@ public class QVTcoreToStringVisitor extends QVTbaseToStringVisitor implements QV } @Override + public String visitBottomVariable(@NonNull BottomVariable object) { + return visitVariable(object); + } + + @Override public String visitCoreDomain(@NonNull CoreDomain object) { appendQualifiedName(object); return null; @@ -110,6 +117,11 @@ public class QVTcoreToStringVisitor extends QVTbaseToStringVisitor implements QV } @Override + public String visitGuardVariable(@NonNull GuardVariable object) { + return visitVariable(object); + } + + @Override public String visitMapping(@NonNull Mapping object) { append("mapping "); appendName(object); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreUtil.java b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreUtil.java index cebc6a695..868e62942 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreUtil.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcore/src/org/eclipse/qvtd/pivot/qvtcore/utilities/QVTcoreUtil.java @@ -39,13 +39,17 @@ import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseEnvironmentFactory.CreateStrategy; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtcore.Area; +import org.eclipse.qvtd.pivot.qvtcore.Assignment; +import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; import org.eclipse.qvtd.pivot.qvtcore.PropertyAssignment; +import org.eclipse.qvtd.pivot.qvtcore.RealizedVariable; public class QVTcoreUtil extends QVTbaseUtil { @@ -94,6 +98,10 @@ public class QVTcoreUtil extends QVTbaseUtil return mapping; } + public static @NonNull BottomPattern getBottomPattern(@NonNull Area area) { + return ClassUtil.nonNullState(area.getBottomPattern()); + } + public static @Nullable Area getContainingArea(@Nullable EObject eObject) { for ( ; eObject != null; eObject = eObject.eContainer()) { if (eObject instanceof Area) { @@ -125,6 +133,22 @@ public class QVTcoreUtil extends QVTbaseUtil return (CoreDomain)getDomain((Rule)rule, typedModel); } + public static @NonNull GuardPattern getGuardPattern(@NonNull Area area) { + return ClassUtil.nonNullState(area.getGuardPattern()); + } + + public static @NonNull List<@NonNull Assignment> getOwnedAssignments(@NonNull BottomPattern bottomPattern) { + return ClassUtil.nullFree(bottomPattern.getAssignment()); + } + + public static @NonNull List<@NonNull RealizedVariable> getOwnedRealizedVariables(@NonNull BottomPattern bottomPattern) { + return ClassUtil.nullFree(bottomPattern.getRealizedVariable()); + } + + public static @NonNull List<@NonNull Variable> getOwnedVariables(@NonNull CorePattern corePattern) { + return ClassUtil.nullFree(corePattern.getVariable()); + } + public static @NonNull Property getTargetProperty(@NonNull NavigationAssignment asNavigationAssignment) { if (asNavigationAssignment instanceof PropertyAssignment) { return ClassUtil.nonNullState(((PropertyAssignment)asNavigationAssignment).getTargetProperty()); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationHelper.java b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationHelper.java index 7f8d9f54f..dda5fa42d 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationHelper.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationHelper.java @@ -11,8 +11,13 @@ package org.eclipse.qvtd.pivot.qvtrelation.utilities; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.ocl.pivot.OCLExpression; +import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.utilities.EnvironmentFactory; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseHelper; +import org.eclipse.qvtd.pivot.qvtrelation.QVTrelationFactory; +import org.eclipse.qvtd.pivot.qvtrelation.SharedVariable; /** * QVTrelationHelper provides helper routines to assist creation of QVTrelation model elements. @@ -22,4 +27,13 @@ public class QVTrelationHelper extends QVTbaseHelper public QVTrelationHelper(@NonNull EnvironmentFactory environmentFactory) { super(environmentFactory); } + + public @NonNull SharedVariable createSharedVariable(@NonNull String name, @NonNull Type asType, boolean isRequired, @Nullable OCLExpression asInitExpression) { + SharedVariable asVariable = QVTrelationFactory.eINSTANCE.createSharedVariable(); + asVariable.setName(name); + asVariable.setType(asType); + asVariable.setIsRequired(isRequired); + asVariable.setOwnedInit(asInitExpression); + return asVariable; + } }
\ No newline at end of file diff --git a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationPrettyPrintVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationPrettyPrintVisitor.java index 88f92e9b5..ca05f557c 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationPrettyPrintVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationPrettyPrintVisitor.java @@ -24,6 +24,8 @@ import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment; import org.eclipse.qvtd.pivot.qvtrelation.RelationImplementation; import org.eclipse.qvtd.pivot.qvtrelation.RelationModel; import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation; +import org.eclipse.qvtd.pivot.qvtrelation.SharedVariable; +import org.eclipse.qvtd.pivot.qvtrelation.TemplateVariable; import org.eclipse.qvtd.pivot.qvtrelation.util.QVTrelationVisitor; import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp; import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; @@ -109,10 +111,20 @@ public class QVTrelationPrettyPrintVisitor extends QVTtemplatePrettyPrintVisitor } @Override + public Object visitSharedVariable(@NonNull SharedVariable object) { + return visitVariable(object); + } + + @Override public Object visitTemplateExp(@NonNull TemplateExp object) { context.appendName(object); context.append(" : "); context.appendTypedMultiplicity(object); return null; } + + @Override + public Object visitTemplateVariable(@NonNull TemplateVariable object) { + return visitVariable(object); + } } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationToStringVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationToStringVisitor.java index 8530db7b2..795723d42 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationToStringVisitor.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtrelation/src/org/eclipse/qvtd/pivot/qvtrelation/utilities/QVTrelationToStringVisitor.java @@ -27,6 +27,8 @@ import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment; import org.eclipse.qvtd.pivot.qvtrelation.RelationImplementation; import org.eclipse.qvtd.pivot.qvtrelation.RelationModel; import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation; +import org.eclipse.qvtd.pivot.qvtrelation.SharedVariable; +import org.eclipse.qvtd.pivot.qvtrelation.TemplateVariable; import org.eclipse.qvtd.pivot.qvtrelation.util.QVTrelationVisitor; import org.eclipse.qvtd.pivot.qvttemplate.utilities.QVTtemplateToStringVisitor; @@ -130,7 +132,7 @@ public class QVTrelationToStringVisitor extends QVTtemplateToStringVisitor imple } append("domain "); appendName(object); -/* append(" "); + /* append(" "); boolean isFirst = true; for (DomainPattern pattern : object.getPattern()) { if (!isFirst) { @@ -176,4 +178,14 @@ public class QVTrelationToStringVisitor extends QVTtemplateToStringVisitor imple append(")"); return null; } + + @Override + public String visitSharedVariable(@NonNull SharedVariable object) { + return visitVariable(object); + } + + @Override + public String visitTemplateVariable(@NonNull TemplateVariable object) { + return visitVariable(object); + } } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/as2cs/QVTcoreDeclarationVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/as2cs/QVTcoreDeclarationVisitor.java index b595ac3b7..27deec27a 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/as2cs/QVTcoreDeclarationVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/as2cs/QVTcoreDeclarationVisitor.java @@ -62,11 +62,13 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtcore.Assignment; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; import org.eclipse.qvtd.pivot.qvtcore.EnforcementOperation; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.NavigationAssignment; import org.eclipse.qvtd.pivot.qvtcore.OppositePropertyAssignment; @@ -332,6 +334,11 @@ public class QVTcoreDeclarationVisitor extends QVTbaseDeclarationVisitor impleme } @Override + public ElementCS visitBottomVariable(@NonNull BottomVariable object) { + return visitVariable(object); + } + + @Override public ElementCS visitCoreDomain(@NonNull CoreDomain asCoreDomain) { DomainCS csDomain = createCoreDomain(asCoreDomain); csDomain.setPivot(asCoreDomain); @@ -431,6 +438,11 @@ public class QVTcoreDeclarationVisitor extends QVTbaseDeclarationVisitor impleme } @Override + public ElementCS visitGuardVariable(@NonNull GuardVariable object) { + return visitVariable(object); + } + + @Override public ElementCS visitMapping(@NonNull Mapping asMapping) { String defaultName = asMapping.getContext() != null ? null : "«null»"; MappingCS csMapping = context.refreshNamedElement(MappingCS.class, QVTcoreCSPackage.Literals.MAPPING_CS, asMapping, defaultName); diff --git a/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/cs2as/QVTcoreCSContainmentVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/cs2as/QVTcoreCSContainmentVisitor.java index c8244ff56..3f5b45a30 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/cs2as/QVTcoreCSContainmentVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtcore/src/org/eclipse/qvtd/xtext/qvtcore/cs2as/QVTcoreCSContainmentVisitor.java @@ -45,10 +45,12 @@ import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtcore.Assignment; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.CoreModel; import org.eclipse.qvtd.pivot.qvtcore.EnforcementOperation; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; +import org.eclipse.qvtd.pivot.qvtcore.GuardVariable; import org.eclipse.qvtd.pivot.qvtcore.Mapping; import org.eclipse.qvtd.pivot.qvtcore.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtcore.QVTcoreFactory; @@ -369,7 +371,12 @@ public class QVTcoreCSContainmentVisitor extends AbstractQVTcoreCSContainmentVis @Override public Continuation<?> visitUnrealizedVariableCS(@NonNull UnrealizedVariableCS csElement) { - refreshNamedElement(Variable.class, PivotPackage.Literals.VARIABLE, csElement); + if (csElement.eContainer() instanceof GuardPatternCS) { + refreshNamedElement(GuardVariable.class, QVTcorePackage.Literals.GUARD_VARIABLE, csElement); + } + else { + refreshNamedElement(BottomVariable.class, QVTcorePackage.Literals.BOTTOM_VARIABLE, csElement); + } return null; } } 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 d9d48394d..275bfed4c 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 @@ -32,6 +32,7 @@ import org.eclipse.ocl.xtext.base.cs2as.Continuation; import org.eclipse.ocl.xtext.base.cs2as.SingleContinuation; import org.eclipse.ocl.xtext.base.utilities.BaseCSResource; import org.eclipse.ocl.xtext.basecs.PathNameCS; +import org.eclipse.ocl.xtext.essentialoclcs.VariableCS; import org.eclipse.qvtd.pivot.qvtbase.Function; import org.eclipse.qvtd.pivot.qvtbase.FunctionParameter; import org.eclipse.qvtd.pivot.qvtbase.QVTbasePackage; @@ -396,4 +397,10 @@ public class QVTimperativeCSContainmentVisitor extends AbstractQVTimperativeCSCo QVTbaseUtil.getContextVariable(standardLibrary, asTransformation); return null; } + + @Override + public Continuation<?> visitVariableCS(@NonNull VariableCS csElement) { + refreshNamedElement(LoopVariable.class, QVTimperativePackage.Literals.LOOP_VARIABLE, csElement); + return null; + } } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2as/QVTrelationCSContainmentVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2as/QVTrelationCSContainmentVisitor.java index 000658a6a..a4030d41e 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2as/QVTrelationCSContainmentVisitor.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/cs2as/QVTrelationCSContainmentVisitor.java @@ -23,7 +23,6 @@ import org.eclipse.ocl.pivot.Model; import org.eclipse.ocl.pivot.Namespace; import org.eclipse.ocl.pivot.OCLExpression; import org.eclipse.ocl.pivot.Operation; -import org.eclipse.ocl.pivot.PivotFactory; import org.eclipse.ocl.pivot.PivotPackage; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Variable; @@ -51,12 +50,15 @@ import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtrelation.DomainPattern; import org.eclipse.qvtd.pivot.qvtrelation.Key; +import org.eclipse.qvtd.pivot.qvtrelation.QVTrelationFactory; import org.eclipse.qvtd.pivot.qvtrelation.QVTrelationPackage; import org.eclipse.qvtd.pivot.qvtrelation.Relation; import org.eclipse.qvtd.pivot.qvtrelation.RelationDomain; import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment; import org.eclipse.qvtd.pivot.qvtrelation.RelationModel; import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation; +import org.eclipse.qvtd.pivot.qvtrelation.SharedVariable; +import org.eclipse.qvtd.pivot.qvtrelation.TemplateVariable; import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelationUtil; import org.eclipse.qvtd.pivot.qvttemplate.CollectionTemplateExp; import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp; @@ -117,7 +119,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai if (pKey != null) { pKey.setIdentifies(csElement.getClassId()); PivotUtilInternal.refreshList(pKey.getPart(), csElement.getPropertyIds()); - List<Property> oppositePart = new ArrayList<Property>(); + List<Property> oppositePart = new ArrayList<>(); for (PathNameCS oppositePropertyId : csElement.getOwnedOppositePropertyIds()) { Element element = oppositePropertyId.getReferredElement(); if (element instanceof Property) { @@ -140,7 +142,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai public BasicContinuation<?> execute() { TypedModel pTypedModel = PivotUtil.getPivot(TypedModel.class, csElement); if (pTypedModel != null) { - List<org.eclipse.ocl.pivot.Package> newUsedPackage = new ArrayList<org.eclipse.ocl.pivot.Package>(); + List<org.eclipse.ocl.pivot.Package> newUsedPackage = new ArrayList<>(); for (Namespace metamodelId : csElement.getMetamodelIds()) { if (metamodelId instanceof Model) { newUsedPackage.addAll(((Model)metamodelId).getOwnedPackages()); @@ -235,7 +237,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai String name = getElementTemplateName((ElementTemplateCS) csMember); VariableExp asVariableExp = context.refreshModelElement(VariableExp.class, PivotPackage.Literals.VARIABLE_EXP, csMember); if (name == null) { - Variable asMemberVariable = PivotFactory.eINSTANCE.createVariable(); + Variable asMemberVariable = QVTrelationFactory.eINSTANCE.createSharedVariable(); asMemberVariable.setName(QVTrelationUtil.DUMMY_VARIABLE_NAME + specialVariables.size()); asMemberVariable.setIsImplicit(true); specialVariables.add(asMemberVariable); @@ -261,7 +263,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai } } else { - asRestVariable = context.refreshModelElement(Variable.class, PivotPackage.Literals.VARIABLE, csRestTemplate); + asRestVariable = context.refreshModelElement(SharedVariable.class, QVTrelationPackage.Literals.SHARED_VARIABLE, csRestTemplate); asRestVariable.setIsImplicit(true); asRestVariable.setTypeValue(null); asRestVariable.setIsRequired(true); @@ -278,7 +280,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai protected void resolveTemplateVariable(@NonNull TemplateCS csElement, @NonNull TemplateExp pivotElement) { Variable variable = pivotElement.getBindsTo(); if (variable == null) { - variable = ClassUtil.nonNullEMF(PivotFactory.eINSTANCE.createVariable()); + variable = QVTrelationFactory.eINSTANCE.createTemplateVariable(); pivotElement.setBindsTo(variable); } context.refreshName(variable, csElement.getName()); @@ -309,10 +311,10 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai context.refreshPivotList(DomainPattern.class, asPatterns, csElement.getOwnedPattern()); context.refreshPivotList(RelationDomainAssignment.class, pivotElement.getDefaultAssignment(), csElement.getOwnedDefaultValues()); if (asPatterns.size() > 0) { - List<Variable> rootVariables = new ArrayList<Variable>(); + List<Variable> rootVariables = new ArrayList<>(); for (DomainPattern asPattern : asPatterns) { if (asPattern != null) { - // List<@NonNull Variable> boundVariables = new ArrayList<@NonNull Variable>(); + // List<@NonNull Variable> boundVariables = new ArrayList<>(); TemplateExp asTemplate = asPattern.getTemplateExpression(); if (asTemplate != null) { rootVariables.add(asTemplate.getBindsTo()); @@ -395,18 +397,18 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai public Continuation<?> visitPrimitiveTypeDomainCS(@NonNull PrimitiveTypeDomainCS csElement) { @NonNull RelationDomain pivotElement = context.refreshModelElement(RelationDomain.class, QVTrelationPackage.Literals.RELATION_DOMAIN, csElement); @NonNull DomainPattern asPattern = context.refreshModelElement(DomainPattern.class, QVTrelationPackage.Literals.DOMAIN_PATTERN, null); - List<DomainPattern> asPatterns = new ArrayList<DomainPattern>(); + List<DomainPattern> asPatterns = new ArrayList<>(); asPatterns.add(asPattern); PivotUtilInternal.refreshList(pivotElement.getPattern(), asPatterns); @NonNull TemplateExp template = context.refreshModelElement(TemplateExp.class, QVTtemplatePackage.Literals.OBJECT_TEMPLATE_EXP, null); asPattern.setTemplateExpression(template); - @NonNull Variable rootVariable = context.refreshModelElement(Variable.class, PivotPackage.Literals.VARIABLE, null); + @NonNull TemplateVariable rootVariable = context.refreshModelElement(TemplateVariable.class, QVTrelationPackage.Literals.TEMPLATE_VARIABLE, null); context.refreshName(rootVariable, csElement.getName()); template.setBindsTo(rootVariable); - List<Variable> rootVariables = new ArrayList<Variable>(); + List<Variable> rootVariables = new ArrayList<>(); rootVariables.add(rootVariable); PivotUtilInternal.refreshList(pivotElement.getRootVariable(), rootVariables); - List<Variable> pivotVariables = new ArrayList<Variable>(); + List<Variable> pivotVariables = new ArrayList<>(); pivotVariables.add(rootVariable); PivotUtilInternal.refreshList(asPattern.getBindsTo(), pivotVariables); return null; @@ -463,7 +465,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai domain.setIsEnforceable(isEnforceable); } } - List<@NonNull Variable> relationVariables = new ArrayList<@NonNull Variable>(); + List<@NonNull Variable> relationVariables = new ArrayList<>(); // // Gather explicit local variables. // @@ -487,12 +489,12 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai // // Resolve the special variables. // - List<@NonNull Variable> specialVariables = new ArrayList<@NonNull Variable>(); + List<@NonNull Variable> specialVariables = new ArrayList<>(); for (@NonNull AbstractDomainCS csAbstractDomain : ClassUtil.nullFree(csElement.getOwnedDomains())) { if (csAbstractDomain instanceof DomainCS) { for (@NonNull DomainPatternCS csDomainPatternCS : ClassUtil.nullFree(((DomainCS)csAbstractDomain).getOwnedPattern())) { DomainPattern asPattern = PivotUtil.getPivot(DomainPattern.class, csDomainPatternCS); - List<@NonNull Variable> boundVariables = new ArrayList<@NonNull Variable>(); + List<@NonNull Variable> boundVariables = new ArrayList<>(); TemplateCS csTemplate = csDomainPatternCS.getOwnedTemplate(); if (csTemplate != null) { processSpecialVariables(relationVariables, boundVariables, specialVariables, csTemplate); @@ -569,7 +571,7 @@ public class QVTrelationCSContainmentVisitor extends AbstractQVTrelationCSContai @Override public Continuation<?> visitVarDeclarationIdCS(@NonNull VarDeclarationIdCS csElement) { @SuppressWarnings("unused") - Variable pivotElement = refreshNamedElement(Variable.class, PivotPackage.Literals.VARIABLE, csElement); + SharedVariable pivotElement = refreshNamedElement(SharedVariable.class, QVTrelationPackage.Literals.SHARED_VARIABLE, csElement); return null; } } diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/scoping/QVTrelationPathElementCSAttribution.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/scoping/QVTrelationPathElementCSAttribution.java index 35baf8bb9..a3fdde940 100644 --- a/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/scoping/QVTrelationPathElementCSAttribution.java +++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation/src/org/eclipse/qvtd/xtext/qvtrelation/scoping/QVTrelationPathElementCSAttribution.java @@ -21,6 +21,7 @@ import org.eclipse.ocl.pivot.internal.scoping.ScopeView; import org.eclipse.ocl.pivot.utilities.PivotUtil; import org.eclipse.ocl.xtext.base.attributes.PathElementCSAttribution; import org.eclipse.qvtd.pivot.qvtrelation.Relation; +import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelationHelper; import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelationUtil; import org.eclipse.qvtd.xtext.qvtrelationcs.RelationCS; @@ -36,10 +37,11 @@ public class QVTrelationPathElementCSAttribution extends PathElementCSAttributio if (eObject instanceof RelationCS) { Relation relation = PivotUtil.getPivot(Relation.class, (RelationCS)eObject); if (relation != null) { + QVTrelationHelper helper = new QVTrelationHelper(environmentView.getEnvironmentFactory()); List<Variable> variables = relation.getVariable(); AnyType oclAnyType = environmentView.getStandardLibrary().getOclAnyType(); String variableName = QVTrelationUtil.DUMMY_VARIABLE_NAME + variables.size(); - Variable asVariable = PivotUtil.createVariable(variableName, oclAnyType, true, null); + Variable asVariable = helper.createSharedVariable(variableName, oclAnyType, true, null); asVariable.setIsImplicit(true); variables.add(asVariable); environmentView.addElement(QVTrelationUtil.DUMMY_VARIABLE_NAME, asVariable); @@ -49,9 +51,9 @@ public class QVTrelationPathElementCSAttribution extends PathElementCSAttributio } return null; } -// else if (name == null) { -// env -// } + // else if (name == null) { + // env + // } return super.computeLookup(target, environmentView, scopeView); } } |