diff options
author | Ed Willink | 2016-02-04 13:56:28 +0000 |
---|---|---|
committer | Ed Willink | 2016-02-04 17:32:27 +0000 |
commit | ee23f67f6d6976c29532b887b1854eb8278eb396 (patch) | |
tree | 50a6b9a12c3c9add2e9bf08eb39d96196b472c62 | |
parent | eeb30ab0b394f5df9850bc6bd8ec7373747d4ca6 (diff) | |
download | org.eclipse.qvtd-ee23f67f6d6976c29532b887b1854eb8278eb396.tar.gz org.eclipse.qvtd-ee23f67f6d6976c29532b887b1854eb8278eb396.tar.xz org.eclipse.qvtd-ee23f67f6d6976c29532b887b1854eb8278eb396.zip |
[ocl2qvtp] PropertyAssignment intersects left/right usage
2 files changed, 20 insertions, 2 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 3bcac726a..0101bc286 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 @@ -12,6 +12,7 @@ import java.util.Set; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -368,7 +369,24 @@ public class QVTp2QVTg { if (oppositeProp != null) { OCLExpression value = propAssign.getValue(); assert value != null; - TypedModel oppositeTypedModel = getTypedModel(value); + DomainUsage valueUsage = getUsage(value); + if (valueUsage == null) { + getUsage(value); + throw new IllegalStateException("No DomainUsage for " + value); + } + Type propertyType = targetProp.getType(); + if ((propertyType != null) && (propertyType.getESObject() != EcorePackage.Literals.EOBJECT)) { // FIXME Legacy fix tolerating undeclared import of EObject + DomainUsage propertyUsage = getUsage(propertyType); + if (propertyUsage == null) { + getUsage(propertyType); + throw new IllegalStateException("No DomainUsage for " + propertyType); + } + valueUsage = domainUsageAnalysis.intersection(propertyUsage, valueUsage); + } + TypedModel oppositeTypedModel = valueUsage.getTypedModel(); + if (oppositeTypedModel == null) { + throw new IllegalStateException("No left/right DomainUsage commonality for \"" + propAssign + "\""); + } PropertyDatum oppositeDatum = getPropertyDatum(oppositeTypedModel, ClassUtil.nonNullState(getElementClass(targetProp)), oppositeProp); targetDatum.setOpposite(oppositeDatum); result.add(oppositeDatum); diff --git a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/AbstractDomainUsageAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/AbstractDomainUsageAnalysis.java index f4367575d..de6851721 100644 --- a/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/AbstractDomainUsageAnalysis.java +++ b/plugins/org.eclipse.qvtd.pivot.qvtcorebase/src/org/eclipse/qvtd/pivot/qvtcorebase/analysis/AbstractDomainUsageAnalysis.java @@ -161,7 +161,7 @@ public abstract class AbstractDomainUsageAnalysis extends AbstractExtendingQVTco return ClassUtil.nonNullState(element2usage.get(element)); } - protected @NonNull DomainUsage intersection(@NonNull DomainUsage firstUsage, @NonNull DomainUsage secondUsage) { + public @NonNull DomainUsage intersection(@NonNull DomainUsage firstUsage, @NonNull DomainUsage secondUsage) { int firstMask = ((DomainUsage.Internal)firstUsage).getMask(); int secondMask = ((DomainUsage.Internal)secondUsage).getMask(); if (firstMask == secondMask) { |