diff options
Diffstat (limited to 'plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java')
-rw-r--r-- | plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java | 331 |
1 files changed, 232 insertions, 99 deletions
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 890ef4202..c6fa21dd9 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 @@ -56,9 +56,9 @@ import org.eclipse.ocl.pivot.NavigationCallExp; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.Parameter; import org.eclipse.ocl.pivot.Property; -import org.eclipse.ocl.pivot.SetType; import org.eclipse.ocl.pivot.ShadowPart; import org.eclipse.ocl.pivot.VariableDeclaration; +import org.eclipse.ocl.pivot.VariableExp; import org.eclipse.ocl.pivot.ids.ClassId; import org.eclipse.ocl.pivot.ids.CollectionTypeId; import org.eclipse.ocl.pivot.ids.ElementId; @@ -71,6 +71,7 @@ import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibPackage; import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.ocl.pivot.utilities.NameUtil; import org.eclipse.ocl.pivot.utilities.PivotUtil; +import org.eclipse.ocl.pivot.utilities.TreeIterable; import org.eclipse.ocl.pivot.utilities.ValueUtil; import org.eclipse.qvtd.codegen.qvti.analyzer.QVTiAS2CGVisitor; import org.eclipse.qvtd.codegen.qvti.analyzer.QVTiAnalyzer; @@ -97,9 +98,12 @@ import org.eclipse.qvtd.codegen.qvticgmodel.CGTransformation; import org.eclipse.qvtd.codegen.qvticgmodel.CGTypedModel; import org.eclipse.qvtd.codegen.qvticgmodel.util.QVTiCGModelVisitor; import org.eclipse.qvtd.codegen.utilities.QVTiCGUtil; +import org.eclipse.qvtd.pivot.qvtimperative.AppendParameterBinding; +import org.eclipse.qvtd.pivot.qvtimperative.BufferStatement; import org.eclipse.qvtd.pivot.qvtimperative.ConnectionVariable; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel; +import org.eclipse.qvtd.pivot.qvtimperative.LoopParameterBinding; import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingParameterBinding; @@ -110,7 +114,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.Connection; import org.eclipse.qvtd.runtime.evaluation.InvocationConstructor; import org.eclipse.qvtd.runtime.evaluation.InvocationManager; import org.eclipse.qvtd.runtime.evaluation.ObjectManager; @@ -443,6 +447,41 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append("}\n"); } + protected boolean doEcoreCreate(@NonNull CGValuedElement cgElement, @NonNull EClassifier eClassifier) { + boolean doSetNonNull = false; + EPackage ePackage = eClassifier.getEPackage(); + String createMethodName = "create" + eClassifier.getName(); + String javaClass; + if (ePackage != null) { + Class<?> factoryClass = genModelHelper.getEcoreFactoryClass(ePackage); + if (factoryClass != null) { + javaClass = factoryClass.getName(); + Method factoryMethod = context.getLeastDerivedMethod(factoryClass, createMethodName); + if (factoryMethod != null) { + if (context.getIsNonNull(factoryMethod) == Boolean.TRUE) { + doSetNonNull = true; + }; + } + } + else { + javaClass = genModelHelper.getQualifiedFactoryInterfaceName(ePackage); + } + } + else { + javaClass = null; + } + // + js.appendDeclaration(cgElement); + js.append(" = "); + js.appendClassReference(javaClass); + // js.appendReferenceTo(localContext.getExecutorType(cgRealizedVariable.getPivotTypeId())); + js.append(".eINSTANCE."); + js.append(createMethodName); + js.append("();\n"); + // + return doSetNonNull; + } + protected boolean doFunctionBody(@NonNull CGFunction cgFunction) { CGValuedElement body = getExpression(cgFunction.getBody()); ElementId elementId = cgFunction.getTypeId().getElementId(); @@ -784,7 +823,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(".self == thoseValues[0]"); int index = 1; for (@NonNull CGParameter cgParameter : ClassUtil.nullFree(cgFunction.getParameters())) { - js.append("\n && "); + js.append("\n\t&& "); js.append("idResolver.oclEquals("); // FIXME oclEquals / == js.appendThis(functionName); js.append("."); @@ -811,7 +850,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato int index = 0; for (@NonNull CGShadowPart cgShadowPart : ClassUtil.nullFree(cgShadowExp.getParts())) { if (index > 0) { - js.append("\n && "); + js.append("\n\t&& "); } js.append("idResolver.oclEquals("); // FIXME oclEquals / == js.append(instanceName); @@ -896,7 +935,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato int index = 0; for (@NonNull CGParameter cgFreeVariable : cgFreeVariables) { if (index > 0) { - js.append("\n && "); + js.append("\n\t&& "); } js.append("idResolver.oclEquals("); js.append(cgFreeVariable.getValueName()); @@ -943,10 +982,8 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato protected void doMappingConnectionVariable(@NonNull CGGuardVariable cgFreeVariable) { if (cgFreeVariable instanceof CGConnectionVariable) { js.append("final "); - js.appendClassReference(null, cgFreeVariable); - js.append("."); - js.appendIsRequired(true); - js.append(" Accumulator "); // FIXME Embed properly as a nested typeid + js.appendClassReference(true, Connection.class); + js.append(" "); js.append(getValueName(cgFreeVariable)); } else{ @@ -962,21 +999,20 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append("public "); js.append(getMappingName(cgMapping)); js.append("("); - if (isIncremental) { - js.appendClassReference(true, isIncremental ? InvocationConstructor.Incremental.class : InvocationConstructor.class); - js.append(" constructor, "); - } + js.appendClassReference(true, isIncremental ? InvocationConstructor.Incremental.class : InvocationConstructor.class); + js.append(" "); + js.append(QVTiGlobalContext.CONSTRUCTOR_NAME); + js.append(", "); js.appendIsRequired(true); js.append(" Object "); js.appendIsRequired(true); js.append(" [] boundValues) {\n"); js.pushIndentation(null); - if (isIncremental) { - js.append("super(invocationManager.getRootInterval(), constructor);\n"); - } - else { - js.append("super(invocationManager.getRootInterval());\n"); - } + // if (isIncremental) { + js.append("super("); + js.append(QVTiGlobalContext.CONSTRUCTOR_NAME); + js.append(");\n"); + // int i = 0; for (@NonNull CGGuardVariable cgFreeVariable : cgFreeVariables) { String valueName = getValueName(cgFreeVariable); @@ -985,8 +1021,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato // js.appendClassCast(cgFreeVariable); if (cgFreeVariable instanceof CGConnectionVariable) { js.append("("); - js.appendClassReference(null, cgFreeVariable); - js.append(".Accumulator)"); // FIXME Embed properly as a nested typeid + // js.appendClassReference(null, cgFreeVariable); + // js.append(".Accumulator)"); // FIXME Embed properly as a nested typeid + js.appendClassReference(null, Connection.class); + js.append(")"); // FIXME Embed properly as a nested typeid } else{ js.appendClassCast(cgFreeVariable); @@ -1006,8 +1044,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.appendClassReference(true, constructorClass); js.append(" " + getMappingCtorName(cgMapping) + " = new "); js.appendClassReference(constructorClass); - js.append("(invocationManager.getRootInterval(), "); + js.append("(invocationManager, "); js.appendString(QVTiCGUtil.getName(cgMapping)); + js.append(", "); + js.appendBooleanString(((Mapping)cgMapping.getAst()).isIsStrict()); js.append(")\n"); js.append("{\n"); js.pushIndentation(null); @@ -1023,9 +1063,9 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(" [] values) {\n"); js.pushIndentation(null); js.append("return new " + getMappingName(cgMapping) + "("); - if (isIncremental) { - js.append("this, "); - } + // if (isIncremental) { + js.append("this, "); + // } js.append("values);\n"); js.popIndentation(); js.append("}\n"); @@ -1134,9 +1174,8 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append("public boolean run() {\n"); js.pushIndentation(null); if (isIncremental) { - js.appendClassReference(Invocation.class); - js.append(" rootInvocation = " + getMappingCtorName(cgRootMapping) + ".getInstance(new @NonNull Object[0]);\n"); - js.append("return rootInvocation.execute() && invocationManager.flush();\n"); + js.append(getMappingCtorName(cgRootMapping) + ".invoke();\n"); + js.append("return invocationManager.flush();\n"); } else { js.append("return "); @@ -1164,6 +1203,20 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato return allImports; } + private @Nullable Iterable<@NonNull CGMappingCallBinding> getAppendBindings(@NonNull List<CGMappingCallBinding> cgMappingCallBindings) { + List<@NonNull CGMappingCallBinding> bindings = null; + for (CGMappingCallBinding cgMappingCallBinding : cgMappingCallBindings) { + Element ast = cgMappingCallBinding.getAst(); + if (ast instanceof AppendParameterBinding) { + if (bindings == null) { + bindings = new ArrayList<>(); + } + bindings.add(cgMappingCallBinding); + } + } + return bindings; + } + private EObject getContainer(EObject eObject) { EObject eContainer = eObject.eContainer(); if (eContainer != null) { @@ -1177,6 +1230,20 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato return null; } + private @Nullable Iterable<@NonNull CGMappingCallBinding> getConsumeBindings(@NonNull List<CGMappingCallBinding> cgMappingCallBindings) { + List<@NonNull CGMappingCallBinding> bindings = null; + for (CGMappingCallBinding cgMappingCallBinding : cgMappingCallBindings) { + Element ast = cgMappingCallBinding.getAst(); + if (!(ast instanceof AppendParameterBinding)) { + if (bindings == null) { + bindings = new ArrayList<>(); + } + bindings.add(cgMappingCallBinding); + } + } + return bindings; + } + @Override protected @Nullable EStructuralFeature getESObject(@NonNull Property asProperty) { EObject esObject = asProperty.getESObject(); @@ -1209,6 +1276,20 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato return (QVTiGlobalContext) globalContext; } + private @Nullable Iterable<@NonNull CGMappingCallBinding> getIterateBindings(@NonNull List<CGMappingCallBinding> cgMappingCallBindings) { + List<@NonNull CGMappingCallBinding> bindings = null; + for (CGMappingCallBinding cgMappingCallBinding : cgMappingCallBindings) { + Element ast = cgMappingCallBinding.getAst(); + if (ast instanceof LoopParameterBinding) { + if (bindings == null) { + bindings = new ArrayList<>(); + } + bindings.add(cgMappingCallBinding); + } + } + return bindings; + } + protected String getMappingCtorName(@NonNull CGMapping cgMapping) { return JavaStream.convertToJavaIdentifier("CTOR_" + cgMapping.getName()); } @@ -1234,6 +1315,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato return ""; } + private boolean isConnection(CGValuedElement source) { + return (source.getAst() instanceof VariableExp) && (((VariableExp)source.getAst()).getReferredVariable() instanceof BufferStatement); + } + private boolean isHazardous2(@NonNull NavigationCallExp asNavigationCallExp) { for (EObject eObject = asNavigationCallExp; eObject != null; eObject = getContainer(eObject)) { if (eObject instanceof ObservableStatement) { @@ -1310,7 +1395,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato BoxedDescriptor abstractBoxedDescriptor = concreteBoxedDescriptor; if (!(initValue.getASTypeId() instanceof CollectionTypeId)) { js.appendReferenceTo(cgConnectionAssignment.getConnectionVariable()); - js.append(".add("); + js.append(".append("); js.appendValueName(initValue); js.append(");\n"); } @@ -1459,41 +1544,6 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato return true; } - protected boolean doEcoreCreate(@NonNull CGValuedElement cgElement, @NonNull EClassifier eClassifier) { - boolean doSetNonNull = false; - EPackage ePackage = eClassifier.getEPackage(); - String createMethodName = "create" + eClassifier.getName(); - String javaClass; - if (ePackage != null) { - Class<?> factoryClass = genModelHelper.getEcoreFactoryClass(ePackage); - if (factoryClass != null) { - javaClass = factoryClass.getName(); - Method factoryMethod = context.getLeastDerivedMethod(factoryClass, createMethodName); - if (factoryMethod != null) { - if (context.getIsNonNull(factoryMethod) == Boolean.TRUE) { - doSetNonNull = true; - }; - } - } - else { - javaClass = genModelHelper.getQualifiedFactoryInterfaceName(ePackage); - } - } - else { - javaClass = null; - } - // - js.appendDeclaration(cgElement); - js.append(" = "); - js.appendClassReference(javaClass); - // js.appendReferenceTo(localContext.getExecutorType(cgRealizedVariable.getPivotTypeId())); - js.append(".eINSTANCE."); - js.append(createMethodName); - js.append("();\n"); - // - return doSetNonNull; - } - @Override public @NonNull Boolean visitCGFunction(@NonNull CGFunction cgFunction) { JavaLocalContext<@NonNull ?> localContext2 = globalContext.getLocalContext(cgFunction); @@ -1685,7 +1735,6 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato List<@NonNull CGGuardVariable> cgFreeVariables = ClassUtil.nullFree(cgMapping.getFreeVariables()); // js.appendCommentWithOCL(null, cgMapping.getAst()); - @NonNull String mappingName = getMappingName(cgMapping); if (useClass(cgMapping) /*&& (cgFreeVariables.size() > 0)*/) { js.append("protected class "); @@ -1693,12 +1742,16 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(" extends "); js.appendClassReference(isIncremental ? AbstractInvocation.Incremental.class : AbstractInvocation.class); js.pushClassBody(mappingName); + boolean needsNewLine = false; for (@NonNull CGGuardVariable cgFreeVariable : cgFreeVariables) { js.append("protected "); doMappingConnectionVariable(cgFreeVariable); js.append(";\n"); + needsNewLine = true; + } + if (needsNewLine) { + js.append("\n"); } - js.append("\n"); doMappingConstructor(cgMapping); js.append("\n"); js.append("@Override\n"); @@ -1774,32 +1827,85 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato // // Emit the mapping call. // - if (useClass(cgReferredMapping)) { - // if (pMappingCall.isIsInfinite()) { - // js.append("invokeOnce(" + getMappingCtorName(cgReferredMapping) + ", "); - // } - // else { - js.append("invoke(" + getMappingCtorName(cgReferredMapping) + ", "); - // } + Iterable<@NonNull CGMappingCallBinding> iterateBindings = getIterateBindings(cgMappingCallBindings); + if (isIncremental && (iterateBindings == null)) { + js.append(getMappingCtorName(cgReferredMapping)); + js.append(".connect("); + Iterable<@NonNull CGMappingCallBinding> consumeBindings = getConsumeBindings(cgMappingCallBindings); + Iterable<@NonNull CGMappingCallBinding> appendBindings = getAppendBindings(cgMappingCallBindings); + if (consumeBindings == null) { + js.append("null"); + } + else { + js.append("new "); + js.appendClassReference(true, Connection.class); + js.append("[]{"); + boolean isFirst = true; + for (@NonNull CGMappingCallBinding cgMappingCallBinding : consumeBindings) { + if (!isFirst) { + js.append(", "); + } + TypeDescriptor checkedType = needsTypeCheck(cgMappingCallBinding); + if (checkedType != null) { + js.append("("); + js.appendClassReference(checkedType); + js.append(")"); + } + js.appendValueName(cgMappingCallBinding.getValue()); + isFirst = false; + } + js.append("}"); + } + js.append(", "); + if (appendBindings == null) { + js.append("null"); + } + else { + js.append("new "); + js.appendClassReference(true, Connection.class); + js.append("[]{"); + boolean isFirst = true; + for (@NonNull CGMappingCallBinding cgMappingCallBinding : appendBindings) { + if (!isFirst) { + js.append(", "); + } + TypeDescriptor checkedType = needsTypeCheck(cgMappingCallBinding); + if (checkedType != null) { + js.append("("); + js.appendClassReference(checkedType); + js.append(")"); + } + js.appendValueName(cgMappingCallBinding.getValue()); + isFirst = false; + } + js.append("}"); + } + js.append(");\n"); } else { - js.append(getMappingName(cgReferredMapping) + "("); - } - boolean isFirst = true; - for (@SuppressWarnings("null")@NonNull CGMappingCallBinding cgMappingCallBinding : cgMappingCallBindings) { - if (!isFirst) { - js.append(", "); + if (useClass(cgReferredMapping)) { + js.append(getMappingCtorName(cgReferredMapping)); + js.append(".invoke("); } - TypeDescriptor checkedType = needsTypeCheck(cgMappingCallBinding); - if (checkedType != null) { - js.append("("); - js.appendClassReference(checkedType); - js.append(")"); + else { + js.append(getMappingName(cgReferredMapping) + "("); } - js.appendValueName(cgMappingCallBinding.getValue()); - isFirst = false; + boolean isFirst = true; + for (@SuppressWarnings("null")@NonNull CGMappingCallBinding cgMappingCallBinding : cgMappingCallBindings) { + if (!isFirst) { + js.append(", "); + } + TypeDescriptor checkedType = needsTypeCheck(cgMappingCallBinding); + if (checkedType != null) { + js.append("("); + js.appendClassReference(checkedType); + js.append(")"); + } + js.appendValueName(cgMappingCallBinding.getValue()); + isFirst = false; + } + js.append(");\n"); } - js.append(");\n"); // // End the type check. // @@ -1831,12 +1937,17 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato for (@NonNull CGAccumulator cgAccumulator : cgAccumulators) { Element ast = cgAccumulator.getAst(); js.append("final "); - js.appendClassReference(null, cgAccumulator); - js.append("."); - js.appendIsRequired(true); - js.append(" Accumulator "); + js.appendClassReference(true, Connection.class); + js.append(" "); js.appendValueName(cgAccumulator); - js.append(" = "); + js.append(" = createConnection("); + js.appendString(QVTiCGUtil.getName(cgAccumulator)); + js.append(", "); + js.appendValueName(cgAccumulator.getTypeId()); + js.append(", "); + js.appendBooleanString((ast instanceof BufferStatement) && ((BufferStatement)ast).isIsStrict()); + js.append(");\n"); + /* if ((ast instanceof ConnectionVariable) && (((ConnectionVariable)ast).getType() instanceof SetType)) { js.append("createUnenforcedSetAccumulatorValue("); } @@ -1848,7 +1959,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(".createCollectionAccumulatorValue("); } js.appendValueName(cgAccumulator.getTypeId()); - js.append(");\n"); + js.append(");\n"); */ // CGValuedElement cgInit = cgAccumulator.getInit(); if ((cgInit != null) && (!(cgInit instanceof CGCollectionExp) || !Iterables.isEmpty(((CGCollectionExp)cgInit).getParts()))) { @@ -1875,14 +1986,11 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(") {\n"); js.pushIndentation(null); js.appendReferenceTo(cgAccumulator); - js.append(".add("); + js.append(".append("); js.append(iteratorName); js.append(");\n"); js.popIndentation(); js.append("}\n"); - // js.appendClassReference(cgAccumulator); - // _m_join_m_PackageCS_m_0_0 = (SetValue.Accumulator)ValueUtil.createCollectionAccumulatorValue(SET_CLSSid_OclElement); - // cgAccumulator.accept(this); } } } @@ -1923,6 +2031,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato public @NonNull Boolean visitCGMappingLoop(@NonNull CGMappingLoop cgMappingLoop) { CGValuedElement source = getExpression(cgMappingLoop.getSource()); CGIterator iterator = cgMappingLoop.getIterators().get(0); + CGValuedElement body = cgMappingLoop.getBody(); if (!js.appendLocalStatements(source)) { return false; } @@ -1931,7 +2040,13 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(" "); js.appendValueName(iterator); js.append(" : "); - if (source.isBoxed()) { + if (isConnection(source)) { + js.appendValueName(source); + js.append(".typedIterable("); + js.appendClassReference(null, iterator); + js.append(".class)"); + } + else if (source.isBoxed()) { js.appendClassReference(ValueUtil.class); js.append(".typedIterable("); js.appendClassReference(null, iterator); @@ -1950,13 +2065,31 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<@NonNull QVTiCodeGenerato js.append(" != null) {\n"); js.pushIndentation(null); } - cgMappingLoop.getBody().accept(this); + body.accept(this); if (!iterator.isNonNull()) { js.popIndentation(); js.append("}\n"); } js.popIndentation(); js.append("}\n"); + boolean needsFlush = false; + for (EObject eObject : new TreeIterable(body, false)) { + if (eObject instanceof CGMappingCall) { + CGMappingCall cgMappingCall = (CGMappingCall)eObject; + MappingCall asMappingCall = (MappingCall) cgMappingCall.getAst(); + Mapping pReferredMapping = asMappingCall.getReferredMapping(); + if (pReferredMapping != null) { + CGMapping cgReferredMapping = analyzer.getMapping(pReferredMapping); + if ((cgReferredMapping != null) && useClass(cgReferredMapping)) { + needsFlush = true; + break; + } + } + } + } + if (needsFlush) { + js.append("invocationManager.flush();\n"); + } return true; } |