[500962] Fix Incremental CG of root mapping
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
index 888dbf3..5564a6d 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
@@ -405,6 +405,7 @@
}
protected void doCreateIncrementalManagers() {
+ js.append("@Override\n");
js.append("protected ");
js.appendIsRequired(true);
js.append(" ");
@@ -417,6 +418,7 @@
js.popIndentation();
js.append("}\n");
js.append("\n");
+ js.append("@Override\n");
js.append("protected ");
js.appendIsRequired(true);
js.append(" ");
@@ -856,7 +858,12 @@
if (useGot) {
EPackage ePackage = ClassUtil.nonNullModel(eStructuralFeature.getEContainingClass().getEPackage());
//
- js.append("objectManager.got(this, ");
+ js.append("objectManager.got(");
+ if (localPrefix != null) {
+ js.append(localPrefix);
+ js.append(".");
+ }
+ js.append("this, ");
js.appendValueName(source);
js.append(", ");
js.appendClassReference(genModelHelper.getQualifiedPackageInterfaceName(ePackage));
@@ -869,6 +876,7 @@
}
protected void doIsEqual(@NonNull List<@NonNull ? extends CGParameter> cgFreeVariables) {
+ js.append("@Override\n");
js.append("public boolean isEqual(");
js.appendIsRequired(true);
js.append(" ");
@@ -880,14 +888,19 @@
js.append(" [] thoseValues) {\n");
js.pushIndentation(null);
js.append("return ");
- int index = 0;
- for (@NonNull CGParameter cgFreeVariable : cgFreeVariables) {
- if (index > 0) {
- js.append("\n && ");
+ if (cgFreeVariables.size() > 0) {
+ int index = 0;
+ for (@NonNull CGParameter cgFreeVariable : cgFreeVariables) {
+ if (index > 0) {
+ js.append("\n && ");
+ }
+ js.append("idResolver.oclEquals(");
+ js.append(cgFreeVariable.getValueName());
+ js.append(", thoseValues[" + index++ + "])");
}
- js.append("idResolver.oclEquals(");
- js.append(cgFreeVariable.getValueName());
- js.append(", thoseValues[" + index++ + "])");
+ }
+ else {
+ js.append("true");
}
js.append(";\n");
js.popIndentation();
@@ -908,7 +921,7 @@
js.pushIndentation(null);
String savedLocalPrefix = localPrefix;
try {
- localPrefix = hasMappingClass ? cgMapping.getTransformation().getName() : localPrefix;
+ localPrefix = hasMappingClass ? getMappingName(cgMapping) : localPrefix;
if (!cgBody.isInlined()) {
cgBody.accept(this);
}
@@ -1109,8 +1122,18 @@
js.append("public boolean run() {\n");
js.pushIndentation(null);
js.append("return ");
- js.append(getMappingName(cgRootMapping));
- js.append("() && invocationManager.flush();\n");
+ if (isIncremental) {
+ js.append("new ");
+ js.append(getMappingName(cgRootMapping));
+ js.append("(new ");
+ js.appendIsRequired(true);
+ js.append(" Object[0]).execute()");
+ }
+ else {
+ js.append(getMappingName(cgRootMapping));
+ js.append("()");
+ }
+ js.append(" && invocationManager.flush();\n");
js.popIndentation();
js.append("}\n");
}
@@ -1615,7 +1638,7 @@
List<@NonNull CGGuardVariable> cgFreeVariables = ClassUtil.nullFree(cgMapping.getFreeVariables());
//
js.appendCommentWithOCL(null, cgMapping.getAst());
- if (useClass(cgMapping) && (cgFreeVariables.size() > 0)) {
+ if (useClass(cgMapping) /*&& (cgFreeVariables.size() > 0)*/) {
js.append("protected class ");
js.append(getMappingName(cgMapping));
js.append(" extends ");
@@ -1631,6 +1654,7 @@
js.append("\n");
doMappingConstructor(cgMapping);
js.append("\n");
+ js.append("@Override\n");
js.append("public boolean execute() ");
doMappingBody(cgMapping, true);
js.append("\n");
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
index 9b2f6e6..a4a9c0c 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/launching/QVTiLaunchConfigurationDelegate.java
@@ -40,9 +40,9 @@
import org.eclipse.qvtd.debug.core.QVTiDebugCore;
import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
public class QVTiLaunchConfigurationDelegate extends LaunchConfigurationDelegate implements QVTiLaunchConstants
@@ -51,7 +51,7 @@
protected static final IStatus fgLaunchErrorStatus = new Status(IStatus.ERROR, QVTiDebugPlugin.PLUGIN_ID, LAUNCH_ERROR_CODE, "Launch configuration error", null); //$NON-NLS-1$
protected @NonNull QVTiExecutor createExecutor(@NonNull QVTiEnvironmentFactory envFactory, @NonNull ImperativeTransformation transformation) {
- return new BasicQVTiExecutor(envFactory, transformation);
+ return new QVTiIncrementalExecutor(envFactory, transformation, QVTiIncrementalExecutor.Mode.LAZY);
}
protected @NonNull QVTiDebugCore getDebugCore() {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
index a5f2694..012a665 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
@@ -65,7 +65,7 @@
import org.eclipse.qvtd.runtime.evaluation.AbstractTransformer;
import org.eclipse.qvtd.runtime.evaluation.InvocationFailedException;
-public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor
+public abstract class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor
{
protected final @NonNull ImperativeTransformation transformation;
private @Nullable QVTiTransformationAnalysis transformationAnalysis = null;
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
index 3b8195d..bc8e14e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/Execution2GraphVisitor.java
@@ -4,7 +4,7 @@
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
- *
+ *
* Contributors:
* E.D.Willink - initial API and implementation
******************************************************************************/
@@ -73,15 +73,15 @@
protected static @NonNull String NULL_PLACEHOLDER = "\"<null>\""; //$NON-NLS-1$
protected final @NonNull GraphStringBuilder context;
-
- private Map<AssociationStatus, String> associationId = new HashMap<AssociationStatus, String>();
- private Map<ClassStatus, String> classId = new HashMap<ClassStatus, String>();
- private Map<Invocation, GraphNode> invocation2node = new HashMap<Invocation, GraphNode>();
- private Map<Object, GraphNode> object2node = new HashMap<Object, GraphNode>();
- private Map<SlotState, GraphNode> slot2node = new HashMap<SlotState, GraphNode>();
-// private Map<String, String> propertyId2associationId = new HashMap<String, String>();
-// private Map<String, PropertyStatus> associationId2propertyStatus = new HashMap<String, PropertyStatus>();
-
+
+ private Map<@NonNull AssociationStatus, @NonNull String> associationId = new HashMap<>();
+ private Map<@NonNull ClassStatus, @NonNull String> classId = new HashMap<>();
+ private Map<@NonNull Invocation, @NonNull GraphNode> invocation2node = new HashMap<>();
+ private Map<@NonNull Object, @NonNull GraphNode> object2node = new HashMap<>();
+ private Map<@NonNull SlotState, @NonNull GraphNode> slot2node = new HashMap<>();
+ // private Map<@NonNull String, @NonNull String> propertyId2associationId = new HashMap<>();
+ // private Map<@NonNull String, @NonNull PropertyStatus> associationId2propertyStatus = new HashMap<>();
+
public Execution2GraphVisitor(@NonNull GraphStringBuilder s) {
this.context = s;
}
@@ -98,7 +98,7 @@
return associationStatus.isIsOutput() ? "#cc80ff" : "#cc0000";
}
}
-
+
protected @NonNull String getAssociationId(@NonNull AssociationStatus object) {
String id = associationId.get(object);
if (id == null) {
@@ -137,7 +137,7 @@
return classStatus.isIsOutput() ? "#cc80ff" : "#cc0000";
}
}
-
+
protected @NonNull String getClassId(@NonNull ClassStatus object) {
String id = classId.get(object);
if (id == null) {
@@ -150,14 +150,14 @@
protected @NonNull GraphNode getInvocationNode(@NonNull Invocation object) {
GraphNode node = invocation2node.get(object);
if (node == null) {
-// id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
+ // id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
final String label;
if (object instanceof EObject) {
label = ((EObject)object).eClass().getName() + "-" + (invocation2node.size() + 1);
}
else {
label = object.toString().replace("@", "\n@");
-// label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
+ // label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
}
node = new GraphNode()
{
@@ -166,7 +166,7 @@
s.setLabel(label);
s.setShape("hexagon");
s.setColor("orange");
-// context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-", "\n"));
+ // context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-", "\n"));
s.appendAttributedNode(nodeName);
}
};
@@ -176,17 +176,17 @@
return node;
}
- protected @NonNull GraphNode getObjectNode(@NonNull Object object) {
+ protected @NonNull GraphNode getObjectNode(@NonNull Object object, @NonNull String color) {
GraphNode node = object2node.get(object);
if (node == null) {
-// id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
+ // id = object.getReferredMappingCall().getReferredMapping().getName() + "-" + (mappingId.size() + 1);
final String label;
if (object instanceof EObject) {
label = ((EObject)object).eClass().getName() + "-" + (object2node.size() + 1);
}
else {
label = object.toString().replace("@", "\n@");
-// label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
+ // label = object.getClass().getSimpleName() + "-" + (invocation2node.size() + 1);
}
node = new GraphNode()
{
@@ -194,7 +194,7 @@
public void appendNode(@NonNull GraphStringBuilder s, @NonNull String nodeName) {
s.setLabel(label);
s.setShape("rectangle");
- s.setColor("blue");
+ s.setColor(color);
s.appendAttributedNode(nodeName);
}
};
@@ -216,7 +216,7 @@
}
}
- protected @NonNull GraphNode getSlotNode(SlotState.@NonNull Incremental object) {
+ protected @NonNull GraphNode getSlotNode(SlotState.@NonNull Incremental object, @NonNull String color) {
if (object.getValue() != null) {
object = object.getPrimarySlotState();
}
@@ -240,7 +240,7 @@
if (eFeature instanceof EAttribute) {
s.setStyle("rounded");
}
- s.setColor("blue");
+ s.setColor(color);
s.appendAttributedNode(nodeName);
}
};
@@ -250,13 +250,13 @@
return node;
}
-/* @Override
+ /* @Override
public String visiting(@NonNull EvaluationElement visitable) {
// append(visitable.getClass().getName());
return null;
} */
-/* @Override
+ /* @Override
public @Nullable String visitAssociationStatus(@NonNull AssociationStatus object) {
String associationId = getAssociationId(object);
String fillColor = object.isIsError() ? "#ff0000" : getAssociationColor(object);
@@ -277,7 +277,7 @@
return null;
} */
-/* @Override
+ /* @Override
public @Nullable String visitAttributeStatus(@NonNull AttributeStatus object) {
ClassStatus classStatus = object.getOwningClassStatus();
assert classStatus != null;
@@ -301,7 +301,7 @@
return null;
} */
-/* @Override
+ /* @Override
public @Nullable String visitClassStatus(@NonNull ClassStatus object) {
String classId = getClassId(object);
context.appendNode(classId, "rectangle", getClassColor(object), 30, 120, classId.replace("-", "\n"));
@@ -313,8 +313,9 @@
@Override
public @Nullable String visitInvocation(@NonNull Invocation object) {
+ @SuppressWarnings("unused")
GraphNode invocationNode = getInvocationNode(object);
-/* context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-", "\n"));
+ /* context.appendNode(mappingId, "hexagon", "#ffcc00", 30, 150, mappingId.replace("-", "\n"));
for (ElementStatus inputStatus : object.getInputs()) {
if (inputStatus instanceof ClassStatus) {
ClassStatus classStatus = (ClassStatus)inputStatus;
@@ -344,28 +345,28 @@
@Override
public @Nullable String visitInvocationManager(@NonNull InvocationManager object) {
-// context.open();
-// for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
-// classStatus.accept(this);
-// }
-// for (MappingStatus mappingStatus : object.getOwnedMappingStatuses()) {
-// mappingStatus.accept(this);
-// }
-// for (AssociationStatus associationStatus : object.getOwnedAssociationStatuses()) {
-// associationStatus.accept(this);
-// }
-// context.close();
+ // context.open();
+ // for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
+ // classStatus.accept(this);
+ // }
+ // for (MappingStatus mappingStatus : object.getOwnedMappingStatuses()) {
+ // mappingStatus.accept(this);
+ // }
+ // for (AssociationStatus associationStatus : object.getOwnedAssociationStatuses()) {
+ // associationStatus.accept(this);
+ // }
+ // context.close();
return null;
}
@Override
public @Nullable String visitObjectManager(@NonNull ObjectManager objectManager) {
- Set<Invocation.@NonNull Incremental> allInvocations = new HashSet<Invocation.@NonNull Incremental>();
- Set<SlotState.@NonNull Incremental> allSlots = new HashSet<SlotState.@NonNull Incremental>();
- Map<@NonNull Object, List<SlotState.@NonNull Incremental>> object2slots = new HashMap<@NonNull Object, List<SlotState.@NonNull Incremental>>();
- for (Object object : objectManager.getObjects()) {
- List<SlotState.Incremental> objectSlots = new ArrayList<SlotState.Incremental>();
- for (SlotState slotState : objectManager.getSlotStates(object)) {
+ Set<Invocation.@NonNull Incremental> allInvocations = new HashSet<>();
+ Set<SlotState.@NonNull Incremental> allSlots = new HashSet<>();
+ Map<@NonNull Object, @NonNull List<SlotState.@NonNull Incremental>> object2slots = new HashMap<>();
+ for (@NonNull Object object : objectManager.getObjects()) {
+ List<SlotState.@NonNull Incremental> objectSlots = new ArrayList<>();
+ for (@NonNull SlotState slotState : objectManager.getSlotStates(object)) {
if (slotState instanceof SlotState.Incremental) {
allSlots.add((SlotState.Incremental)slotState);
objectSlots.add((SlotState.Incremental)slotState);
@@ -381,28 +382,28 @@
for (Invocation.@NonNull Incremental invocation : allInvocations) {
invocation.accept(this);
GraphNode invocationNode = getInvocationNode(invocation);
- for (Object createdObject : invocation.getCreatedObjects()) {
- GraphNode objectNode = getObjectNode(createdObject);
+ for (@NonNull Object createdObject : invocation.getCreatedObjects()) {
+ GraphNode objectNode = getObjectNode(createdObject, "green");
appendEdge(invocationNode, objectNode, "green");
}
}
for (SlotState.@NonNull Incremental slotState : allSlots) {
- GraphNode slotNode = getSlotNode(slotState);
+ GraphNode slotNode = getSlotNode(slotState, "green");
slotState.accept(this);
- for (Invocation invocation : slotState.getSources()) {
+ for (@NonNull Invocation invocation : slotState.getSources()) {
appendEdge(getInvocationNode(invocation), slotNode, "green");
}
- for (Invocation invocation : slotState.getTargets()) {
+ for (@NonNull Invocation invocation : slotState.getTargets()) {
appendEdge(slotNode, getInvocationNode(invocation), "cyan");
}
Iterables.addAll(allInvocations, slotState.getTargets());
}
- for (Object object : objectManager.getObjects()) {
- GraphNode objectNode = getObjectNode(object);
+ for (@NonNull Object object : objectManager.getObjects()) {
+ GraphNode objectNode = getObjectNode(object, "blue");
List<SlotState.@NonNull Incremental> slots = object2slots.get(object);
if (slots != null) {
for (SlotState.@NonNull Incremental slotState : slots) {
- GraphNode slotNode = getSlotNode(slotState);
+ GraphNode slotNode = getSlotNode(slotState, "blue");
slotState.accept(this);
appendEdge(objectNode, slotNode, "blue");
}
@@ -413,7 +414,7 @@
@Override
public @Nullable String visitSlotState(@NonNull SlotState object) {
- GraphNode slotNode = getSlotNode((SlotState.@NonNull Incremental) object);
+ // GraphNode slotNode = getSlotNode((SlotState.@NonNull Incremental) object, "orange");
return null;
}
@@ -422,7 +423,7 @@
return null;
}
-/* @Override
+ /* @Override
public @Nullable String visitTransformationStatus(@NonNull TransformationStatus object) {
context.open();
for (ClassStatus classStatus : object.getOwnedClassStatuses()) {
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
index 2fd810d..f4edb7c 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
@@ -104,7 +104,7 @@
@NonNull Function asFunction, @Nullable Object @NonNull [] boxedSourceAndArgumentValues) {
Map<@NonNull Operation, Computation.@NonNull Constructor> operation2computationConstructor2 = operation2computationConstructor;
if (operation2computationConstructor2 == null) {
- operation2computationConstructor = operation2computationConstructor2 = new HashMap<@NonNull Operation, Computation.@NonNull Constructor>();
+ operation2computationConstructor = operation2computationConstructor2 = new HashMap<>();
}
Computation.Constructor computationConstructor = operation2computationConstructor2.get(asFunction);
if (computationConstructor == null) {
@@ -159,7 +159,7 @@
}
Map<@NonNull Mapping, Invocation.@NonNull Constructor> mapping2invocationConstructor2 = mapping2invocationConstructor;
if (mapping2invocationConstructor2 == null) {
- mapping2invocationConstructor = mapping2invocationConstructor2 = new HashMap<@NonNull Mapping, Invocation.@NonNull Constructor>();
+ mapping2invocationConstructor = mapping2invocationConstructor2 = new HashMap<>();
}
Invocation.Constructor invocationConstructor = mapping2invocationConstructor2.get(asMapping);
if (invocationConstructor == null) {
@@ -199,7 +199,7 @@
@Override
public String toString() {
- return mappingCall.getReferredMapping().getName() + "@" + Integer.toHexString(System.identityHashCode(this));
+ return mappingCall.getReferredMapping().getName();// + "@" + Integer.toHexString(System.identityHashCode(this));
}
};
return invocation;
diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
index 2c0776e..6aaa900 100644
--- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
+++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/AbstractInvocation.java
@@ -4,7 +4,7 @@
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
- *
+ *
* Contributors:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
@@ -36,7 +36,7 @@
@Override
public void addCreatedObject(@NonNull Object createdObject) {
if (createdObjects == null) {
- createdObjects = new HashSet<@NonNull Object>();
+ createdObjects = new HashSet<>();
}
createdObjects.add(createdObject);
}
@@ -44,7 +44,7 @@
@Override
public void addReadSlot(SlotState.@NonNull Incremental readSlot) {
if (readSlots == null) {
- readSlots = new HashSet<SlotState.@NonNull Incremental>();
+ readSlots = new HashSet<>();
}
readSlots.add(readSlot);
readSlot.addTargetInternal(this);
@@ -53,7 +53,7 @@
@Override
public void addWriteSlot(SlotState.@NonNull Incremental writeSlot) {
if (writeSlots == null) {
- writeSlots = new HashSet<SlotState.@NonNull Incremental>();
+ writeSlots = new HashSet<>();
}
writeSlots.add(writeSlot);
writeSlot.addSourceInternal(this);
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
index 74b38b1..5858888 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
@@ -32,6 +32,7 @@
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationExecutor;
import org.eclipse.qvtd.runtime.evaluation.TransformationExecutor;
import org.eclipse.qvtd.runtime.evaluation.Transformer;
@@ -58,7 +59,7 @@
}
public @NonNull BasicQVTiExecutor createEvaluator(@NonNull ImperativeTransformation transformation) {
- return new BasicQVTiExecutor(getEnvironmentFactory(), transformation);
+ return new QVTiIncrementalExecutor(getEnvironmentFactory(), transformation, QVTiIncrementalExecutor.Mode.LAZY);
}
public @NonNull TransformationExecutor createEvaluator(@NonNull Class<? extends Transformer> txClass) throws ReflectiveOperationException {
@@ -183,8 +184,6 @@
private void trackExample_Interpreted(MyQVT qvt, @NonNull ImperativeTransformation tx, URI baseURI, String modelName,
Map<String, List<Integer>> results) throws Exception {
-
-
long initStamp = System.currentTimeMillis();
executeModelsTX_Interpreted(qvt, tx, baseURI, modelName);
long finalStamp = System.currentTimeMillis();
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
index b4b6546..54e612b 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiCompilerTests.java
@@ -117,9 +117,10 @@
return asResource;
}
- protected @NonNull Class<? extends Transformer> generateCode(@NonNull Transformation asTransformation) throws Exception {
+ protected @NonNull Class<? extends Transformer> generateCode(@NonNull Transformation asTransformation, boolean isIncremental) throws Exception {
QVTiCodeGenerator cg = new QVTiCodeGenerator(getEnvironmentFactory(), asTransformation);
QVTiCodeGenOptions options = cg.getOptions();
+ options.setIsIncremental(isIncremental);
options.setUseNullAnnotations(true);
options.setPackagePrefix("cg_qvtimperative_tests");
cg.generateClassFile();
@@ -220,7 +221,7 @@
URI outputModelURI = getProjectFileURI("HSV2HLS/HLSNode.xmi");
URI referenceModelURI = getProjectFileURI("HSV2HLS/HLSNodeValidate.xmi");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
Transformer tx = myQVT.createTransformer(txClass);
myQVT.loadInput(tx, "hsv", inputModelURI);
tx.run();
@@ -233,7 +234,7 @@
URI transformURI = getProjectFileURI("ClassesCS2AS/ClassesCS2AS.qvti");
URI genModelURI = getProjectFileURI("ClassesCS2AS/ClassesCS2AS.genmodel");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- myQVT.generateCode(asTransformation);
+ myQVT.generateCode(asTransformation, false);
myQVT.dispose();
}
@@ -245,7 +246,7 @@
URI outputModelURI = getProjectFileURI("ClassesCS2AS/bug459225/example_output.xmi");
URI referenceModelURI = getProjectFileURI("ClassesCS2AS/bug459225/example_output_ref.xmi");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
Transformer tx = myQVT.createTransformer(txClass);
myQVT.loadInput(tx, "leftCS", inputModelURI);
tx.run();
@@ -261,7 +262,7 @@
URI outputModelURI = getProjectFileURI("ManualUML2RDBMS/ManualRDBMSPeople.xmi");
URI referenceModelURI = getProjectFileURI("ManualUML2RDBMS/ManualRDBMSPeopleValidate.xmi");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
Transformer tx = myQVT.createTransformer(txClass);
myQVT.loadInput(tx, "uml", inputModelURI);
tx.run();
@@ -277,7 +278,7 @@
URI outputModelURI = getProjectFileURI("SimpleUML2RDBMS/SimpleRDBMSPeople.xmi");
URI referenceModelURI = getProjectFileURI("SimpleUML2RDBMS/SimpleRDBMSPeopleValidate.xmi");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
Transformer tx = myQVT.createTransformer(txClass);
myQVT.loadInput(tx, "uml", inputModelURI);
tx.run();
@@ -294,7 +295,24 @@
URI outputModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.xmi");
URI referenceModelURI = getProjectFileURI("Tree2TallTree/TallTreeValidate.xmi");
Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
- Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, false);
+ Transformer tx = myQVT.createTransformer(txClass);
+ myQVT.loadInput(tx, "tree", inputModelURI);
+ tx.run();
+ myQVT.saveOutput(tx, "talltree", outputModelURI, referenceModelURI, null);
+ myQVT.dispose();
+ }
+
+ public void testCG_Tree2TallTree_Incremental_qvti() throws Exception {
+ // AbstractTransformer.INVOCATIONS.setState(true);
+ MyQVT myQVT = createQVT();
+ URI genModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.genmodel");
+ URI transformURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.qvti");
+ URI inputModelURI = getProjectFileURI("Tree2TallTree/Tree.xmi");
+ URI outputModelURI = getProjectFileURI("Tree2TallTree/Tree2TallTree.xmi");
+ URI referenceModelURI = getProjectFileURI("Tree2TallTree/TallTreeValidate.xmi");
+ Transformation asTransformation = myQVT.loadTransformation(transformURI, genModelURI);
+ Class<? extends Transformer> txClass = myQVT.generateCode(asTransformation, true);
Transformer tx = myQVT.createTransformer(txClass);
myQVT.loadInput(tx, "tree", inputModelURI);
tx.run();
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
index 8eaa5c1..4ed0079 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
@@ -46,7 +46,6 @@
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel;
import org.eclipse.qvtd.pivot.qvtimperative.QVTimperativePackage;
-import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
@@ -486,8 +485,9 @@
assertLoadable(ClassUtil.nonNullState(txURI));
QVTiEnvironmentFactory environmentFactory = myQVT.getEnvironmentFactory();
- BasicQVTiExecutor testExecutor = new BasicQVTiExecutor(environmentFactory,
- (@NonNull ImperativeTransformation) ClassUtil.nonNullState(loadTransformation(environmentFactory.getMetamodelManager(), txURI)));
+ QVTiIncrementalExecutor testExecutor = new QVTiIncrementalExecutor(environmentFactory,
+ (ImperativeTransformation) ClassUtil.nonNullState(loadTransformation(environmentFactory.getMetamodelManager(), txURI)),
+ QVTiIncrementalExecutor.Mode.LAZY);
URI csModelURI = baseURI.appendSegment("example_input.xmi");
URI asModelURI = baseURI.appendSegment("example_output.xmi");