From 2e167f5a805fe0474fda70cff4ed29297bb49a67 Mon Sep 17 00:00:00 2001 From: Ed Willink Date: Sat, 8 Oct 2016 17:00:13 +0200 Subject: [500962] Incremental Invocations have constructor and sequence --- .../qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java | 35 ++++++++++++++-------- .../evaluation/QVTiIncrementalExecutor.java | 12 ++++---- .../runtime/evaluation/AbstractInvocation.java | 18 +++++++++++ .../qvtd/runtime/evaluation/Invocation.java | 9 +++++- .../evaluation/AbstractInvocationConstructor.java | 14 +++++++++ 5 files changed, 68 insertions(+), 20 deletions(-) (limited to 'plugins') 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 d39a865d5..312ba759c 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 @@ -110,6 +110,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil; import org.eclipse.qvtd.runtime.evaluation.AbstractInvocation; import org.eclipse.qvtd.runtime.evaluation.AbstractTransformer; import org.eclipse.qvtd.runtime.evaluation.AbstractValueOccurrence; +import org.eclipse.qvtd.runtime.evaluation.Invocation; import org.eclipse.qvtd.runtime.evaluation.InvocationManager; import org.eclipse.qvtd.runtime.evaluation.ObjectManager; import org.eclipse.qvtd.runtime.evaluation.TransformationExecutor; @@ -958,11 +959,18 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append("public "); js.append(getMappingName(cgMapping)); js.append("("); + if (isIncremental) { + js.appendClassReference(true, isIncremental ? Invocation.Constructor.Incremental.class : Invocation.Constructor.class); + js.append(" constructor, "); + } js.appendIsRequired(true); js.append(" Object "); js.appendIsRequired(true); js.append(" [] boundValues) {\n"); js.pushIndentation(null); + if (isIncremental) { + js.append("super(constructor);\n"); + } int i = 0; for (@NonNull CGGuardVariable cgFreeVariable : cgFreeVariables) { String valueName = getValueName(cgFreeVariable); @@ -986,13 +994,12 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato protected void doMappingConstructorConstants(/*@NonNull*/ List<@NonNull CGMapping> cgMappings) { for (@NonNull CGMapping cgMapping : cgMappings) { - if (useClass(cgMapping) && (cgMapping.getFreeVariables().size() > 0)) { + if (useClass(cgMapping) && (isIncremental || (cgMapping.getFreeVariables().size() > 0))) { + Class constructorClass = isIncremental ? AbstractInvocationConstructor.Incremental.class : AbstractInvocationConstructor.class; js.append("protected final "); - js.appendIsRequired(true); - js.append(" "); - js.appendClassReference(AbstractInvocationConstructor.class); + js.appendClassReference(true, constructorClass); js.append(" " + getMappingCtorName(cgMapping) + " = new "); - js.appendClassReference(AbstractInvocationConstructor.class); + js.appendClassReference(constructorClass); js.append("(idResolver, "); js.appendString(QVTiCGUtil.getName(cgMapping)); js.append(")\n"); @@ -1009,7 +1016,11 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.appendIsRequired(true); js.append(" [] values) {\n"); js.pushIndentation(null); - js.append("return new " + getMappingName(cgMapping) + "(values);\n"); + js.append("return new " + getMappingName(cgMapping) + "("); + if (isIncremental) { + js.append("this, "); + } + js.append("values);\n"); js.popIndentation(); js.append("}\n"); js.popIndentation(); @@ -1116,19 +1127,17 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append("@Override\n"); js.append("public boolean run() {\n"); js.pushIndentation(null); - js.append("return "); if (isIncremental) { - js.append("new "); - js.append(getMappingName(cgRootMapping)); - js.append("(new "); - js.appendIsRequired(true); - js.append(" Object[0]).execute()"); + js.appendClassReference(Invocation.class); + js.append(" rootInvocation = " + getMappingCtorName(cgRootMapping) + ".newInstance(new @NonNull Object[0]);\n"); + js.append("return rootInvocation.execute() && invocationManager.flush();\n"); } else { + js.append("return "); js.append(getMappingName(cgRootMapping)); js.append("()"); + js.append(" && invocationManager.flush();\n"); } - js.append(" && invocationManager.flush();\n"); js.popIndentation(); js.append("}\n"); } 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 de0b4e6c9..9effec8a8 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 @@ -163,11 +163,11 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor } Invocation.Constructor invocationConstructor = mapping2invocationConstructor2.get(asMapping); if (invocationConstructor == null) { - invocationConstructor = new AbstractInvocationConstructor(idResolver, QVTimperativeUtil.getName(asMapping)) + invocationConstructor = new AbstractInvocationConstructor.Incremental(idResolver, QVTimperativeUtil.getName(asMapping)) { @Override public @NonNull Invocation newInstance(@NonNull Object @NonNull [] theseValues) { - Invocation.Incremental invocation = new AbstractInvocation.Incremental() + Invocation.Incremental invocation = new AbstractInvocation.Incremental(this) { protected Object returnStatus; @@ -197,10 +197,10 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor return true; } - @Override - public String toString() { - return mappingCall.getReferredMapping().getName();// + "@" + Integer.toHexString(System.identityHashCode(this)); - } + // @Override + // public @NonNull String toString() { + // 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 f462368ab..197652e0b 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 @@ -28,10 +28,18 @@ public abstract class AbstractInvocation extends AbstractInvocationInternal public static final @NonNull List<@NonNull Object> EMPTY_OBJECT_LIST = Collections.emptyList(); public static final @NonNull List EMPTY_SLOT_LIST = Collections.emptyList(); + protected final Invocation.@NonNull Constructor constructor; + protected final int sequence; + private Set<@NonNull Object> createdObjects = null; private Set readSlots = null; private Set writeSlots = null; + protected Incremental(Invocation.Constructor.@NonNull Incremental constructor) { + this.constructor = constructor; + this.sequence = constructor.nextSequence(); + } + @Override public void addCreatedObject(@NonNull Object createdObject) { if (createdObjects == null) { @@ -63,6 +71,11 @@ public abstract class AbstractInvocation extends AbstractInvocationInternal return createdObjects != null ? createdObjects : EMPTY_OBJECT_LIST; } + @Override + public @NonNull String getName() { + return constructor.getName() + "-" + sequence; + } + @Override public @NonNull Iterable getReadSlots() { return readSlots != null ? readSlots : EMPTY_SLOT_LIST; @@ -72,6 +85,11 @@ public abstract class AbstractInvocation extends AbstractInvocationInternal public @NonNull Iterable getWriteSlots() { return writeSlots != null ? writeSlots : EMPTY_SLOT_LIST; } + + @Override + public @NonNull String toString() { + return getName(); + } } @Override diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Invocation.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Invocation.java index 6f0a46735..919d74dde 100644 --- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Invocation.java +++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/evaluation/Invocation.java @@ -46,6 +46,11 @@ public interface Invocation extends ExecutionVisitable public interface Constructor extends Nameable { + public interface Incremental extends Constructor + { + int nextSequence(); + } + /** * Return the first invocation of this constructor with argValues, using newInstance(argValues) to * create a new invocation instance if necessary. Returns null if an instance already created. @@ -61,12 +66,14 @@ public interface Invocation extends ExecutionVisitable @NonNull Invocation newInstance(@NonNull Object @NonNull [] values); } - public interface Incremental extends Invocation + public interface Incremental extends Invocation, Nameable { void addCreatedObject(@NonNull Object createdObject); void addReadSlot(SlotState.@NonNull Incremental readSlot); void addWriteSlot(SlotState.@NonNull Incremental writeSlot); @NonNull Iterable<@NonNull Object> getCreatedObjects(); + @Override + @NonNull String getName(); @NonNull Iterable getReadSlots(); @NonNull Iterable getWriteSlots(); // void invalidate(); diff --git a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractInvocationConstructor.java b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractInvocationConstructor.java index aebb0951f..b28271192 100644 --- a/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractInvocationConstructor.java +++ b/plugins/org.eclipse.qvtd.runtime/src/org/eclipse/qvtd/runtime/internal/evaluation/AbstractInvocationConstructor.java @@ -22,6 +22,20 @@ import org.eclipse.qvtd.runtime.evaluation.Invocation; public abstract class AbstractInvocationConstructor implements Invocation.Constructor { + public static abstract class Incremental extends AbstractInvocationConstructor implements Invocation.Constructor.Incremental + { + protected int sequence = 0; + + public Incremental(@NonNull IdResolver idResolver, @NonNull String name) { + super(idResolver, name); + } + + @Override + public int nextSequence() { + return sequence++; + } + } + protected final IdResolver.@NonNull IdResolverExtension idResolver; protected final @NonNull String name; -- cgit v1.2.3