diff options
author | Ed Willink | 2015-06-16 21:28:20 +0000 |
---|---|---|
committer | Ed Willink | 2015-06-18 10:40:30 +0000 |
commit | b8aeda96a33047e008e112f622fc8b429b4a577c (patch) | |
tree | 0464c7cc5f62053695d58a4e353f38328e9afd00 | |
parent | dd55e7f6dcfda5ea36b20460f765dbd62b256273 (diff) | |
download | org.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.tar.gz org.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.tar.xz org.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.zip |
[461314] IncrementalExecutor works for LAZY and INCREMENTAL modes
18 files changed, 950 insertions, 717 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 869635f9f..9bc1855a1 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 @@ -25,7 +25,6 @@ import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.examples.codegen.analyzer.NameManager; -import org.eclipse.ocl.examples.codegen.cgmodel.CGElementId; import org.eclipse.ocl.examples.codegen.cgmodel.CGExecutorProperty; import org.eclipse.ocl.examples.codegen.cgmodel.CGFinalVariable; import org.eclipse.ocl.examples.codegen.cgmodel.CGIterator; @@ -46,7 +45,6 @@ import org.eclipse.ocl.pivot.evaluation.Evaluator; import org.eclipse.ocl.pivot.ids.ClassId; import org.eclipse.ocl.pivot.ids.CollectionTypeId; import org.eclipse.ocl.pivot.ids.ElementId; -import org.eclipse.ocl.pivot.ids.PropertyId; import org.eclipse.ocl.pivot.ids.TypeId; import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.ocl.pivot.utilities.NameUtil; @@ -322,7 +320,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem } protected @Nullable String doOppositePropertyIds(@NonNull QVTiTransformationAnalysis transformationAnalysis) { - Map<Property, Integer> opposites = transformationAnalysis.getSourceCaches(); + return null; + // This code is no longer used, and since it is not used it generates undefined references + // It appears to have 'worked' only because a duplicate incomplete TransformationAnalysis was in use. +/* Map<Property, Integer> opposites = transformationAnalysis.getSourceCaches(); if (opposites.size() <= 0) { return null; } @@ -339,7 +340,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem // js.append("/*\n"); js.append(" * Array of the source PropertyIds of each Property for which unnavigable opposite property navigation may occur.\n"); - js.append(" */\n"); + js.append(" * /\n"); String oppositeIndex2propertyIdName = nameManager.getGlobalSymbolName(null, "oppositeIndex2propertyId"); js.append("private static final "); js.appendIsRequired(true); @@ -362,7 +363,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem } js.popIndentation(); js.append("};\n"); - return oppositeIndex2propertyIdName; + return oppositeIndex2propertyIdName; */ } protected void doRun(@NonNull CGTransformation cgTransformation) { @@ -1020,6 +1021,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem @Override public @NonNull Boolean visitCGTransformation(@NonNull CGTransformation cgTransformation) { + js.appendClassHeader(cgTransformation.getContainingPackage()); @SuppressWarnings("null")@NonNull Transformation transformation = (Transformation) cgTransformation.getAst(); QVTiTransformationAnalysis transformationAnalysis = context.getTransformationAnalysis(transformation); String className = cgTransformation.getName(); diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java index 503edeaeb..f2dffac8f 100644 --- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java +++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java @@ -26,6 +26,7 @@ import org.eclipse.ocl.examples.codegen.analyzer.BoxingAnalyzer; import org.eclipse.ocl.examples.codegen.analyzer.DependencyVisitor; import org.eclipse.ocl.examples.codegen.analyzer.FieldingAnalyzer; import org.eclipse.ocl.examples.codegen.analyzer.ReferencesVisitor; +import org.eclipse.ocl.examples.codegen.cgmodel.CGClass; import org.eclipse.ocl.examples.codegen.cgmodel.CGModelFactory; import org.eclipse.ocl.examples.codegen.cgmodel.CGPackage; import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement; @@ -57,7 +58,8 @@ public class QVTiCodeGenerator extends JavaCodeGenerator { protected final @NonNull QVTiAnalyzer cgAnalyzer; protected final @NonNull Transformation transformation; - private/* @LazyNonNull */String javaSourceCode = null; + private/* @LazyNonNull*/ CGPackage cgPackage; + private/* @LazyNonNull*/ String javaSourceCode = null; protected final @NonNull QVTiGlobalContext globalContext = new QVTiGlobalContext(this); protected final @NonNull Map<Transformation, QVTiTransformationAnalysis> transformation2analysis = new HashMap<Transformation, QVTiTransformationAnalysis>(); @@ -88,14 +90,36 @@ public class QVTiCodeGenerator extends JavaCodeGenerator } protected @NonNull CGPackage createCGPackage() { + CGPackage cgPackage = createCGPackage(ClassUtil.nonNullModel(transformation.getOwningPackage())); + QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer, getGlobalContext()); + CGTransformation cgTransformation = (CGTransformation) ClassUtil.nonNullState(transformation.accept(pivot2CGVisitor)); + cgPackage.getClasses().add(cgTransformation); + while (cgPackage.eContainer() != null) { + cgPackage = (CGPackage)cgPackage.eContainer(); + } + return cgPackage; + } + + protected @NonNull CGPackage createCGPackage(@NonNull org.eclipse.ocl.pivot.Package asPackage) { String packagePrefix = getOptions().getPackagePrefix(); + CGPackage cgParentPackage; + org.eclipse.ocl.pivot.Package asParentPackage = asPackage.getOwningPackage(); + if (asParentPackage != null) { + cgParentPackage = createCGPackage(asParentPackage); + } + else if (packagePrefix != null) { + cgParentPackage = CGModelFactory.eINSTANCE.createCGPackage(); + cgParentPackage.setName(packagePrefix); + } + else { + cgParentPackage = null; + } CGPackage cgPackage = CGModelFactory.eINSTANCE.createCGPackage(); - cgPackage.setName(packagePrefix); - QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer, - getGlobalContext()); - CGTransformation cgTransformation = (CGTransformation) ClassUtil - .nonNullState(transformation.accept(pivot2CGVisitor)); - cgPackage.getClasses().add(cgTransformation); + String name = asPackage.getName(); + cgPackage.setName((name != null) && (name.length() > 0)? name : "_" + transformation.getName()); + if (cgParentPackage != null) { + cgParentPackage.getPackages().add(cgPackage); + } return cgPackage; } @@ -131,11 +155,12 @@ public class QVTiCodeGenerator extends JavaCodeGenerator public @NonNull String generateClassFile() { String javaSourceCode2 = javaSourceCode; if (javaSourceCode2 == null) { - CGPackage cgPackage = createCGPackage(); - optimize(cgPackage); + CGPackage cgPackage2 = createCGPackage(); + cgPackage = cgPackage2; + optimize(cgPackage2); List<CGValuedElement> sortedGlobals = prepareGlobals(); - QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage, sortedGlobals); - generator.safeVisit(cgPackage); + QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage2, sortedGlobals); + generator.safeVisit(cgPackage2); Set<String> allImports = generator.getAllImports(); Map<String, String> long2ShortImportNames = ImportUtils.getLong2ShortImportNames(allImports); javaSourceCode = javaSourceCode2 = ImportUtils.resolveImports(generator.toString(), long2ShortImportNames); @@ -159,13 +184,18 @@ public class QVTiCodeGenerator extends JavaCodeGenerator } public @NonNull String getQualifiedName() { - String className = ClassUtil.nonNullState(transformation.getName()); - String packagePrefix = getOptions().getPackagePrefix(); - if (packagePrefix != null) { - return packagePrefix + "." + className; - } else { - return className; + StringBuilder s = new StringBuilder(); + CGPackage cgPackage = this.cgPackage; + s.append(cgPackage.getName()); + while (cgPackage.getPackages().size() > 0) { + cgPackage = cgPackage.getPackages().get(0); + s.append("."); + s.append(cgPackage.getName()); } + s.append("."); + s.append(transformation.getName()); + @SuppressWarnings("null")@NonNull String string = s.toString(); + return string; } public @NonNull QVTiTransformationAnalysis getTransformationAnalysis(@NonNull Transformation transformation) { @@ -180,13 +210,22 @@ public class QVTiCodeGenerator extends JavaCodeGenerator } public void saveSourceFile(@NonNull String savePath) throws IOException { - String javaCodeSource = generateClassFile(); - String qualifiedName = getQualifiedName(); - String saveDir = savePath + qualifiedName.replace('.', '/'); - String fileName = saveDir + ".java"; - new File(saveDir).getParentFile().mkdirs(); - Writer writer = new FileWriter(fileName); - writer.append(javaCodeSource); - writer.close(); + saveSourceFiles(ClassUtil.nonNullState(cgPackage), new File(savePath)); + } + + public void saveSourceFiles(@NonNull CGPackage cgPackage, @NonNull File parentFolder) throws IOException { + File folder = new File(parentFolder, cgPackage.getName()); + for (CGPackage cgChildPackage : cgPackage.getPackages()) { + if (cgChildPackage != null) { + saveSourceFiles(cgChildPackage, folder); + } + } + for (CGClass cgClass : cgPackage.getClasses()) { + folder.mkdirs(); + String javaCodeSource = generateClassFile(); + Writer writer = new FileWriter(new File(folder, cgClass.getName() + ".java")); + writer.append(javaCodeSource); + writer.close(); + } } } 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 2e9da7e39..5728febc6 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 @@ -250,7 +250,7 @@ public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor if (calledMapping != null) { calledMapping.accept(undecoratedVisitor); } - return null; + return true; } @Override 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 d646ee310..909ca9e67 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 @@ -30,8 +30,8 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CollectionType; -import org.eclipse.ocl.pivot.Element; import org.eclipse.ocl.pivot.NavigationCallExp; +import org.eclipse.ocl.pivot.OCLExpression; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.Variable; @@ -42,6 +42,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtcorebase.RealizedVariable; import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage; +import org.eclipse.qvtd.pivot.qvtimperative.Mapping; import org.eclipse.qvtd.pivot.qvtimperative.MappingCall; import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.AssociationStatus; @@ -52,368 +53,599 @@ import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.EvaluationStatusFac import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.MappingStatus; import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.PropertyStatus; import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.TransformationStatus; -import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder; /** * An evaluator implementation for OCL expressions. */ public class QVTiIncrementalExecutor extends BasicQVTiExecutor { - private enum Mode { - EXECUTE, // EvaluationStatus is created lazily where necessary + public enum Mode { + LAZY, // EvaluationStatus is created lazily where necessary INCREMENTAL, // EvaluationStatus is created for all mapping elements REPAIR // EvaluationStatus is updated for all mapping elements }; - private enum Usage { IN, OUT, INOUT }; - - protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus(); - protected final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>(); - protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>(); - - /** - * Non-null list while accumulating damage. - */ - private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>(); - - /** - * Mapping invocations that failed due to a not-ready value that is still not-ready. - */ - private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>(); /** - * Non-null while mapping invocations that failed due to a not-ready value that is now ready. + * EvaluationStatusManager creates and locates elements of the EvaluationStatus model. */ - private @Nullable Set<MappingStatus> unblockedMappingStatuses = null; - - private @NonNull Mode mode; - - public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI) throws IOException { - super(environmentFactory, transformationURI); - mode = Mode.EXECUTE; - } + private static class EvaluationStatusManager + { + protected final@NonNull MappingAnalysis mappingAnalysis; + protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus(); - protected void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses, - @NonNull Set<MappingStatus> dirtyMappingStatuses) { - for (MappingStatus mappingStatus : dirtyMappingStatuses) { - if (mappingStatus != null) { - int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus); - while (depth2dirtyMappingStatuses.size() <= mappingDepth) { - depth2dirtyMappingStatuses.add(null); - } - Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth); - if (mappingStatuses == null) { - mappingStatuses = new HashSet<MappingStatus>(); - depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses); + private final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>(); + + /** + * Non-null list while accumulating damage. + */ + private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>(); + + public EvaluationStatusManager(@NonNull MappingAnalysis mappingAnalysis) { + this.mappingAnalysis = mappingAnalysis; + } + + private void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses, + @NonNull Set<MappingStatus> dirtyMappingStatuses) { + for (MappingStatus mappingStatus : dirtyMappingStatuses) { + if (mappingStatus != null) { + int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus); + while (depth2dirtyMappingStatuses.size() <= mappingDepth) { + depth2dirtyMappingStatuses.add(null); + } + Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth); + if (mappingStatuses == null) { + mappingStatuses = new HashSet<MappingStatus>(); + depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses); + } + mappingStatuses.add(mappingStatus); } - mappingStatuses.add(mappingStatus); } + dirtyMappingStatuses.clear(); } - dirtyMappingStatuses.clear(); - } - protected void block(@NonNull MappingStatus mappingStatus) { - assert !mappingStatus.isIsBlocked(); - mappingStatus.setIsBlocked(true); - blockedMappingStatuses.add(mappingStatus); - Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses; - if (unblockedMappingStatuses2 != null) { - unblockedMappingStatuses2.remove(mappingStatus); + public void checkForDamage(@NonNull Resource resource) { + for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) { + EObject eObject = tit.next(); + ClassStatus classStatus = object2ClassStatus.get(eObject); + if (classStatus != null) { + for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) { + EStructuralFeature eFeature = attributeStatus.getEFeature(); + Object newValue = eObject.eGet(eFeature); + setNewValue(attributeStatus, newValue); + } + } + } } - } - public void checkForDamage(@NonNull Resource resource) { - for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) { - EObject eObject = tit.next(); - ClassStatus classStatus = object2ClassStatus.get(eObject); - if (classStatus != null) { - for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) { - EStructuralFeature eFeature = attributeStatus.getEFeature(); - Object newValue = eObject.eGet(eFeature); - setNewValue(attributeStatus, newValue); + private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) { + Object object = aThat.eGet(that2this); + if (!that2this.isMany()) { + allThese.add((EObject)object); + } + else { + @SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object; + for (EObject aThis : moreThese) { + if ((aThis != null) && !allThese.contains(aThis)) { + allThese.add(aThis); + computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese); + } } } } - } + + private @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) { + ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus(); + classStatus.setType(type); + classStatus.setEObject(eObject); + object2ClassStatus.put(eObject, classStatus); + transformationStatus.getOwnedClassStatuses().add(classStatus); + return classStatus; + } - private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) { - Object object = aThat.eGet(that2this); - if (!that2this.isMany()) { - allThese.add((EObject)object); + public @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) { + MappingStatus newMappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus(); + newMappingStatus.setReferredMappingCall(mappingCall); + newMappingStatus.getBoundValues().addAll(boundValues); + transformationStatus.getOwnedMappingStatuses().add(newMappingStatus); + return newMappingStatus; } - else { - @SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object; - for (EObject aThis : moreThese) { - if ((aThis != null) && !allThese.contains(aThis)) { - allThese.add(aThis); - computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese); + + private @Nullable PropertyStatus findAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) { + EReference that2thisEReference = this2thatEReference.getEOpposite(); + assert that2thisEReference != null; + // + // Return a pre-existing AssociationStatus + // + for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) { + EReference eReference = associationStatus.getForwardEReference(); + if (eReference == this2thatEReference) { + if (associationStatus.getFromClassStatuses().contains(classStatus)) { + return associationStatus; + } + } + if (eReference == that2thisEReference) { + if (associationStatus.getToClassStatuses().contains(classStatus)) { + return associationStatus; + } } } + return null; } - } - - protected @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) { - ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus(); - classStatus.setType(type); - classStatus.setEObject(eObject); - object2ClassStatus.put(eObject, classStatus); - transformationStatus.getOwnedClassStatuses().add(classStatus); - return classStatus; - } - - protected @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall) { - MappingStatus mappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus(); - mappingStatus.setReferredMappingCall(mappingCall); - List<Object> boundValues = mappingStatus.getBoundValues(); - for (MappingCallBinding binding : mappingCall.getBinding()) { - Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable()); - Object valueOrValues = getValueOf(boundVariable); - boundValues.add(valueOrValues); + + private @Nullable AttributeStatus findAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) { + // + // Return a pre-existing AttributeStatus + // + for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) { + if (attributeStatus.getEFeature() == eFeature) { + return attributeStatus; + } + } + return null; } - transformationStatus.getOwnedMappingStatuses().add(mappingStatus); - return mappingStatus; - } - protected void flushUnblockedMappings(@NonNull EvaluationVisitor undecoratedVisitor) { - while (unblockedMappingStatuses != null) { - List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses); - unblockedMappingStatuses = null; - for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) { - internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor); + private @Nullable ClassStatus findClassStatus(@NonNull EObject eObject) { + return object2ClassStatus.get(eObject); + } + + public @Nullable PropertyStatus findPropertyStatus(@NonNull EObject thisObject, @NonNull Property property) { + EObject eFeature = property.getESObject(); + ClassStatus classStatus = findClassStatus(thisObject); + if (classStatus == null) { + return null; + } + if (eFeature instanceof EReference) { + EReference eReference = (EReference)eFeature; + if (eReference.getEOpposite() != null) { + return findAssociationStatus(classStatus, thisObject, eReference); + } + } + if (eFeature instanceof EStructuralFeature) { + return findAttributeStatus(classStatus, (EStructuralFeature)eFeature); + } + else if (property.isIsImplicit()) { // Workaround Bug 463966 + throw new UnsupportedOperationException(); + } + else { + throw new UnsupportedOperationException(); } } - } - protected @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) { - EReference that2thisEReference = this2thatEReference.getEOpposite(); - assert that2thisEReference != null; - // - // Return a pre-existing AssociationStatus - // - for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) { - EReference eReference = associationStatus.getForwardEReference(); - if (eReference == this2thatEReference) { - if (associationStatus.getFromClassStatuses().contains(classStatus)) { - return associationStatus; - } - } - if (eReference == that2thisEReference) { - if (associationStatus.getToClassStatuses().contains(classStatus)) { - return associationStatus; - } - } - } - // - // Identify the participating EObjects, recursing for M:N associations - // - Set<EObject> allThese = new HashSet<EObject>(); - allThese.add(thisObject); - Set<EObject> allThose = new HashSet<EObject>(); - computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese); - // - // Create a new AssociationStatus - // - AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus(); - associationStatus.setForwardEReference(this2thatEReference); - // - List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses(); - for (EObject aThis : allThese) { - ClassStatus fromClassStatus = object2ClassStatus.get(aThis); - if (fromClassStatus != null) { - fromClassStatuses.add(fromClassStatus); - fromClassStatus.getAssociationStatuses().add(associationStatus); - if (fromClassStatus.isIsInput()) { - associationStatus.setIsInput(true); - } - if (fromClassStatus.isIsOutput()) { - associationStatus.setIsOutput(true); - associationStatus.setIsAssignable(true); + private @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) { + EReference that2thisEReference = this2thatEReference.getEOpposite(); + assert that2thisEReference != null; + // + // Return a pre-existing AssociationStatus + // + for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) { + EReference eReference = associationStatus.getForwardEReference(); + if (eReference == this2thatEReference) { + if (associationStatus.getFromClassStatuses().contains(classStatus)) { + return associationStatus; + } } - else { - associationStatus.setIsAssigned(true); + if (eReference == that2thisEReference) { + if (associationStatus.getToClassStatuses().contains(classStatus)) { + return associationStatus; + } + } + } + // + // Identify the participating EObjects, recursing for M:N associations + // + Set<EObject> allThese = new HashSet<EObject>(); + allThese.add(thisObject); + Set<EObject> allThose = new HashSet<EObject>(); + computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese); + // + // Create a new AssociationStatus + // + AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus(); + associationStatus.setForwardEReference(this2thatEReference); + // + List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses(); + for (EObject aThis : allThese) { + ClassStatus fromClassStatus = object2ClassStatus.get(aThis); + if (fromClassStatus != null) { + fromClassStatuses.add(fromClassStatus); + fromClassStatus.getAssociationStatuses().add(associationStatus); + if (fromClassStatus.isIsInput()) { + associationStatus.setIsInput(true); + } + if (fromClassStatus.isIsOutput()) { + associationStatus.setIsOutput(true); + associationStatus.setIsAssignable(true); + } + else { + associationStatus.setIsAssigned(true); + } + } + } + // + List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses(); + for (EObject aThat : allThose) { + ClassStatus toClassStatus = object2ClassStatus.get(aThat); + if (toClassStatus != null) { + toClassStatuses.add(toClassStatus); + toClassStatus.getAssociationStatuses().add(associationStatus); + if (toClassStatus.isIsInput()) { + associationStatus.setIsInput(true); + } + if (toClassStatus.isIsOutput()) { + associationStatus.setIsOutput(true); + associationStatus.setIsAssignable(true); + } + else { + associationStatus.setIsAssigned(true); + } } } + // + transformationStatus.getOwnedAssociationStatuses().add(associationStatus); + return associationStatus; + } + + private @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) { + // + // Return a pre-existing AttributeStatus + // + for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) { + if (attributeStatus.getEFeature() == eFeature) { + return attributeStatus; + } + } + // + // Create a new AttributeStatus + // + AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus(); + attributeStatus.setEFeature(eFeature); + classStatus.getOwnedAttributeStatuses().add(attributeStatus); + if (classStatus.isIsOutput()) { + attributeStatus.setIsAssignable(true); + } + else { + attributeStatus.setIsAssigned(true); + } + return attributeStatus; } - // - List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses(); - for (EObject aThat : allThose) { - ClassStatus toClassStatus = object2ClassStatus.get(aThat); - if (toClassStatus != null) { - toClassStatuses.add(toClassStatus); - toClassStatus.getAssociationStatuses().add(associationStatus); - if (toClassStatus.isIsInput()) { - associationStatus.setIsInput(true); + + public @NonNull ClassStatus getClassStatus(@Nullable DomainUsage domainUsage, /*@NonNull*/ Type type, @NonNull EObject eObject) { + ClassStatus classStatus = object2ClassStatus.get(eObject); + if (classStatus == null) { + classStatus = createClassStatus(type, eObject); + if ((domainUsage == null) || !isOut(domainUsage)) { + classStatus.setIsInput(true); + } + if ((domainUsage == null) || !isIn(domainUsage)) { + classStatus.setIsOutput(true); + } + } + return classStatus; + } + + public @NonNull PropertyStatus getPropertyStatus(@Nullable DomainUsage domainUsage, @NonNull EObject thisObject, @NonNull Property property) { + EObject eFeature = property.getESObject(); + ClassStatus classStatus = getClassStatus(domainUsage, property.getOwningClass(), thisObject); + PropertyStatus propertyStatus = null; + if (eFeature instanceof EReference) { + EReference eReference = (EReference)eFeature; + if (eReference.getEOpposite() != null) { + propertyStatus = getAssociationStatus(classStatus, thisObject, eReference); } - if (toClassStatus.isIsOutput()) { - associationStatus.setIsOutput(true); - associationStatus.setIsAssignable(true); + } + if (propertyStatus == null) { + if (eFeature instanceof EStructuralFeature) { + propertyStatus = getAttributeStatus(classStatus, (EStructuralFeature)eFeature); + } + else if (property.isIsImplicit()) { // Workaround Bug 463966 + throw new UnsupportedOperationException(); } else { - associationStatus.setIsAssigned(true); + throw new UnsupportedOperationException(); } } + if ((domainUsage != null) && /*(propertyStatus != null) && */isIn(domainUsage) && !mappingAnalysis.isAssigned(property, domainUsage)) { + propertyStatus.setIsAssignable(false); + propertyStatus.setIsAssigned(true); + } + return propertyStatus; } - // - transformationStatus.getOwnedAssociationStatuses().add(associationStatus); - return associationStatus; - } - - protected @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) { - // - // Return a pre-existing AttributeStatus - // - for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) { - if (attributeStatus.getEFeature() == eFeature) { - return attributeStatus; - } - } - // - // Create a new AttributeStatus - // - AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus(); - attributeStatus.setEFeature(eFeature); - classStatus.getOwnedAttributeStatuses().add(attributeStatus); - if (classStatus.isIsOutput()) { - attributeStatus.setIsAssignable(true); + + public @NonNull TransformationStatus getTransformationStatus() { + return transformationStatus; } - else { - attributeStatus.setIsAssigned(true); + + private boolean isIn(@NonNull DomainUsage domainUsage) { + return !domainUsage.isEnforceable(); } - return attributeStatus; - } - protected @NonNull ClassStatus getClassStatus(@NonNull Usage usage, /*@NonNull*/ Type type, @NonNull EObject eObject) { - ClassStatus classStatus = object2ClassStatus.get(eObject); - if (classStatus == null) { - classStatus = createClassStatus(type, eObject); - if (usage != Usage.OUT) { - classStatus.setIsInput(true); + private boolean isOut(@NonNull DomainUsage domainUsage) { + return domainUsage.isEnforceable() && !domainUsage.isCheckable(); + } + + /** + * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any + * downstream mappingStatuses affected by the re-execution. + */ + public void repairDamage() { + Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses; + if (dirtyMappingStatuses2 != null) { + List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>(); + for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) { + if (dirtyMappingStatuses2.size() > 0) { + allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2); + } + Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth); + if (mappingStatuses != null) { +// for (MappingStatus mappingStatus : mappingStatuses) { +// } + } + depth2dirtyMappingStatuses.set(cleanDepth, null); + } + dirtyMappingStatuses = null; } - if (usage != Usage.IN) { - classStatus.setIsOutput(true); + } + + protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) { + if (!propertyStatus.isIsDirty()) { + if (propertyStatus instanceof AttributeStatus) { + AttributeStatus attributeStatus = (AttributeStatus)propertyStatus; + Object oldValue = attributeStatus.getObject(); + if (!ClassUtil.safeEquals(newValue, oldValue)) { + attributeStatus.setIsDirty(true); + attributeStatus.setObject(newValue); + } + } + else { + } + for (MappingStatus mappingStatus : propertyStatus.getTargets()) { + mappingStatus.setIsDirty(true); + Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses; + if (dirtyMappingStatuses2 == null) { + dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>(); + } + dirtyMappingStatuses2.add(mappingStatus); + } } } - return classStatus; } - public String getEvaluationStatusGraph() { - GraphMLBuilder s = new GraphMLBuilder(); - transformationStatus.accept(new EvaluationStatus2GraphVisitor(s)); - return s.toString(); - } + /** + * MappingAnalysis manages additional properties determined by analysis of the Transformation or Mappings.. + */ + private static class MappingAnalysis + { + private final @NonNull QVTiTransformationAnalysis transformationAnalysis; + private final @NonNull Set<Property> hazardousProperties = new HashSet<Property>(); + private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments; + private final @NonNull Map<Property, Set<PropertyAssignment>> property2propertyAssignments = new HashMap<Property, Set<PropertyAssignment>>(); - protected @Nullable MappingStatus getMappingStatus() { - if (mappingStatusStack.isEmpty()) { - return null; - } - MappingStatus mappingStatus = mappingStatusStack.peek(); - assert mappingStatus != null; - return mappingStatus; - } - - protected @NonNull PropertyStatus getPropertyStatus(@NonNull Usage usage, @NonNull EObject thisObject, @NonNull Property property) { - EObject eFeature = property.getESObject(); - ClassStatus classStatus = getClassStatus(usage, property.getOwningClass(), thisObject); - if (eFeature instanceof EReference) { - EReference eReference = (EReference)eFeature; - if (eReference.getEOpposite() != null) { - return getAssociationStatus(classStatus, thisObject, eReference); + public MappingAnalysis(@NonNull QVTiTransformationAnalysis transformationAnalysis) { + this.transformationAnalysis = transformationAnalysis; + Set<Mapping> hazardousMappings = transformationAnalysis.getHazardousMappings(); + for (Map.Entry<Mapping, Set<Property>> entry : transformationAnalysis.getMapping2Property().entrySet()) { + Mapping mapping = entry.getKey(); + if (hazardousMappings.contains(mapping)) { + hazardousProperties.addAll(entry.getValue()); + } + } + mapping2propertyAssignments = transformationAnalysis.getMapping2PropertyAssignments(); + for (Set<PropertyAssignment> propertyAssignments : mapping2propertyAssignments.values()) { + for (PropertyAssignment propertyAssignment : propertyAssignments) { + Property property = propertyAssignment.getTargetProperty(); + Set<PropertyAssignment> assignments = property2propertyAssignments.get(property); + if (assignments == null) { + assignments = new HashSet<PropertyAssignment>(); + property2propertyAssignments.put(property, assignments); + } + assignments.add(propertyAssignment); + } } } - if (eFeature instanceof EStructuralFeature) { - return getAttributeStatus(classStatus, (EStructuralFeature)eFeature); - } - else if (property.isIsImplicit()) { // Workaround Bug 463966 - throw new UnsupportedOperationException(); - } - else { - throw new UnsupportedOperationException(); - } - } - protected @NonNull Usage getUsageForMetamodelElement(@NonNull Element element) { -/* EObject eContainer = null; - ExpressionInOCL expressionInOCL = null; - EReference eFeature = null; - for (EObject eChild = element; (eContainer = eChild.eContainer()) != null; eChild = eContainer) { -// if (eContainer instanceof ExpressionInOCL) { -// expressionInOCL = (ExpressionInOCL)eContainer; -// eFeature = eChild.eContainmentFeature(); -// break; -// } - if (eContainer instanceof Operation) { - DomainUsageAnalysis operationUsageAnalysis = usageAnalysis.analyzeOperation((Operation)eContainer); - QVTiEvaluationEnvironment evaluationEnvironment = getEvaluationEnvironment(); - break; + public boolean hasHazardousRead(@NonNull MappingCall mappingCall) { + for (MappingCallBinding callBinding : mappingCall.getBinding()) { + if (callBinding.isIsPolled()) { + return true; + } } - if (eContainer instanceof Pattern) { - break; + return false; + } + + public boolean hasHazardousWrite(@NonNull MappingCall mappingCall) { + Mapping mapping = mappingCall.getReferredMapping(); + Set<PropertyAssignment> propertyAssignments = mapping2propertyAssignments.get(mapping); + if (propertyAssignments == null) { + return false; } - if (eContainer instanceof Rule) { - break; + for (PropertyAssignment propertyAssignment : propertyAssignments) { + Property assignedProperty = propertyAssignment.getTargetProperty(); + if (hazardousProperties.contains(assignedProperty)) { + return true; + } } - if (eContainer instanceof org.eclipse.ocl.pivot.Class) { - break; + return false; + } + + public boolean isAssigned(@NonNull Property targetProperty, @NonNull DomainUsage domainUsage) { + Set<PropertyAssignment> propertyAssignments = property2propertyAssignments.get(targetProperty); + if (propertyAssignments == null) { + return false; } - if (eContainer instanceof org.eclipse.ocl.pivot.Package) { - break; + for (PropertyAssignment propertyAssignment : propertyAssignments) { + OCLExpression slotExpression = propertyAssignment.getSlotExpression(); + DomainUsage slotUsage = transformationAnalysis.getDomainUsageAnalysis().getUsage(slotExpression); + if (domainUsage == slotUsage) { + return true; + } } + return false; } - if (expressionInOCL != null) { - DomainUsage domainUsage1 = transformationAnalysis.get(element); - DomainUsage domainUsage3 = transformationAnalysis.get(expressionInOCL); - DomainUsage domainUsage2 = transformationAnalysis.get(eFeature); - - } - DomainUsage domainUsage = transformationAnalysis.get(element); */ - DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(element); - if (domainUsage == null) { - return Usage.INOUT; + + public boolean isHazardous(@NonNull Property targetProperty) { + return hazardousProperties.contains(targetProperty); } - else if (!domainUsage.isEnforceable()) { - return Usage.IN; + + } + + /** + * MappingInvocations manages the potentially repested mapping invocations, ensuring that repetitions are suppressed. + */ + private static class MappingInvocations + { + protected final @NonNull EvaluationStatusManager statusManager; + + private final @NonNull Map<Integer, List<MappingStatus>> map = new HashMap<Integer, List<MappingStatus>>(); + + public MappingInvocations(@NonNull EvaluationStatusManager statusManager) { + this.statusManager = statusManager; } - else if (domainUsage.isCheckable()) { - return Usage.INOUT; + + /** + * Return a new MappingStatus if mappingCall and boundValues represent a new mapping invocation. + * Return null if they represent a repeated invocation. + */ + public @Nullable MappingStatus createUnrepeatedMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) { + Mapping referredMapping = mappingCall.getReferredMapping(); + int newHashCode = referredMapping.hashCode(); + for (Object boundValue : boundValues) { + newHashCode = 3 * newHashCode + (boundValue != null ? boundValue.hashCode() : null); + } + List<MappingStatus> mappingStatuses = map.get(newHashCode); + if (mappingStatuses != null) { + for (MappingStatus oldMappingStatus : mappingStatuses) { + if (oldMappingStatus.getReferredMappingCall() == referredMapping) { + List<Object> oldValues = oldMappingStatus.getBoundValues(); + if (oldValues.equals(boundValues)) { + return null; + } + } + } + } + else { + mappingStatuses = new ArrayList<MappingStatus>(); + map.put(newHashCode, mappingStatuses); + } + MappingStatus newMappingStatus = statusManager.createMappingStatus(mappingCall, boundValues); + mappingStatuses.add(newMappingStatus); + return newMappingStatus; } - else { - return Usage.OUT; + } + + /** + * PendingInvocations manges the Mapping invocations that are initially blockeed as a result of a failure to excute + * and then unblocked once the problme is resulved and theya rea ready for a re-invocation. + */ + private static class PendingInvocations + { + /** + * Mapping invocations that failed due to a not-ready value that is still not-ready. + */ + private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>(); + + /** + * Non-null while mapping invocations that failed due to a not-ready value that is now ready. + */ + private @Nullable Set<MappingStatus> unblockedMappingStatuses = null; + + public void block(@NonNull MappingStatus mappingStatus) { + assert !mappingStatus.isIsBlocked(); + mappingStatus.setIsBlocked(true); + blockedMappingStatuses.add(mappingStatus); + Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses; + if (unblockedMappingStatuses2 != null) { + unblockedMappingStatuses2.remove(mappingStatus); + } } -/* org.eclipse.ocl.pivot.Package asPackage = PivotUtil.getContainingPackage(element); - if (!checkablePackages.contains(asPackage)) { - return Usage.OUT; + + public void flush(@NonNull QVTiIncrementalExecutor executor, @NonNull EvaluationVisitor undecoratedVisitor) { + while (unblockedMappingStatuses != null) { + List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses); + unblockedMappingStatuses = null; + for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) { + executor.internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor); + } + } } - else if (!enforceablePackages.contains(asPackage)) { - return Usage.IN; + + public void unblock(@NonNull MappingStatus mappingStatus) { + assert mappingStatus.isIsBlocked(); + boolean didRemove = blockedMappingStatuses.remove(mappingStatus); + assert didRemove; + mappingStatus.setIsBlocked(false); + Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses; + if (unblockedMappingStatuses2 == null) { + unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>(); + } + boolean didAdd = unblockedMappingStatuses2.add(mappingStatus); + assert didAdd; } - else { - return Usage.INOUT; - } */ + } + + protected final @NonNull Mode mode; + protected final @NonNull PendingInvocations pendingInvocations = new PendingInvocations(); + protected final @NonNull MappingAnalysis mappingAnalysis; + protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>(); + protected final @NonNull EvaluationStatusManager statusManager; + protected final @NonNull MappingInvocations mappingInvocations; + + public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI, @NonNull Mode mode) throws IOException { + super(environmentFactory, transformationURI); + this.mode = mode; + QVTiTransformationAnalysis transformationAnalysis = getModelManager().getTransformationAnalysis(); + this.mappingAnalysis = new MappingAnalysis(transformationAnalysis); + this.statusManager = new EvaluationStatusManager(mappingAnalysis); + this.mappingInvocations = new MappingInvocations(statusManager); } -// protected @NonNull Usage getUsageForTransformationElement(@NonNull Element element) { -// Domain domain = QVTimperativeUtil.getContainingDomain(element); -// return domain == null ? Usage.INOUT : Usage.OUT; -// } - + protected @Nullable MappingStatus findMappingStatus() { + if (mappingStatusStack.isEmpty()) { + return null; + } + MappingStatus mappingStatus = mappingStatusStack.peek(); +// assert mappingStatus != null; + return mappingStatus; + } + + public @NonNull TransformationStatus getTransformationStatus() { + return statusManager.getTransformationStatus(); + } + @Override public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull EvaluationVisitor undecoratedVisitor) { - MappingStatus mappingStatus = createMappingStatus(mappingCall); + List<Object> newBoundValues = new ArrayList<Object>(); + for (MappingCallBinding binding : mappingCall.getBinding()) { + Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable()); + Object valueOrValues = getValueOf(boundVariable); + newBoundValues.add(valueOrValues); + } + MappingStatus mappingStatus = null; + if (mappingCall.isIsInfinite()) { + mappingStatus = mappingInvocations.createUnrepeatedMappingStatus(mappingCall, newBoundValues); + if (mappingStatus == null) { + return false; + } + } + if ((mode != Mode.LAZY) || mappingAnalysis.hasHazardousRead(mappingCall) || mappingAnalysis.hasHazardousWrite(mappingCall)) { + mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues); + } mappingStatusStack.push(mappingStatus); try { - return super.internalExecuteMappingCall(mappingCall, undecoratedVisitor); + Object returnStatus = super.internalExecuteMappingCall(mappingCall, undecoratedVisitor); + mappingStatusStack.pop(); + pendingInvocations.flush(this, undecoratedVisitor); + return returnStatus; } catch (NotReadyValueException e) { + mappingStatusStack.pop(); + if (mappingStatus == null) { // If LAZY execution deferred creating the MappingStatus + mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues); + } if (!mappingStatus.isIsBlocked()) { - block(mappingStatus); + pendingInvocations.block(mappingStatus); } + return false; } - finally { - mappingStatusStack.pop(); - } - if (unblockedMappingStatuses != null) { - flushUnblockedMappings(undecoratedVisitor); - } - return null; } protected void internalExecuteMappingCallRetry(@NonNull MappingStatus mappingStatus, @NonNull EvaluationVisitor undecoratedVisitor) { @@ -434,7 +666,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor } catch (NotReadyValueException e) { if (!mappingStatus.isIsBlocked()) { - block(mappingStatus); + pendingInvocations.block(mappingStatus); } } finally { @@ -444,30 +676,34 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor @Override public @Nullable Object internalExecuteNavigationCallExp(@NonNull NavigationCallExp navigationCallExp, @NonNull Property referredProperty, @Nullable Object object) { - Object propertyValue = super.internalExecuteNavigationCallExp(navigationCallExp, referredProperty, object); // FIXME values - MappingStatus mappingStatus = getMappingStatus(); - if (mappingStatus == null) { - return propertyValue; - } - assert object != null; - Usage usage = getUsageForMetamodelElement(navigationCallExp); - PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, referredProperty); - if (usage == Usage.IN) { + MappingStatus mappingStatus = findMappingStatus(); + PropertyStatus propertyStatus = null; + if ((mappingStatus != null) && mappingAnalysis.isHazardous(referredProperty)) { + assert object != null; + OCLExpression source = navigationCallExp.getOwnedSource(); + DomainUsage domainUsage = source != null ? getEvaluationEnvironment().getUsageFor(source) : null; + propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, referredProperty); + List<ElementStatus> mappingInputs = mappingStatus.getInputs(); + if (!mappingInputs.contains(propertyStatus)) { + mappingInputs.add(propertyStatus); + } + if (!propertyStatus.isIsAssigned()) { + Type type = referredProperty.getType(); + if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) { + propertyStatus.setIsError(true); + throw new NotReadyValueException("Reading unassigned value"); + } + } propertyStatus.setIsAssignable(false); - propertyStatus.setIsAssigned(true); } - List<ElementStatus> mappingInputs = mappingStatus.getInputs(); - if (!mappingInputs.contains(propertyStatus)) { - mappingInputs.add(propertyStatus); + Object propertyValue = super.internalExecuteNavigationCallExp(navigationCallExp, referredProperty, object); // FIXME values + if (mode == Mode.LAZY) { + return propertyValue; } - if (!propertyStatus.isIsAssigned()) { - Type type = referredProperty.getType(); - if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) { - propertyStatus.setIsError(true); - throw new NotReadyValueException("Reading unassigned value"); - } +// MappingStatus mappingStatus = findMappingStatus(); + if (mappingStatus == null) { + return propertyValue; } - propertyStatus.setIsAssignable(false); if (propertyStatus instanceof AttributeStatus) { AttributeStatus attributeStatus = (AttributeStatus)propertyStatus; @@ -508,13 +744,22 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor @Override public @Nullable Object internalExecutePropertyAssignment(@NonNull PropertyAssignment propertyAssignment, @NonNull Object object, @Nullable Object ecoreValue) { Object propertyValue = super.internalExecutePropertyAssignment(propertyAssignment, object, ecoreValue); - Usage usage = getUsageForMetamodelElement(propertyAssignment); Property targetProperty = propertyAssignment.getTargetProperty(); assert targetProperty != null; - PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, targetProperty); - MappingStatus mappingStatus = getMappingStatus(); - assert mappingStatus != null; - mappingStatus.getOutputs().add(propertyStatus); + PropertyStatus propertyStatus; + if ((mode == Mode.LAZY) && !mappingAnalysis.isHazardous(targetProperty)) { + propertyStatus = statusManager.findPropertyStatus((EObject)object, targetProperty); + if (propertyStatus == null) { + return propertyValue; + } + } + else { + DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(propertyAssignment.getSlotExpression()); + propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, targetProperty); + MappingStatus mappingStatus = findMappingStatus(); + assert mappingStatus != null; + mappingStatus.getOutputs().add(propertyStatus); + } if (!propertyStatus.isIsAssignable()) { // Pure input propertyValue = new InvalidValueException("Illegal assignment"); propertyStatus.setIsError(true); @@ -524,7 +769,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor propertyStatus.setIsError(false); for (MappingStatus targetMappingStatus : propertyStatus.getTargets()) { if (targetMappingStatus.isIsBlocked()) { - unblock(targetMappingStatus); + pendingInvocations.unblock(targetMappingStatus); } } if (propertyStatus instanceof AttributeStatus) { @@ -537,7 +782,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor if (!ClassUtil.safeEquals(propertyValue, oldValue)) { for (MappingStatus targetMappingStatus : attributeStatus.getTargets()) { targetMappingStatus.setIsDirty(true); - unblock(targetMappingStatus); + pendingInvocations.unblock(targetMappingStatus); } } } @@ -563,14 +808,13 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor } return propertyValue; } - @Override public @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor) { Object element = super.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor); - if (element != null) { - Usage usage = getUsageForMetamodelElement(realizedVariable); - ClassStatus classStatus = getClassStatus(usage, realizedVariable.getType(), (EObject)element); - MappingStatus mappingStatus = getMappingStatus(); + if ((element != null) && (mode == Mode.INCREMENTAL)) { + DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(realizedVariable); + ClassStatus classStatus = statusManager.getClassStatus(domainUsage, realizedVariable.getType(), (EObject)element); + MappingStatus mappingStatus = findMappingStatus(); assert mappingStatus != null; mappingStatus.getOutputs().add(classStatus); } @@ -580,70 +824,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor @Override public @Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor) { Object returnStatus = super.internalExecuteTransformation(transformation, undecoratedVisitor); - flushUnblockedMappings(undecoratedVisitor); + pendingInvocations.flush(this, undecoratedVisitor); return returnStatus; } - - public void printEvaluationStatus() { - System.out.println(transformationStatus.toString()); - } - - /** - * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any - * downstream mappingStatuses affected by the re-execution. - */ - public void repairDamage() { - Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses; - if (dirtyMappingStatuses2 != null) { - List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>(); - for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) { - if (dirtyMappingStatuses2.size() > 0) { - allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2); - } - Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth); - if (mappingStatuses != null) { -// for (MappingStatus mappingStatus : mappingStatuses) { -// } - } - depth2dirtyMappingStatuses.set(cleanDepth, null); - } - dirtyMappingStatuses = null; - } - } - - protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) { - if (!propertyStatus.isIsDirty()) { - if (propertyStatus instanceof AttributeStatus) { - AttributeStatus attributeStatus = (AttributeStatus)propertyStatus; - Object oldValue = attributeStatus.getObject(); - if (!ClassUtil.safeEquals(newValue, oldValue)) { - attributeStatus.setIsDirty(true); - attributeStatus.setObject(newValue); - } - } - else { - } - for (MappingStatus mappingStatus : propertyStatus.getTargets()) { - mappingStatus.setIsDirty(true); - Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses; - if (dirtyMappingStatuses2 == null) { - dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>(); - } - dirtyMappingStatuses2.add(mappingStatus); - } - } - } - - protected void unblock(@NonNull MappingStatus mappingStatus) { - assert mappingStatus.isIsBlocked(); - boolean didRemove = blockedMappingStatuses.remove(mappingStatus); - assert didRemove; - mappingStatus.setIsBlocked(false); - Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses; - if (unblockedMappingStatuses2 == null) { - unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>(); - } - boolean didAdd = unblockedMappingStatuses2.add(mappingStatus); - assert didAdd; - } } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java index f83ba32e1..2ff06b59c 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java @@ -63,7 +63,7 @@ public class QVTiNestedEvaluationEnvironment extends BasicEvaluationEnvironment OperationCallExp operationCallExp = (OperationCallExp)callingObject; Operation referredOperation = operationCallExp.getReferredOperation(); if (referredOperation != null) { - usageAnalysis = usageAnalysis2 = getRootEvaluationEnvironment().getUsageAnalysis().getAnalysis(referredOperation); + usageAnalysis = usageAnalysis2 = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis().getAnalysis(referredOperation); // FIXME Surely we need to 'specialize' for the actual usage of callingObject } } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java index bd600ec50..42c081e5d 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java @@ -20,7 +20,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeDomainUsageAn public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment implements QVTiEvaluationEnvironment { - private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis; +// private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis; public QVTiRootEvaluationEnvironment(@NonNull QVTiExecutor executor, @NonNull Transformation executableObject) { super(executor, executableObject); @@ -42,9 +42,15 @@ public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment im assert executableObject2 != null; return (Transformation) executableObject2; } - + @Override public @Nullable DomainUsage getUsageFor(@NonNull Element element) { + QVTimperativeDomainUsageAnalysis usageAnalysis = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis();; + return usageAnalysis.getUsage(element); + } + +/* @Override + public @Nullable DomainUsage getUsageFor(@NonNull Element element) { QVTimperativeDomainUsageAnalysis usageAnalysis2 = usageAnalysis; if (usageAnalysis2 == null) { usageAnalysis2 = getUsageAnalysis(); @@ -59,5 +65,5 @@ public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment im usageAnalysis2.analyzeTransformation(getTransformation()); } return usageAnalysis2; - } + } */ } diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java index f550988c2..a80cc3b8e 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java @@ -27,6 +27,7 @@ import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.OperationCallExp; import org.eclipse.ocl.pivot.OppositePropertyCallExp; import org.eclipse.ocl.pivot.Property; +import org.eclipse.ocl.pivot.PropertyCallExp; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.ids.IdManager; import org.eclipse.ocl.pivot.ids.OperationId; @@ -36,6 +37,8 @@ import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal; import org.eclipse.qvtd.pivot.qvtbase.Transformation; import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment; import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage; +import org.eclipse.qvtd.pivot.qvtimperative.Mapping; +import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeDomainUsageAnalysis; /** @@ -57,7 +60,6 @@ public class QVTiTransformationAnalysis */ private final @NonNull QVTimperativeDomainUsageAnalysis domainAnalysis; - /** * Set of all types for which allInstances() is invoked. */ @@ -81,15 +83,27 @@ public class QVTiTransformationAnalysis /** * Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache. */ - private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>();; + private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>(); /** - * @deprecated Use EnvironmentFactoryInternal constructor + * Map from operation to the properties that it may access. */ - @Deprecated - public QVTiTransformationAnalysis(@NonNull MetamodelManagerInternal metamodelManager) { - this(metamodelManager.getEnvironmentFactory()); - } + private final @NonNull Map<Operation, Set<Property>> operation2property = new HashMap<Operation, Set<Property>>(); + + /** + * Map from mapping to the properties that it may access. + */ + private final @NonNull Map<Mapping, Set<Property>> mapping2property = new HashMap<Mapping, Set<Property>>(); + + /** + * Map from mapping to the properties that it may assign. + */ + private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments = new HashMap<Mapping, Set<PropertyAssignment>>(); + + /** + * Mappings that have an isPolled input. + */ + private final @NonNull Set<Mapping> hazardousMappings = new HashSet<Mapping>(); public QVTiTransformationAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory) { this.environmentFactory = environmentFactory; @@ -111,8 +125,73 @@ public class QVTiTransformationAnalysis } return cacheIndex; } + + private @NonNull Set<Property> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) { + Set<Property> accessedProperties = mapping2property.get(mapping); + if (accessedProperties != null) { + return accessedProperties; + } + accessedProperties = new HashSet<Property>(); + mapping2property.put(mapping, accessedProperties); + analyzeTree(accessedProperties, mapping.eAllContents()); + return accessedProperties; + } + + private @NonNull Set<PropertyAssignment> analyzeMappingPropertyAssignments(@NonNull Mapping mapping) { + Set<PropertyAssignment> assignedProperties = mapping2propertyAssignments.get(mapping); + if (assignedProperties == null) { + assignedProperties = new HashSet<PropertyAssignment>(); + mapping2propertyAssignments.put(mapping, assignedProperties); + } + for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) { + EObject eObject = treeIterator.next(); + if (eObject instanceof PropertyAssignment) { + assignedProperties.add((PropertyAssignment) eObject); + } + } + return assignedProperties; + } + + private @NonNull Set<Property> analyzeOperation(@NonNull Operation operation) { + Set<Property> operationProperties = operation2property.get(operation); + if (operationProperties != null) { + return operationProperties; + } + operationProperties = new HashSet<Property>(); + operation2property.put(operation, operationProperties); + analyzeTree(operationProperties, operation.eAllContents()); + return operationProperties; + } + + protected void analyzeTree(@NonNull Set<Property> properties, /*@NonNull*/ TreeIterator<EObject> treeIterator) { + while (treeIterator.hasNext()) { + EObject eObject = treeIterator.next(); + if (eObject instanceof OperationCallExp) { + Operation referredOperation = ((OperationCallExp)eObject).getReferredOperation(); + if (referredOperation != null) { + properties.addAll(analyzeOperation(referredOperation)); + } + } + else if (eObject instanceof PropertyCallExp) { + Property referredProperty = ((PropertyCallExp)eObject).getReferredProperty(); + if (referredProperty != null) { + properties.add(referredProperty); + } + } + else if (eObject instanceof OppositePropertyCallExp) { + Property referredOppositeProperty = ((OppositePropertyCallExp)eObject).getReferredProperty(); + if (referredOppositeProperty != null) { + Property referredProperty = referredOppositeProperty.getOpposite(); + if (referredProperty != null) { + properties.add(referredProperty); + } + } + } + } + } public void analyzeTransformation(@NonNull Transformation transformation) { + domainAnalysis.analyzeTransformation(transformation); transformation.accept(QVTiTuneUpVisitor.INSTANCE); // // First pass @@ -128,7 +207,18 @@ public class QVTiTransformationAnalysis List<PropertyAssignment> propertyAssignments = new ArrayList<PropertyAssignment>(); for (TreeIterator<EObject> tit = transformation.eAllContents(); tit.hasNext(); ) { EObject eObject = tit.next(); - if (eObject instanceof OppositePropertyCallExp) { + if (eObject instanceof Mapping) { + analyzeMappingPropertyAccesses((Mapping)eObject); + analyzeMappingPropertyAssignments((Mapping)eObject); + } + else if (eObject instanceof MappingCallBinding) { + MappingCallBinding mappingCallBinding = (MappingCallBinding)eObject; + if (mappingCallBinding.isIsPolled()) { + Mapping mapping = mappingCallBinding.getMappingCall().getReferredMapping(); + hazardousMappings.add(mapping); + } + } + else if (eObject instanceof OppositePropertyCallExp) { OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject; Property navigableProperty = oppositePropertyCallExp.getReferredProperty(); if (navigableProperty != null) { @@ -192,7 +282,7 @@ public class QVTiTransformationAnalysis } } } - + public @NonNull Set<org.eclipse.ocl.pivot.Class> getAllInstancesClasses() { return allInstancesClasses; } @@ -212,6 +302,14 @@ public class QVTiTransformationAnalysis public @NonNull Map<Property, Integer> getCaches() { return property2cacheIndex; } + + public @NonNull QVTimperativeDomainUsageAnalysis getDomainUsageAnalysis() { + return domainAnalysis; + } + + public @NonNull Set<Mapping> getHazardousMappings() { + return hazardousMappings; + } /** * Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass. @@ -238,6 +336,14 @@ public class QVTiTransformationAnalysis return instancesClassAnalysis; } + public @NonNull Map<Mapping, Set<Property>> getMapping2Property() { + return mapping2property; + } + + public @NonNull Map<Mapping, Set<PropertyAssignment>> getMapping2PropertyAssignments() { + return mapping2propertyAssignments; + } + public @NonNull MetamodelManagerInternal getMetamodelManager() { return environmentFactory.getMetamodelManager(); } 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 d35306bc7..b686e372b 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 @@ -45,7 +45,7 @@ import org.eclipse.qvtd.xtext.qvtimperative.QVTimperativeStandaloneSetup; import org.junit.Before; import org.junit.Test; -import cg.classescs2as_qvtp_qvtias; +import cg._classescs2as_qvtp_qvtias.classescs2as_qvtp_qvtias; /** * @author asbh500 diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias index 8179e8c84..f28152239 100644 --- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias +++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias @@ -9,12 +9,8 @@ <ownedImports importedNamespace="pivot:Model TargetLookup.ocl.oclas#/"/> <ownedPackages xmi:id="P." name=""> <ownedClasses xsi:type="qvtb:Transformation" xmi:id="T..Source2Target_qvtp_qvtias" name="Source2Target_qvtp_qvtias"> - <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source"> - <ownedContext name="leftCS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/> - </modelParameter> - <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target"> - <ownedContext name="rightAS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/> - </modelParameter> + <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source"/> + <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target"/> <rule xsi:type="qvti:Mapping" xmi:id="m..Source2Target_qvtp_qvtias.cSRoot_2_TRoot" name="cSRoot_2_TRoot"> <domain xsi:type="qvtcb:CoreDomain" name="leftCS" isCheckable="true" isEnforceable="false" typedModel="#qT..Source2Target_qvtp_qvtias.leftCS"> <guardPattern> @@ -262,18 +258,7 @@ </domain> <guardPattern/> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.0"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA"> <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.0" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T"> <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.1" referredProperty="SourceMM1.ecore.oclas#p.source.SRoot.ownedX"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/> @@ -282,17 +267,20 @@ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" - referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/> + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A"/> </ownedBody> <ownedIterators name="1_" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.OrderedSet.collect..T"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA"> - <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.0" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -328,27 +316,18 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> + <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/> + </value> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1"> - <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -384,18 +363,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC"> <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T"> <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T"> <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY"> @@ -403,7 +371,7 @@ </ownedSource> <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true" - referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/> + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/> </ownedBody> @@ -412,17 +380,20 @@ <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> </ownedBody> <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC"> - <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -455,27 +426,18 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> + <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/> + </value> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1"> - <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -508,18 +470,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC"> <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T"> <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T"> <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY"> @@ -527,7 +478,7 @@ </ownedSource> <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true" - referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/> + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/> </ownedBody> @@ -536,17 +487,20 @@ <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> </ownedBody> <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC"> - <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -570,27 +524,18 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> + <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/> + </value> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1"> - <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredProperty="SourceMM1.ecore.oclas#p.source.X.name"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -614,18 +559,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.5"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB"> <value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.5" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T"> <ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.6" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T"> <ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY"> @@ -633,7 +567,7 @@ </ownedSource> <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true" - referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/> + referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y1"/> </ownedBody> @@ -642,17 +576,20 @@ <ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> </ownedBody> <ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB"> - <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.5" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -669,18 +606,7 @@ </domain> <guardPattern/> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD"> <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> @@ -690,10 +616,13 @@ </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD"> - <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -710,27 +639,18 @@ </domain> <guardPattern/> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> + <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredProperty="SourceMM1.ecore.oclas#p.source.Y.name"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/> + </value> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1"> - <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredProperty="SourceMM1.ecore.oclas#p.source.Y.name"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -747,18 +667,7 @@ </domain> <guardPattern/> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD"> <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> @@ -768,10 +677,13 @@ </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD"> - <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -788,27 +700,18 @@ </domain> <guardPattern/> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> + <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" + referredProperty="SourceMM1.ecore.oclas#p.source.Y.name"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/> + </value> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/> </ownedSource> <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1"> - <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredProperty="SourceMM1.ecore.oclas#p.source.Y.name"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String" - referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -839,18 +742,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA"> <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredProperty="TargetMM1.ecore.oclas#p.target.C.toA2"> <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" @@ -869,10 +761,13 @@ referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> </ownedSource> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -903,18 +798,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC"> <value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupC..source.Z"> <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" @@ -926,10 +810,13 @@ </ownedSource> <ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -956,18 +843,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA"> <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredProperty="TargetMM1.ecore.oclas#p.target.B.toA1"> <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" @@ -986,10 +862,13 @@ referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> </ownedSource> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -1016,18 +895,7 @@ </predicate> </guardPattern> <bottomPattern> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0"> - <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> - <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" - referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> - <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/> - </ownedSource> - <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> - </value> - </assignment> - <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1"> + <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB"> <value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupB..source.Z"> <ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" @@ -1039,10 +907,13 @@ </ownedSource> <ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/> </value> - </assignment> - <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB"> - <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1"/> - <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0"/> + <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT"> + <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject" + referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast"> + <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/> + </ownedSource> + <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/> + </slotExpression> </assignment> </bottomPattern> </rule> @@ -1351,7 +1222,6 @@ </mappingStatements> </mappingStatement> </rule> - <ownedContext name="this"/> </ownedClasses> </ownedPackages> <ownedPackages xmi:id="P.$$" name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" nsPrefix="orphanage"> diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java index 399644b48..e3f3be3a3 100644 --- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java +++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._Source2Target_qvtp_qvtias; import example1.source.PathElementCS; import example1.source.PathNameCS; diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java index 6c32eaea2..618b88f43 100644 --- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java +++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._classescs2as_qvtp_qvtias; import example2.classes.ClassesFactory; import example2.classes.ClassesPackage; diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java index acc8518c8..71db8ee5f 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._ManualUML2RDBMS; import java.util.Collections; import java.util.HashMap; diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java index da91ef1ba..b9c3fc178 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._classescs2as; import classes.ClassesFactory; import classes.ClassesPackage; diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java index 1bd49efda..1b80047bc 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._classescs2as_Bug459225; import classes.ClassesFactory; import classes.ClassesPackage; diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java index 0f155cc46..b65d536ac 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg._hsv2hls; import java.util.List; import org.eclipse.jdt.annotation.NonNull; diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java index 8105203a0..92198e52f 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java @@ -7,7 +7,7 @@ * Do not edit it. ********************************************************************************/ -package cg; +package cg.test; import java.util.HashMap; import java.util.Iterator; 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 170aa7fda..2ef9e5633 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 @@ -41,8 +41,10 @@ import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtcorebase.QVTcoreBasePackage; import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor; +import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EvaluationStatus2GraphVisitor; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory; import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor; +import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder; import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative; import org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase; import org.eclipse.qvtd.xtext.qvtbase.tests.utilities.TestsXMLUtil; @@ -69,6 +71,10 @@ public class QVTiInterpreterTests extends LoadTestCase return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName); } + public @NonNull MyQvtiExecutor createEvaluator(@NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull QVTiIncrementalExecutor.Mode mode) throws IOException { + return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName, mode); + } + public @NonNull QVTiEnvironmentFactory getEnvironmentFactory() { return (QVTiEnvironmentFactory) super.getEnvironmentFactory(); } @@ -95,7 +101,10 @@ public class QVTiInterpreterTests extends LoadTestCase * @throws IOException Signals that an I/O exception has occurred. */ public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName) throws IOException { - super(environmentFactory, getProjectFileURI(fileNamePrefix + "/" + transformationFileName)); + this(environmentFactory, fileNamePrefix, transformationFileName, QVTiIncrementalExecutor.Mode.INCREMENTAL); + } + public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull Mode mode) throws IOException { + super(environmentFactory, getProjectFileURI(fileNamePrefix + "/" + transformationFileName), mode); this.fileNamePrefix = fileNamePrefix + "/"; } @@ -172,11 +181,12 @@ public class QVTiInterpreterTests extends LoadTestCase } } finally { - String s = getEvaluationStatusGraph(); + GraphMLBuilder s = new GraphMLBuilder(); + getTransformationStatus().accept(new EvaluationStatus2GraphVisitor(s)); File projectFile = getProjectFile(); - File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + "EvaluationStatus.graphml"); + File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + transformation.getName() + "_" + mode + ".graphml"); FileWriter writer = new FileWriter(graphFile); - writer.append(s); + writer.append(s.toString()); writer.close(); } } @@ -307,15 +317,34 @@ public class QVTiInterpreterTests extends LoadTestCase } /** - * Test hsv 2 hls. - * - * @throws Exception the exception + * Test tree2talltree using the INCREMENTAL evaluator. + */ + @Test + public void testTree2TallTreeIncremental() throws Exception { + MyQVT myQVT = createQVT(); + myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true); + MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.INCREMENTAL); + testEvaluator.saveTransformation(null); + testEvaluator.loadModel("tree", "Tree.xmi"); + testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi"); + testEvaluator.createModel("talltree", "TallTree.xmi"); + testEvaluator.loadReference("talltree", "TallTreeValidate.xmi"); + testEvaluator.test(); + testEvaluator.dispose(); + + URI txURI = ClassUtil.nonNullState(testEvaluator.getTransformation().eResource().getURI()); + assertLoadable(txURI); + myQVT.dispose(); + } + + /** + * Test tree2talltree using the LAZY evaluator. */ @Test - public void testTree2TallTree() throws Exception { + public void testTree2TallTreeLazy() throws Exception { MyQVT myQVT = createQVT(); myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true); - MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti"); + MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.LAZY); testEvaluator.saveTransformation(null); testEvaluator.loadModel("tree", "Tree.xmi"); testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi"); diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti index 534e4e4a4..2e3985d17 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti +++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti @@ -2,14 +2,14 @@ import simplerdbms : 'SimpleRDBMS.ecore#/'; import simpleuml : 'SimpleUML.ecore#/'; import umltordbms : 'SimpleUML2RDBMS.ecore#/'; -transformation SimpleUML2RDBMS +transformation test::SimpleUML2RDBMS { uml imports simpleuml; rdbms imports simplerdbms; middle imports umltordbms; } -map packageToSchema_LM in SimpleUML2RDBMS +map packageToSchema_LM in test::SimpleUML2RDBMS { check uml(p : Package) {} enforce middle() { @@ -21,7 +21,7 @@ map packageToSchema_LM in SimpleUML2RDBMS } } -map packageToSchema_MR in SimpleUML2RDBMS +map packageToSchema_MR in test::SimpleUML2RDBMS { enforce rdbms() { realize s : Schema @@ -33,7 +33,7 @@ map packageToSchema_MR in SimpleUML2RDBMS } } -map integerToNumber_LM in SimpleUML2RDBMS +map integerToNumber_LM in test::SimpleUML2RDBMS { check uml(p : Package, prim : PrimitiveDataType) {} @@ -49,7 +49,7 @@ map integerToNumber_LM in SimpleUML2RDBMS } } -map integerToNumber_MR in SimpleUML2RDBMS +map integerToNumber_MR in test::SimpleUML2RDBMS { enforce rdbms() {} check middle(p2s : PackageToSchema, @@ -61,7 +61,7 @@ map integerToNumber_MR in SimpleUML2RDBMS } } -map booleanToBoolean_MR in SimpleUML2RDBMS +map booleanToBoolean_MR in test::SimpleUML2RDBMS { enforce rdbms() {} check middle(p2s : PackageToSchema, @@ -74,7 +74,7 @@ map booleanToBoolean_MR in SimpleUML2RDBMS } } -map booleanToBoolean_LM in SimpleUML2RDBMS +map booleanToBoolean_LM in test::SimpleUML2RDBMS { check uml(p : Package, prim : PrimitiveDataType) {} @@ -90,7 +90,7 @@ map booleanToBoolean_LM in SimpleUML2RDBMS } } -map stringToVarchar_MR in SimpleUML2RDBMS +map stringToVarchar_MR in test::SimpleUML2RDBMS { enforce rdbms() {} check middle(p2s : PackageToSchema, @@ -102,7 +102,7 @@ map stringToVarchar_MR in SimpleUML2RDBMS } } -map stringToVarchar_LM in SimpleUML2RDBMS +map stringToVarchar_LM in test::SimpleUML2RDBMS { check uml(p : Package, prim : PrimitiveDataType) {} @@ -118,7 +118,7 @@ map stringToVarchar_LM in SimpleUML2RDBMS } } -map classToTable_MR in SimpleUML2RDBMS +map classToTable_MR in test::SimpleUML2RDBMS { enforce rdbms(s : Schema) { realize t : Table, @@ -146,7 +146,7 @@ map classToTable_MR in SimpleUML2RDBMS } } -map classToTable_LM in SimpleUML2RDBMS +map classToTable_LM in test::SimpleUML2RDBMS { check uml(p : Package, c : Class) {} @@ -162,7 +162,7 @@ map classToTable_LM in SimpleUML2RDBMS } } -map associationToForeignKey_MR in SimpleUML2RDBMS +map associationToForeignKey_MR in test::SimpleUML2RDBMS { enforce rdbms(s : Schema, st : Table, @@ -196,7 +196,7 @@ map associationToForeignKey_MR in SimpleUML2RDBMS } } -map associationToForeignKey_LM in SimpleUML2RDBMS +map associationToForeignKey_LM in test::SimpleUML2RDBMS { check uml(p : Package, sc : Class, @@ -237,7 +237,7 @@ map associationToForeignKey_LM in SimpleUML2RDBMS } } -map classPrimitiveAttributes_LM in SimpleUML2RDBMS +map classPrimitiveAttributes_LM in test::SimpleUML2RDBMS { check uml(t : PrimitiveDataType, c : Class, @@ -262,7 +262,7 @@ map classPrimitiveAttributes_LM in SimpleUML2RDBMS } } -map classComplexAttributes_LM in SimpleUML2RDBMS +map classComplexAttributes_LM in test::SimpleUML2RDBMS { check uml(t : Class, c : Class, @@ -283,7 +283,7 @@ map classComplexAttributes_LM in SimpleUML2RDBMS } } -map complexAttributePrimitiveAttributes_LM in SimpleUML2RDBMS +map complexAttributePrimitiveAttributes_LM in test::SimpleUML2RDBMS { check uml(ca : Attribute, c : Class, @@ -311,7 +311,7 @@ map complexAttributePrimitiveAttributes_LM in SimpleUML2RDBMS } } -map complexAttributeComplexAttributes_LM in SimpleUML2RDBMS +map complexAttributeComplexAttributes_LM in test::SimpleUML2RDBMS { check uml(ca : Attribute, c : Class, @@ -336,7 +336,7 @@ map complexAttributeComplexAttributes_LM in SimpleUML2RDBMS } } -map attributeColumns_MR in SimpleUML2RDBMS +map attributeColumns_MR in test::SimpleUML2RDBMS { enforce rdbms(t : Table, ct : String) { @@ -358,7 +358,7 @@ map attributeColumns_MR in SimpleUML2RDBMS } } -map __root__ in SimpleUML2RDBMS +map __root__ in test::SimpleUML2RDBMS { where () {} for p : simpleuml::Package in uml.objectsOfKind(Package) { |