[514590] Suppress abstract region merging
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
index f3b21cc..e89c7e4 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/Correlator.java
@@ -23,6 +23,7 @@
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.qvtd.compiler.internal.qvtm2qvts.RegionUtil;
+import org.eclipse.qvtd.pivot.qvtschedule.BasicMappingRegion;
import org.eclipse.qvtd.pivot.qvtschedule.Edge;
import org.eclipse.qvtd.pivot.qvtschedule.MappingRegion;
import org.eclipse.qvtd.pivot.qvtschedule.NavigableEdge;
@@ -35,6 +36,16 @@
class Correlator
{
public static @Nullable Correlator correlate(@NonNull MappingRegion secondaryRegion, @NonNull MappingRegion primaryRegion, @NonNull CorrelationStrategy strategy, @Nullable Map<@NonNull Node, @NonNull Node> primaryNode2secondaryNode) {
+ if (secondaryRegion instanceof BasicMappingRegion) {
+ if (((BasicMappingRegion)secondaryRegion).getReferredMapping().isIsAbstract()) {
+ return null;
+ }
+ }
+ if (primaryRegion instanceof BasicMappingRegion) {
+ if (((BasicMappingRegion)primaryRegion).getReferredMapping().isIsAbstract()) {
+ return null;
+ }
+ }
Correlator correlator = new Correlator(primaryRegion, secondaryRegion, strategy, primaryNode2secondaryNode);
return correlator.correlate() ? correlator : null;
}
@@ -225,25 +236,34 @@
Node secondaryHeadNode = secondaryHeadNodes.get(0);
CompleteClass completeClass = secondaryHeadNode.getCompleteClass();
List<@NonNull Node> primaryNodes = completeClass2primaryNodes.get(completeClass);
- if (primaryNodes == null) {
+ if ((primaryNodes == null) || (primaryNodes.size() == 0)) {
if (debugFailures) {
AbstractMerger.FAILURE.println("No primary nodes of type: " + completeClass);
}
return false;
}
Node primaryHeadNode = secondaryNode2primaryNode.get(secondaryHeadNode);
- if (primaryHeadNode != null) {
- return true;
- }
- primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);
if (primaryHeadNode == null) {
- primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes); // FIXME debugging
- if (debugFailures) {
- AbstractMerger.FAILURE.println("No primary head node to match: " + secondaryHeadNode);
+ primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes);
+ if (primaryHeadNode == null) {
+ primaryHeadNode = selectMergedHeadNode(secondaryHeadNode, primaryNodes); // FIXME debugging
+ if (debugFailures) {
+ AbstractMerger.FAILURE.println("No primary head node to match: " + secondaryHeadNode);
+ }
+ return false;
}
- return false;
+ secondaryNode2primaryNode.put(secondaryHeadNode, primaryHeadNode);
}
- secondaryNode2primaryNode.put(secondaryHeadNode, primaryHeadNode);
+ if (primaryNodes.size() > 1) {
+ for (@NonNull Node primaryNode : primaryNodes) {
+ if ((primaryNode != primaryHeadNode) && !primaryNode.isLoaded()) {
+ if (debugFailures) { // FIXME multiple matching not-speculated might be ok
+ AbstractMerger.FAILURE.println("Multiple primary nodes of type: " + completeClass);
+ }
+ return false;
+ }
+ }
+ }
return true;
}
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
index ce16f34..493c213 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvts2qvts/merger/LateConsumerMerger.java
@@ -438,6 +438,9 @@
}
}
+ /**
+ * Return the lists of child regions that have consecutive indexes.
+ */
protected @NonNull Iterable<@NonNull List<@NonNull MappingRegion>> selectConsecutiveRegionRuns(@NonNull NodeConnection nodeConnection) {
Map<@NonNull Integer, @NonNull MappingRegion> index2region = new HashMap<>();
for (@NonNull Region targetRegion : nodeConnection.getTargetRegions()) {
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 a000305..aa068f6 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
@@ -334,6 +334,7 @@
// myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
try {
Class<? extends Transformer> txClassReverse = myQVT.buildTransformation("Forward2Reverse.qvtc", "forward", "List2List.genmodel");
+ // Class<? extends Transformer> txClassReverse = Forward2Reverse.class;
myQVT.assertRegionCount(BasicMappingRegionImpl.class, 0);
myQVT.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
@@ -415,8 +416,8 @@
Class<? extends Transformer> txClass = myQVT.buildTransformation("HSV2HSL.qvtc", "hsl", "HSV2HSL.genmodel");
myQVT.assertRegionCount(BasicMappingRegionImpl.class, 1);
myQVT.assertRegionCount(EarlyMerger.EarlyMergedMappingRegion.class, 0);
- myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 1);
- myQVT.assertRegionCount(MicroMappingRegionImpl.class, 1);
+ myQVT.assertRegionCount(LateConsumerMerger.LateMergedMappingRegion.class, 0);
+ myQVT.assertRegionCount(MicroMappingRegionImpl.class, 4);
//
myQVT.createGeneratedExecutor(txClass);
myQVT.loadInput("hsv", "SolarizedHSV.xmi");