diff options
author | Ed Willink | 2018-08-21 14:58:21 +0000 |
---|---|---|
committer | Ed Willink | 2018-09-04 12:20:51 +0000 |
commit | 7716fac732b57aed50d2fe2e21b515e6d0c2d8d3 (patch) | |
tree | 3c016349798ea7b38d198c4d41f61cee57be0cdc | |
parent | 521710dad7cdfeb2bd88177209bb5d886d07aa50 (diff) | |
download | org.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.tar.gz org.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.tar.xz org.eclipse.qvtd-7716fac732b57aed50d2fe2e21b515e6d0c2d8d3.zip |
[529130] Force no-status sequencing
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(); } |