Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2020-02-22 15:53:22 +0000
committerEd Willink2020-02-25 12:34:07 +0000
commit43422f76f4115bd1fa218bea2ec1ac6425a1ebb1 (patch)
treeb77a4c95344a5e87539a807903a7258a31b2b3b9
parentca364d60ecf4709814fa8098c24f63acb706a988 (diff)
downloadorg.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.tar.gz
org.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.tar.xz
org.eclipse.qvtd-43422f76f4115bd1fa218bea2ec1ac6425a1ebb1.zip
[513375] don't observe trace edges
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvti/analysis/QVTiProductionConsumption.java25
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/ConnectionManager.java14
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/checks/CheckedConditionAnalysis.java9
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java9
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;

Back to the top