Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2018-08-21 14:58:21 +0000
committerEd Willink2018-09-04 12:20:51 +0000
commit7716fac732b57aed50d2fe2e21b515e6d0c2d8d3 (patch)
tree3c016349798ea7b38d198c4d41f61cee57be0cdc
parent521710dad7cdfeb2bd88177209bb5d886d07aa50 (diff)
downloadorg.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.tar.gz
org.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.tar.xz
org.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.zip
[529130] Force no-status sequencing
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/PartialRegionAnalysis.java4
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/RegionAnalysis.java10
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/AbstractPartition.java11
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/MappingPartitioner.java13
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatedPartition.java12
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatingPartition.java21
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculationPartition.java12
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/utilities/CompilerUtil.java16
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java16
9 files changed, 110 insertions, 5 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/PartialRegionAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/PartialRegionAnalysis.java
index d0031fa17..e3b8d015b 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/PartialRegionAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/PartialRegionAnalysis.java
@@ -25,8 +25,12 @@ public interface PartialRegionAnalysis<@NonNull RA extends PartialRegionAnalysis
{
@Nullable Iterable<@NonNull TraceClassAnalysis<@NonNull RA>> getConsumedTraceClassAnalyses();
@Nullable Iterable<@NonNull TracePropertyAnalysis<@NonNull RA>> getConsumedTracePropertyAnalyses();
+ @Deprecated /** @deprecated This accommodates the lack of a success trace variable for manual trace classes */
+ @Nullable Iterable<@NonNull RA> getPredecessors();
@Nullable Iterable<@NonNull TraceClassAnalysis<@NonNull RA>> getProducedTraceClassAnalyses();
@Nullable Iterable<@NonNull TracePropertyAnalysis<@NonNull RA>> getProducedTracePropertyAnalyses();
+ @Deprecated /** @deprecated This accommodates the lack of a success trace variable for manual trace classes */
+ @Nullable Iterable<@NonNull RA> getSuccessors();
@Nullable Iterable<@NonNull TraceClassAnalysis<@NonNull RA>> getSuperProducedTraceClassAnalyses();
@Nullable Iterable<@NonNull TracePropertyAnalysis<@NonNull RA>> getSuperProducedTracePropertyAnalyses();
@NonNull TraceClassAnalysis<@NonNull RA> getTraceClassAnalysis(@NonNull ClassDatum traceClassDatum);
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/RegionAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/RegionAnalysis.java
index 1b23cbcdf..54e00ced2 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/RegionAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/RegionAnalysis.java
@@ -434,6 +434,16 @@ public class RegionAnalysis extends AbstractPartialRegionAnalysis<@NonNull Regio
return QVTscheduleUtil.getOwnedNodes(region);
}
+ @Override
+ public @Nullable Iterable<@NonNull RegionAnalysis> getPredecessors() {
+ return null;
+ }
+
+ @Override
+ public @Nullable Iterable<@NonNull RegionAnalysis> getSuccessors() {
+ return null;
+ }
+
public @NonNull TransformationAnalysis getTransformationAnalysis() {
return transformationAnalysis;
}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/AbstractPartition.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/AbstractPartition.java
index e46ee97fc..352628f48 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/AbstractPartition.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/AbstractPartition.java
@@ -11,6 +11,7 @@
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.TransformationAnalysis;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.AbstractPartialRegionAnalysis;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.RegionAnalysis;
@@ -40,12 +41,22 @@ abstract class AbstractPartition extends AbstractPartialRegionAnalysis<@NonNull
return parallelScheduleDepth;
}
+ @Override
+ public @Nullable Iterable<@NonNull Partition> getPredecessors() {
+ return null;
+ }
+
// @Override
// public @NonNull Region getRegion() {
// return region;
// }
@Override
+ public @Nullable Iterable<@NonNull Partition> getSuccessors() {
+ return null;
+ }
+
+ @Override
public void setDepth(int parallelScheduleDepth) {
this.parallelScheduleDepth = parallelScheduleDepth;
}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/MappingPartitioner.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/MappingPartitioner.java
index b59a5950c..10f7a71d0 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/MappingPartitioner.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/MappingPartitioner.java
@@ -643,9 +643,16 @@ public class MappingPartitioner implements Nameable
}
else {
if (!Iterables.isEmpty(getPredicatedMiddleNodes())) {
- newPartitions.add(createSpeculationPartition());
- newPartitions.add(createSpeculatingPartition());
- newPartitions.add(createSpeculatedPartition());
+ SpeculationPartition speculationPartition = createSpeculationPartition();
+ SpeculatingPartition speculatingPartition = createSpeculatingPartition();
+ SpeculatedPartition speculatedPartition = createSpeculatedPartition();
+ newPartitions.add(speculationPartition);
+ newPartitions.add(speculatingPartition);
+ newPartitions.add(speculatedPartition);
+ speculationPartition.addSuccessor(speculatingPartition);
+ speculatingPartition.addPredecessor(speculationPartition);
+ speculatingPartition.addSuccessor(speculatedPartition);
+ speculatedPartition.addPredecessor(speculatingPartition);
}
else {
newPartitions.add(createRealizedPartition());
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatedPartition.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatedPartition.java
index 4695741cd..ce1074229 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatedPartition.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatedPartition.java
@@ -10,7 +10,9 @@
*******************************************************************************/
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
@@ -33,6 +35,7 @@ import org.eclipse.qvtd.pivot.qvtschedule.utilities.QVTscheduleUtil;
class SpeculatedPartition extends AbstractPartialPartition
{
private final @NonNull Set<@NonNull Node> tracedInputNodes = new HashSet<>();
+ private final @NonNull List<@NonNull Partition> predecessors = new ArrayList<>();
public SpeculatedPartition(@NonNull MappingPartitioner partitioner, @NonNull ReachabilityForest reachabilityForest) {
super(partitioner, reachabilityForest, "«speculated»");
@@ -70,6 +73,10 @@ class SpeculatedPartition extends AbstractPartialPartition
resolveSuccessNodes();
}
+ public void addPredecessor(@NonNull SpeculatingPartition speculatingPartition) {
+ predecessors.add(speculatingPartition);
+ }
+
@Override
public @NonNull MappingRegion createMicroMappingRegion(int partitionNumber) {
return createMicroMappingRegion("«speculated»", "_p" + partitionNumber);
@@ -89,6 +96,11 @@ class SpeculatedPartition extends AbstractPartialPartition
}
@Override
+ public @NonNull List<@NonNull Partition> getPredecessors() {
+ return predecessors;
+ }
+
+ @Override
protected @Nullable Role resolveEdgeRole(@NonNull Role sourceNodeRole, @NonNull Edge edge, @NonNull Role targetNodeRole) {
Role edgeRole = QVTscheduleUtil.getEdgeRole(edge);
if (edgeRole == Role.REALIZED && partitioner.hasRealizedEdge(edge)) {
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatingPartition.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatingPartition.java
index e32bd3b23..0b5df4ead 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatingPartition.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculatingPartition.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -33,6 +34,8 @@ import org.eclipse.qvtd.pivot.qvtschedule.utilities.QVTscheduleUtil;
class SpeculatingPartition extends AbstractPartialPartition
{
private final @NonNull Set<@NonNull Node> tracedInputNodes = new HashSet<>();
+ private final @NonNull List<@NonNull Partition> predecessors = new ArrayList<>();
+ private final @NonNull List<@NonNull Partition> successors = new ArrayList<>();
public SpeculatingPartition(@NonNull MappingPartitioner partitioner, @NonNull ReachabilityForest reachabilityForest) {
super(partitioner, reachabilityForest, "«speculating»");
@@ -75,11 +78,29 @@ class SpeculatingPartition extends AbstractPartialPartition
resolveEdges();
}
+ public void addPredecessor(@NonNull SpeculationPartition speculationPartition) {
+ predecessors.add(speculationPartition);
+ }
+
+ public void addSuccessor(@NonNull SpeculatedPartition speculatedPartition) {
+ successors.add(speculatedPartition);
+ }
+
@Override
public @NonNull MappingRegion createMicroMappingRegion(int partitionNumber) {
return createMicroMappingRegion("«speculating»", "_p" + partitionNumber);
}
+ @Override
+ public @NonNull List<@NonNull Partition> getPredecessors() {
+ return predecessors;
+ }
+
+ @Override
+ public @NonNull List<@NonNull Partition> getSuccessors() {
+ return successors;
+ }
+
private boolean isDownstreamFromCorollary(@NonNull Node node) {
if (transformationAnalysis.isCorollary(node)) {
return true;
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculationPartition.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculationPartition.java
index 9875e070e..01b6e48e2 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculationPartition.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/partitioner/SpeculationPartition.java
@@ -10,6 +10,8 @@
*******************************************************************************/
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
@@ -36,6 +38,7 @@ import com.google.common.collect.Sets;
class SpeculationPartition extends AbstractPartialPartition
{
private final @NonNull Set<@NonNull Node> headNodes;
+ private final @NonNull List<@NonNull Partition> successors = new ArrayList<>();
public SpeculationPartition(@NonNull MappingPartitioner partitioner, @NonNull ReachabilityForest reachabilityForest) {
super(partitioner, reachabilityForest, "«speculation»");
@@ -85,6 +88,10 @@ class SpeculationPartition extends AbstractPartialPartition
}
}
+ public void addSuccessor(@NonNull SpeculatingPartition speculatingPartition) {
+ successors.add(speculatingPartition);
+ }
+
@Override
public @NonNull MappingRegion createMicroMappingRegion(int partitionNumber) {
return createMicroMappingRegion("«speculation»", "_p" + partitionNumber);
@@ -99,6 +106,11 @@ class SpeculationPartition extends AbstractPartialPartition
return null;
}
+ @Override
+ public @NonNull List<@NonNull Partition> getSuccessors() {
+ return successors;
+ }
+
/**
* Return true if edge is available for use by this partition.
* The override implementation returns true for all constant and loaded edges.
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/utilities/CompilerUtil.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/utilities/CompilerUtil.java
index e38562d74..85546508d 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/utilities/CompilerUtil.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/utilities/CompilerUtil.java
@@ -332,6 +332,14 @@ public class CompilerUtil extends QVTscheduleUtil
consumer2producers.put(regionAnalysis, new HashSet<>());
}
for (@NonNull RA consumer : regionAnalyses) {
+ Iterable<@NonNull RA> predecessors = consumer.getPredecessors(); // Used by no-success QVTc trace
+ if (predecessors != null) {
+ for (@NonNull RA predecessor : predecessors) {
+ Set<@NonNull RA> producers = consumer2producers.get(consumer);
+ assert producers != null;
+ producers.add(predecessor);
+ }
+ }
Iterable<@NonNull TraceClassAnalysis<@NonNull RA>> consumedTraceClassAnalyses = consumer.getConsumedTraceClassAnalyses();
if (consumedTraceClassAnalyses != null) {
for (@NonNull TraceClassAnalysis<@NonNull RA> consumedTraceClassAnalysis : consumedTraceClassAnalyses) {
@@ -398,6 +406,14 @@ public class CompilerUtil extends QVTscheduleUtil
producer2consumers.put(regionAnalysis, new HashSet<>());
}
for (@NonNull RA producer : regionAnalyses) {
+ Iterable<@NonNull RA> successors = producer.getSuccessors(); // Used by no-success QVTc trace
+ if (successors != null) {
+ for (@NonNull RA successor : successors) {
+ Set<@NonNull RA> consumers = producer2consumers.get(producer);
+ assert consumers != null;
+ consumers.add(successor);
+ }
+ }
Iterable<@NonNull TraceClassAnalysis<@NonNull RA>> producedTraceClassAnalyses = producer.getProducedTraceClassAnalyses();
if (producedTraceClassAnalyses != null) {
for (@NonNull TraceClassAnalysis<@NonNull RA> producedTraceClassAnalysis : producedTraceClassAnalyses) {
diff --git a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
index 29717daa2..5a7fbf423 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtcore.tests/src/org/eclipse/qvtd/xtext/qvtcore/tests/QVTcCompilerTests.java
@@ -22,7 +22,9 @@ import org.eclipse.ocl.pivot.internal.resource.ProjectMap;
import org.eclipse.ocl.pivot.model.OCLstdlib;
import org.eclipse.ocl.pivot.resource.ProjectManager;
import org.eclipse.ocl.xtext.base.services.BaseLinkingService;
+import org.eclipse.qvtd.compiler.CompilerChain;
import org.eclipse.qvtd.compiler.CompilerOptions;
+import org.eclipse.qvtd.compiler.DefaultCompilerOptions;
import org.eclipse.qvtd.compiler.QVTcCompilerChain;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.ScheduleManager;
import org.eclipse.qvtd.compiler.internal.qvtm2qvts.QVTm2QVTs;
@@ -58,6 +60,8 @@ import org.junit.Test;
*/
public class QVTcCompilerTests extends LoadTestCase
{
+ private static boolean NO_MERGES = true; // Set true to suppress the complexities of merging
+
protected class MyQVT extends AbstractTestQVT
{
protected class InstrumentedCompilerChain extends QVTcCompilerChain
@@ -90,6 +94,14 @@ public class QVTcCompilerTests extends LoadTestCase
}
@Override
+ protected @NonNull DefaultCompilerOptions createCompilerChainOptions() {
+ DefaultCompilerOptions options = super.createCompilerChainOptions();
+ options.setOption(CompilerChain.QVTS_STEP, CompilerChain.SCHEDULER_NO_EARLY_MERGE, NO_MERGES);
+ options.setOption(CompilerChain.QVTS_STEP, CompilerChain.SCHEDULER_NO_LATE_CONSUMER_MERGE, NO_MERGES);
+ return options;
+ }
+
+ @Override
protected @NonNull List<@NonNull String> createClassProjectNames() {
List<@NonNull String> classProjectNames = super.createClassProjectNames();
classProjectNames.add(0, "org.eclipse.qvtd.xtext.qvtcore.tests");
@@ -271,7 +283,7 @@ public class QVTcCompilerTests extends LoadTestCase
myQVT.executeTransformation();
myQVT.saveOutput("forward", getTestURI("ThreeElementList_Reverse_CG.xmi"), getModelsURI("forward2reverse/samples/ThreeElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
//
- Class<? extends Transformer> txClass = myQVT.buildTransformation("reverse", false, "List2List.genmodel");
+ /* Class<? extends Transformer> txClass = myQVT.buildTransformation("reverse", false, "List2List.genmodel");
//
myQVT.createGeneratedExecutor(txClass);
myQVT.loadInput("forward", getModelsURI("forward2reverse/samples/EmptyList.xmi"));
@@ -292,7 +304,7 @@ public class QVTcCompilerTests extends LoadTestCase
myQVT.loadInput("forward", getModelsURI("forward2reverse/samples/ThreeElementList.xmi"));
myQVT.executeTransformation();
myQVT.saveOutput("reverse", getTestURI("ThreeElementList_CG.xmi"), getModelsURI("forward2reverse/samples/ThreeElementList_expected.xmi"), Forward2ReverseNormalizer.INSTANCE);
- }
+ */ }
finally {
myQVT.dispose();
}

Back to the top