diff options
author | Ed Willink | 2016-04-28 09:55:31 +0000 |
---|---|---|
committer | Ed Willink | 2016-04-28 20:31:55 +0000 |
commit | 5329de8b11eed039ba89135f56f01edbd8715db2 (patch) | |
tree | 3ff67cf051ffd495503aa878bd3a04ef40a7ec0b | |
parent | 2705c8416e40c97ab955e6177696edaf48dcabad (diff) | |
download | org.eclipse.qvtd-5329de8b11eed039ba89135f56f01edbd8715db2.tar.gz org.eclipse.qvtd-5329de8b11eed039ba89135f56f01edbd8715db2.tar.xz org.eclipse.qvtd-5329de8b11eed039ba89135f56f01edbd8715db2.zip |
[unrelated] Improve diagnosis of ambiguous usage
12 files changed, 55 insertions, 28 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/etl/scheduling/QVTp2QVTg.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/etl/scheduling/QVTp2QVTg.java index c77b7086e..28172c1fa 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/etl/scheduling/QVTp2QVTg.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/etl/scheduling/QVTp2QVTg.java @@ -399,7 +399,7 @@ public class QVTp2QVTg { } valueUsage = domainUsageAnalysis.intersection(propertyUsage, valueUsage); } - TypedModel oppositeTypedModel = valueUsage.getTypedModel(); + TypedModel oppositeTypedModel = valueUsage.getTypedModel(propAssign); if (oppositeTypedModel == null) { throw new IllegalStateException("No left/right DomainUsage commonality for \"" + propAssign + "\""); } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/schedule2qvti/BasicRegion2Mapping.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/schedule2qvti/BasicRegion2Mapping.java index dd0562e08..6b5be5317 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/schedule2qvti/BasicRegion2Mapping.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/schedule2qvti/BasicRegion2Mapping.java @@ -303,9 +303,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping } else if (edgeRole.isPredicated()) { OCLExpression source = create(edge.getSource()); - if (source != null) { - return PivotUtil.createNavigationCallExp(source, ((NavigationEdge)edge).getProperty()); - } + return PivotUtil.createNavigationCallExp(source, ((NavigationEdge)edge).getProperty()); } } } @@ -324,9 +322,9 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping return false; } - public boolean isConditional(@NonNull Node node) { - return conditionalNodes.contains(node); - } +// public boolean isConditional(@NonNull Node node) { +// return conditionalNodes.contains(node); +// } @Override public @NonNull OCLExpression visitCollectionLiteralExp(@NonNull CollectionLiteralExp pCollectionLiteralExp) { @@ -1312,7 +1310,7 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping private void createRealizedVariables() { for (@NonNull Node node : region.getRealizedVariableNodes()) { ClassDatumAnalysis classDatumAnalysis = node.getClassDatumAnalysis(); - BottomPattern bottomPattern = getArea(classDatumAnalysis.getDomainUsage()).getBottomPattern(); + BottomPattern bottomPattern = getArea(classDatumAnalysis).getBottomPattern(); RealizedVariable realizedVariable = QVTimperativeUtil.createRealizedVariable(getSafeName(node), classDatumAnalysis.getCompleteClass().getPrimaryClass()); bottomPattern.getRealizedVariable().add(realizedVariable); Variable oldVariable = node2variable.put(node, realizedVariable); @@ -1453,8 +1451,8 @@ public class BasicRegion2Mapping extends AbstractRegion2Mapping return recursiveDepth; } */ - private @NonNull Area getArea(@NonNull DomainUsage domainUsage) { - TypedModel qvtpTypedModel = domainUsage.getTypedModel(); + private @NonNull Area getArea(@NonNull ClassDatumAnalysis classDatumAnalysis) { + TypedModel qvtpTypedModel = classDatumAnalysis.getTypedModel(); ImperativeDomain coreDomain = typedModel2domain.get(qvtpTypedModel); if (coreDomain != null) { return coreDomain; diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/AbstractNode.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/AbstractNode.java index c9a8bf875..9317e1403 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/AbstractNode.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/AbstractNode.java @@ -635,7 +635,7 @@ public abstract class AbstractNode implements Node DomainUsage.Internal newDomainUsage = (Internal) newClassDatumAnalysis.getDomainUsage(); int refinedBitMask = oldDomainUsage.getMask() & newDomainUsage.getMask(); DomainUsage refinedDomainUsage = domainAnalysis.getConstantUsage(refinedBitMask); - TypedModel refinedTypedModel = refinedDomainUsage.getTypedModel(); + TypedModel refinedTypedModel = refinedDomainUsage.getTypedModel(oldCompleteClass); assert refinedTypedModel != null; classDatumAnalysis = getSchedulerConstants().getClassDatumAnalysis(oldCompleteClass.getPrimaryClass(), refinedTypedModel); return true; @@ -646,7 +646,7 @@ public abstract class AbstractNode implements Node DomainUsage.Internal newDomainUsage = (Internal) newClassDatumAnalysis.getDomainUsage(); int refinedBitMask = oldDomainUsage.getMask() & newDomainUsage.getMask(); DomainUsage refinedDomainUsage = domainAnalysis.getConstantUsage(refinedBitMask); - TypedModel refinedTypedModel = refinedDomainUsage.getTypedModel(); + TypedModel refinedTypedModel = refinedDomainUsage.getTypedModel(newCompleteClass); assert refinedTypedModel != null; classDatumAnalysis = getSchedulerConstants().getClassDatumAnalysis(newCompleteClass.getPrimaryClass(), refinedTypedModel); return true; diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ClassDatumAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ClassDatumAnalysis.java index ca5c5ba3c..a23c0c221 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ClassDatumAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ClassDatumAnalysis.java @@ -139,7 +139,7 @@ public class ClassDatumAnalysis Type asClass = classDatum.getType(); assert asClass != null; CompleteClass completeClass = environmentFactory.getCompleteModel().getCompleteClass(asClass); - for (@SuppressWarnings("null")@NonNull Property property : completeClass.getProperties((FeatureFilter)null)) { + for (@NonNull Property property : completeClass.getProperties((FeatureFilter)null)) { Property oppositeProperty = property.getOpposite(); if ((oppositeProperty != null) && oppositeProperty.isIsMany() && !oppositeProperty.isIsDerived()) { Type childrenType = oppositeProperty.getType(); @@ -189,8 +189,8 @@ public class ClassDatumAnalysis List<@NonNull ClassDatumAnalysis> superClassDatumAnalyses2 = superClassDatumAnalyses; if (superClassDatumAnalyses2 == null) { superClassDatumAnalyses = superClassDatumAnalyses2 = new ArrayList<@NonNull ClassDatumAnalysis>(); - for (@SuppressWarnings("null")@NonNull CompleteClass completeSuperClass : completeClass.getSuperCompleteClasses()) { - superClassDatumAnalyses2.add(schedulerConstants.getClassDatumAnalysis(completeSuperClass.getPrimaryClass(), ClassUtil.nonNullState(domainUsage.getTypedModel()))); + for (@NonNull CompleteClass completeSuperClass : completeClass.getSuperCompleteClasses()) { + superClassDatumAnalyses2.add(schedulerConstants.getClassDatumAnalysis(completeSuperClass.getPrimaryClass(), ClassUtil.nonNullState(domainUsage.getTypedModel(completeClass)))); } } return superClassDatumAnalyses2; diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ExpressionAnalyzer.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ExpressionAnalyzer.java index 24a52d101..c97057415 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ExpressionAnalyzer.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ExpressionAnalyzer.java @@ -726,7 +726,7 @@ public class ExpressionAnalyzer extends AbstractExtendingQVTimperativeVisitor<@N DomainUsage domainUsage = scheduler.getDomainUsage(typeExp); Type referredType = typeExp.getReferredType(); assert referredType != null; - TypedModel typedModel = domainUsage.getTypedModel(); + TypedModel typedModel = domainUsage.getTypedModel(typeExp); assert typedModel != null; ClassDatumAnalysis classDatumAnalysis = scheduler.getClassDatumAnalysis((org.eclipse.ocl.pivot.Class)referredType, typedModel); String typeName = PrettyPrinter.printType(classDatumAnalysis.getCompleteClass()); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Nodes.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Nodes.java index cd197862d..7a0250973 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Nodes.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/Nodes.java @@ -993,7 +993,7 @@ public class Nodes SchedulerConstants schedulerConstants = region.getSchedulerConstants(); org.eclipse.ocl.pivot.Class booleanType = schedulerConstants.getStandardLibrary().getBooleanType(); DomainUsage primitiveUsage = schedulerConstants.getDomainAnalysis().getPrimitiveUsage(); - ClassDatumAnalysis classDatumAnalysis = schedulerConstants.getClassDatumAnalysis(booleanType, ClassUtil.nonNullState(primitiveUsage.getTypedModel())); + ClassDatumAnalysis classDatumAnalysis = schedulerConstants.getClassDatumAnalysis(booleanType, ClassUtil.nonNullState(primitiveUsage.getTypedModel(null))); return createSimpleNode(region, "«true»", classDatumAnalysis); } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java index 93bed1e4f..c9e423b44 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/OperationRegion.java @@ -93,7 +93,7 @@ public class OperationRegion extends AbstractRegion implements SimpleRegion if (stepUsage.isOutput() && !stepUsage.isInput()) { // System.out.println("!checkable && enforceable: " + steps); org.eclipse.ocl.pivot.Class stepType = steps.get(0).getElementalType(); - TypedModel typedModel = stepUsage.getTypedModel(); + TypedModel typedModel = stepUsage.getTypedModel(classStep.getElement()); assert typedModel != null; ClassDatumAnalysis classDatumAnalysis = schedulerConstants.getClassDatumAnalysis(stepType, typedModel); if (!(classDatumAnalysis.getCompleteClass().getPrimaryClass() instanceof DataType)) { @@ -166,7 +166,7 @@ public class OperationRegion extends AbstractRegion implements SimpleRegion SchedulerConstants schedulerConstants = getSchedulerConstants(); org.eclipse.ocl.pivot.Class type = (org.eclipse.ocl.pivot.Class)expression.getType(); assert type != null; - TypedModel typedModel = schedulerConstants.getDomainUsage(expression).getTypedModel(); + TypedModel typedModel = schedulerConstants.getDomainUsage(expression).getTypedModel(expression); assert typedModel != null; ClassDatumAnalysis classDatumAnalysis = schedulerConstants.getClassDatumAnalysis(type, typedModel); SimpleNode parameterNode = Nodes.PARAMETER.createSimpleNode(this, name, classDatumAnalysis); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/RootScheduledRegion.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/RootScheduledRegion.java index fef1c2836..91b873643 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/RootScheduledRegion.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/RootScheduledRegion.java @@ -80,7 +80,7 @@ public class RootScheduledRegion extends AbstractScheduledRegion /** * The input models that may introduce model elements for transformation. */ - private final @NonNull HashMap<@NonNull Model, @NonNull DomainUsage> inputModels = new HashMap<@NonNull Model, @NonNull DomainUsage>(); + private final @NonNull Map<@NonNull Model, @NonNull DomainUsage> inputModels = new HashMap<@NonNull Model, @NonNull DomainUsage>(); /** * Mapping from each input class to the composite properties that may contain the class or its subclasses. @@ -387,6 +387,7 @@ public class RootScheduledRegion extends AbstractScheduledRegion List<org.eclipse.ocl.pivot.@NonNull Package> allPackagesList = new ArrayList<org.eclipse.ocl.pivot.@NonNull Package>(); for (@NonNull Model asModel : inputModels.keySet()) { DomainUsage domainUsage = inputModels.get(asModel); + assert domainUsage != null; for (org.eclipse.ocl.pivot.@NonNull Package asPackage : ClassUtil.nullFree(asModel.getOwnedPackages())) { if (allPackagesSet.put(asPackage, domainUsage) == null) { allPackagesList.add(asPackage); @@ -437,7 +438,7 @@ public class RootScheduledRegion extends AbstractScheduledRegion private void computeContainedClassDatumAnalysis2compositeProperties3(@NonNull Property asProperty, @NonNull DomainUsage domainUsage) { Type asType = QVTbaseUtil.getElementalType(ClassUtil.nonNullState(asProperty.getType())); if (asType instanceof org.eclipse.ocl.pivot.Class) { - ClassDatumAnalysis classDatumAnalysis = getSchedulerConstants().getClassDatumAnalysis((Class) asType, ClassUtil.nonNullState(domainUsage.getTypedModel())); + ClassDatumAnalysis classDatumAnalysis = getSchedulerConstants().getClassDatumAnalysis((Class) asType, ClassUtil.nonNullState(domainUsage.getTypedModel(null))); Set<@NonNull Property> compositeProperties = containedClassDatumAnalysis2compositeProperties.get(classDatumAnalysis); if (compositeProperties == null) { compositeProperties = new HashSet<@NonNull Property>(); diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/SchedulerConstants.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/SchedulerConstants.java index 604ca040c..b02e5619a 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/SchedulerConstants.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/SchedulerConstants.java @@ -233,7 +233,7 @@ public abstract class SchedulerConstants else { DomainUsage domainUsage = getDomainUsage(asTypedElement); assert domainUsage != null; - typedModel = domainUsage.getTypedModel(); + typedModel = domainUsage.getTypedModel(asTypedElement); assert typedModel != null; } return qvtp2qvtg.getClassDatum(typedModel, asType); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/DomainUsage.java b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/DomainUsage.java index fb8d6ced5..8f62049b9 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/DomainUsage.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/DomainUsage.java @@ -13,6 +13,7 @@ package org.eclipse.qvtd.pivot.qvtcorebase.analysis; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.Element; +import org.eclipse.ocl.pivot.NamedElement; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; /** @@ -48,8 +49,19 @@ public interface DomainUsage /** * Return the TypedModel for this usage, null for none, non-null for one, Exception for more than one. * Note that a primitive TypedModel may be returned for DataType usage; it has no container. + * + * @deprecated specify a context */ + @Deprecated @Nullable TypedModel getTypedModel() throws IllegalStateException; + + /** + * Return the TypedModel for this usage, null for none, non-null for one, Exception for more than one. + * Note that a primitive TypedModel may be returned for DataType usage; it has no container. + * + * Any ambiguous usgae is diagnosed with respect to the optional context. + */ + @Nullable TypedModel getTypedModel(@Nullable Element context) throws IllegalStateException; /** * Return all the TypedModels for this usage. Note that a primitive TypedModel may be returned for DataType usage; it has no container. @@ -76,12 +88,12 @@ public interface DomainUsage boolean isEnforceable(); /** - * Return true if this usage includes usage in an input domain, a domain the is fully not-enforceable transformation-wide. + * Return true if this usage includes usage in an input domain, a domain that is fully not-enforceable transformation-wide. */ boolean isInput(); /** - * Return true if this usage includes usage in the middle domain, a domain the is partially enforceable transformation-wide. + * Return true if this usage includes usage in the middle domain, a domain that is partially enforceable transformation-wide. */ boolean isMiddle(); @@ -89,6 +101,11 @@ public interface DomainUsage * Return true if this usage includes usage in an output domain, a domain that is fully enforceable transformation-wide. */ boolean isOutput(); + + /** + * Return true if this usage includes usage in a primitive domain, a domain that is just used. + */ + boolean isPrimitive(); public interface Internal extends DomainUsage, Comparable<DomainUsage.Internal> { diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/RootDomainUsageAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/RootDomainUsageAnalysis.java index 3237f5c36..c024af97d 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/RootDomainUsageAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/RootDomainUsageAnalysis.java @@ -40,6 +40,7 @@ import org.eclipse.ocl.pivot.ids.OperationId; import org.eclipse.ocl.pivot.internal.complete.StandardLibraryInternal; import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.ocl.pivot.utilities.EnvironmentFactory; +import org.eclipse.ocl.pivot.utilities.LabelUtil; import org.eclipse.ocl.pivot.utilities.NameUtil; import org.eclipse.ocl.pivot.utilities.PivotUtil; import org.eclipse.qvtd.pivot.qvtbase.Domain; @@ -77,6 +78,11 @@ public class RootDomainUsageAnalysis extends AbstractDomainUsageAnalysis impleme @Override public @Nullable TypedModel getTypedModel() throws IllegalStateException { + return getTypedModel(null); + } + + @Override + public @Nullable TypedModel getTypedModel(@Nullable Element context) throws IllegalStateException { int residue = bitMask; for (int i = 0; residue != 0; i++) { int bit = 1 << i; @@ -85,7 +91,7 @@ public class RootDomainUsageAnalysis extends AbstractDomainUsageAnalysis impleme if (residue == 0) { return RootDomainUsageAnalysis.this.getTypedModel(i); } - System.err.println("Ambiguous TypedModel: " + this); + System.err.println("Ambiguous TypedModel: " + this + " for " + LabelUtil.getLabel(context)); // throw new IllegalStateException("Ambiguous TypedModel: " + this); return RootDomainUsageAnalysis.this.getTypedModel(i); } @@ -132,6 +138,11 @@ public class RootDomainUsageAnalysis extends AbstractDomainUsageAnalysis impleme return (bitMask & outputUsage.bitMask) != 0; } + @Override + public boolean isPrimitive() { + return (bitMask & PRIMITIVE_USAGE_BIT_MASK) != 0; + } + protected String toString(@NonNull String prefix) { StringBuilder s = new StringBuilder(); s.append(prefix); 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 0e3aa53e4..ecf09469e 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 @@ -569,7 +569,7 @@ public class QVTiTransformationAnalysis OCLExpression asSource = asNavigationCallExp.getOwnedSource(); DomainUsage domainUsage = getDomainUsageAnalysis().basicGetUsage(asSource); if (domainUsage != null) { - TypedModel typedModel = domainUsage.getTypedModel(); + TypedModel typedModel = domainUsage.getTypedModel(asSource); if (typedModel != null) { Area area = QVTcoreBaseUtil.getArea(asMapping, typedModel); if ((area instanceof ImperativeArea) && ((ImperativeArea)area).getCheckedProperties().contains(asProperty)) { @@ -580,7 +580,7 @@ public class QVTiTransformationAnalysis Property asOppositeProperty = asProperty.getOpposite(); domainUsage = getDomainUsageAnalysis().basicGetUsage(asProperty.getType()); if (domainUsage != null) { - TypedModel typedModel = domainUsage.getTypedModel(); + TypedModel typedModel = domainUsage.getTypedModel(asProperty); if (typedModel != null) { Area area = QVTcoreBaseUtil.getArea(asMapping, typedModel); if ((area instanceof ImperativeArea) && ((ImperativeArea)area).getCheckedProperties().contains(asOppositeProperty)) { @@ -605,7 +605,7 @@ public class QVTiTransformationAnalysis OCLExpression asSource = asPropertyAssignment.getSlotExpression(); DomainUsage domainUsage = getDomainUsageAnalysis().basicGetUsage(asSource); if (domainUsage != null) { - TypedModel typedModel = domainUsage.getTypedModel(); + TypedModel typedModel = domainUsage.getTypedModel(asSource); if (typedModel != null) { Area area = null; for (Domain domain : asMapping.getDomain()) { |