diff options
author | Ed Willink | 2020-02-22 15:53:22 +0000 |
---|---|---|
committer | Ed Willink | 2020-02-25 12:34:07 +0000 |
commit | 43422f76f4115bd1fa218bea2ec1ac6425a1ebb1 (patch) | |
tree | b77a4c95344a5e87539a807903a7258a31b2b3b9 | |
parent | ca364d60ecf4709814fa8098c24f63acb706a988 (diff) | |
download | org.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.tar.gz org.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.tar.xz org.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.zip |
[513375] don't observe trace edges
4 files changed, 53 insertions, 4 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvti/analysis/QVTiProductionConsumption.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvti/analysis/QVTiProductionConsumption.java index ff4eeae3d..558dd4a53 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvti/analysis/QVTiProductionConsumption.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvti/analysis/QVTiProductionConsumption.java @@ -35,6 +35,8 @@ import org.eclipse.ocl.pivot.OppositePropertyCallExp; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.TypedElement; +import org.eclipse.ocl.pivot.VariableDeclaration; +import org.eclipse.ocl.pivot.VariableExp; import org.eclipse.ocl.pivot.internal.prettyprint.PrettyPrinter; import org.eclipse.ocl.pivot.util.Visitable; import org.eclipse.ocl.pivot.utilities.ClassUtil; @@ -54,6 +56,7 @@ import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder.GraphEdge; import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder.GraphElement; import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder.GraphNode; import org.eclipse.qvtd.pivot.qvtbase.graphs.ToGraphHelper; +import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtbase.utilities.StandardLibraryHelper; import org.eclipse.qvtd.pivot.qvtimperative.DeclareStatement; import org.eclipse.qvtd.pivot.qvtimperative.EntryPoint; @@ -575,6 +578,26 @@ public class QVTiProductionConsumption extends AbstractExtendingQVTimperativeVis return false; } + private boolean isTraceSlot(@NonNull NavigationCallExp consumer) { + EObject eContainer = consumer.eContainer(); + if (!(eContainer instanceof DeclareStatement)) { + return false; + } + OCLExpression ownedSource = QVTbaseUtil.getOwnedSource(consumer); + if (!(ownedSource instanceof VariableExp)) { + return false; + } + VariableDeclaration referredVariable = QVTbaseUtil.getReferredVariable((VariableExp) ownedSource); + if (!(referredVariable instanceof GuardParameter)) { + return false; + } + Property successProperty = ((GuardParameter) referredVariable).getSuccessProperty(); + if (successProperty == null) { + return false; + } + return true; + } + @Override public @NonNull String toString() { return name; @@ -705,7 +728,7 @@ public class QVTiProductionConsumption extends AbstractExtendingQVTimperativeVis } else if (!(consumer.eContainer() instanceof SpeculateStatement)) { PassRange consumerPassRange = PassRange.create(consumer); - boolean needsObserve = !productionRange.precedes(consumerPassRange); + boolean needsObserve = !productionRange.precedes(consumerPassRange) && !isTraceSlot(consumer); boolean isObserve = isObserve(consumer); if (isObserve != needsObserve) { Property property = consumingAnalysis.property; diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/ConnectionManager.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/ConnectionManager.java index 2d3f45c57..a69286fb8 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/ConnectionManager.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/ConnectionManager.java @@ -992,6 +992,20 @@ public class ConnectionManager } public boolean isHazardousRead(@Nullable StringBuilder s, @NonNull Partition partition, @NonNull NavigationEdge edge) { + // if (edge.isRealized()) { + Role edgeRole = partition.getRole(edge); + assert edgeRole != null; + if (!edgeRole.isRealized()) { + Node sourceNode = QVTscheduleUtil.getSourceNode(edge); + if (sourceNode.isTrace()) { + return false; // Trace edges are not hazardous - defined by caller / realizer + } + Node targetNode = QVTscheduleUtil.getTargetNode(edge); + if (targetNode.isTrace()) { + return false; // Tolerate the opposite + } + } + // } Property property = QVTscheduleUtil.getReferredProperty(edge); @SuppressWarnings("unused") String name = property.getName(); Property oppositeProperty = property.getOpposite(); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/checks/CheckedConditionAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/checks/CheckedConditionAnalysis.java index e7dbde9be..c8b0a1e67 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/checks/CheckedConditionAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/checks/CheckedConditionAnalysis.java @@ -180,6 +180,11 @@ public class CheckedConditionAnalysis } Role navigableEdgeRole = partition.getRole(navigationEdge); assert navigableEdgeRole != null; + + if (navigationEdge.isRealized() && !navigableEdgeRole.isRealized()) { + return null; // No need to re-check + } + NavigationEdge primaryEdge = QVTscheduleUtil.getPrimaryEdge(navigationEdge); { NavigationEdge oppositeEdge = primaryEdge.getOppositeEdge(); @@ -437,6 +442,10 @@ public class CheckedConditionAnalysis if (allCheckedPropertyDatums != null) { return allCheckedPropertyDatums; } + String name = partition.getName(); + if ("mapHelper_Context_qvtr«loop»".equals(name)) { + getClass(); + } @NonNull ConnectionManager connectionManager = scheduleManager.getConnectionManager(); // // Better, we would not be pessimistic about input/output typedModel ambiguity in endogeneous diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java index d0cb490cb..68615b0ea 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java @@ -346,7 +346,7 @@ public class QVTrCompilerTests extends LoadTestCase EMFTCSInjector.class.getName(); // Hidden ATL dependency AtlParser.class.getName(); // Hidden ATL dependency myQVT2.getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap().put("atl", new AtlResourceFactoryImpl()); - myQVT2.addInputURI("atl", getModelsURI("families2persons/Families2Persons3.atl")); + myQVT2.addInputURI("atl", getModelsURI("families2persons/Families2Persons.atl")); // } // else { // myQVT2.addInputURI("atl", getModelsURI("families2persons/Families2Persons.atl.xmi")); // FIXME Working around BUG 514604 @@ -1290,8 +1290,11 @@ public class QVTrCompilerTests extends LoadTestCase // Splitter.GROUPS.setState(true); // Splitter.RESULT.setState(true); // Splitter.STAGES.setState(true); - // AbstractTransformer.EXCEPTIONS.setState(true); - // AbstractTransformer.INVOCATIONS.setState(true); + AbstractTransformer.ASSIGNMENTS.setState(true); + AbstractTransformer.CREATIONS.setState(true); + AbstractTransformer.EXCEPTIONS.setState(true); + AbstractTransformer.GETTINGS.setState(true); + AbstractTransformer.INVOCATIONS.setState(true); // QVTm2QVTp.PARTITIONING.setState(true); // QVTp2QVTs.REGION_ORDER.setState(true); Class<? extends Transformer> txClass; |