diff options
author | Ed Willink | 2017-10-07 15:16:32 +0000 |
---|---|---|
committer | Ed Willink | 2017-10-07 15:37:53 +0000 |
commit | c1c79605e8d003b156a8887570232d0eafde2104 (patch) | |
tree | 2a2d639afa7423b6ae32f433d749252558761354 | |
parent | 93bb8b7f8a3431fc705bb8e1c0768c008d1e7418 (diff) | |
download | org.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.tar.gz org.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.tar.xz org.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.zip |
[514590] Use middle bottom for initialized variables
5 files changed, 62 insertions, 20 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/AbstractVariable2Variable.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/AbstractVariable2Variable.java index a11bfe20d..2d8350145 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/AbstractVariable2Variable.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/AbstractVariable2Variable.java @@ -15,11 +15,10 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.OCLExpression; import org.eclipse.ocl.pivot.Property; import org.eclipse.ocl.pivot.Variable; -import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.qvtd.compiler.CompilerChainException; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtrelation.Key; -import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation; +import org.eclipse.qvtd.pivot.qvtrelation.utilities.QVTrelationUtil; import org.eclipse.qvtd.pivot.qvttemplate.TemplateExp; /** @@ -36,10 +35,9 @@ public abstract class AbstractVariable2Variable implements Variable2Variable this.name = variablesAnalysis.getUniqueVariableName(name, this); } - protected AbstractVariable2Variable(@NonNull Variables2Variables variablesAnalysis, @NonNull Variable rThisVariable) { + protected AbstractVariable2Variable(@NonNull Variables2Variables variablesAnalysis, @NonNull Variable rVariable) { this.variablesAnalysis = variablesAnalysis; - this.name = ClassUtil.nonNullState(rThisVariable.getName()); - assert rThisVariable.eContainer() instanceof RelationalTransformation; + this.name = QVTrelationUtil.getName(rVariable); } @Override diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/BasicRelation2Mappings.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/BasicRelation2Mappings.java index 723a44163..d13ae9d53 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/BasicRelation2Mappings.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/BasicRelation2Mappings.java @@ -49,6 +49,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Predicate; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtbase.utilities.QVTbaseUtil; import org.eclipse.qvtd.pivot.qvtcore.BottomPattern; +import org.eclipse.qvtd.pivot.qvtcore.BottomVariable; import org.eclipse.qvtd.pivot.qvtcore.CoreDomain; import org.eclipse.qvtd.pivot.qvtcore.GuardPattern; import org.eclipse.qvtd.pivot.qvtcore.Mapping; @@ -521,8 +522,11 @@ import com.google.common.collect.Sets; assert oOuts.size() == 1; return oOuts.get(0); } + return super.get(oIn); // e.g. Features/Collections which are re-useable externals + } + else { + return super.get(oIn); } - return super.get(oIn); } @Override @@ -737,8 +741,8 @@ import com.google.common.collect.Sets; OCLExpression rOwnedInit = ((Variable)rVariable).getOwnedInit(); if (rOwnedInit != null) { Variable cVariable = analysis.getCoreVariable(); + assert cVariable instanceof BottomVariable; cVariable.setOwnedInit(mapExpression(rOwnedInit)); - // variablesAnalysis.addConditionPredicate(analysis.getCorePattern(), createVariableExp(cVariable), mapExpression(rOwnedInit)); } } } @@ -1132,7 +1136,7 @@ import com.google.common.collect.Sets; } OCLExpression rGuardPredicate = rEnforcedTemplateExpression.getWhere(); if (rGuardPredicate != null) { - cMiddleGuardPattern.getPredicate().add(createPredicate(mapExpression(rGuardPredicate))); + cMiddleBottomPattern.getPredicate().add(createPredicate(mapExpression(rGuardPredicate))); } } @@ -1223,6 +1227,14 @@ import com.google.common.collect.Sets; // no need to trace "this" } else if (relationAnalysis.traceIsRealized()) { + OCLExpression rInit = rDomainVariable.getOwnedInit(); + if (rInit != null) { + Variable2Variable variableAnalysis = variablesAnalysis.getVariableAnalysis(rDomainVariable); + // Variable cVariable = variableAnalysis.getCoreVariable(); + // CorePattern corePattern = variableAnalysis.getCorePattern(); + // assert corePattern != null; + // variablesAnalysis.addConditionPredicate(corePattern, createVariableExp(cVariable), mapExpression(rInit)); + } variablesAnalysis.addTraceNavigationAssignment(rDomainVariable, true); } else if (!QVTrelationUtil.getRootVariables(rRelation).contains(rDomainVariable)) { @@ -1273,9 +1285,9 @@ import com.google.common.collect.Sets; } else { OCLExpression cArgument = mapExpression(rArgument); // FIXME tis fails, but possibly only in m2s - Variable cArgumentVariable/*mv*/ = variablesAnalysis.addCoreGuardVariable("FIXME", cArgument.getType()); - variablesAnalysis.addConditionPredicate(cMiddleBottomPattern, createVariableExp(cArgumentVariable), cArgument); //createVariableExp(cArgumentVariable)); - cReferenceValue = createVariableExp(cArgumentVariable); + // Variable cArgumentVariable/*mv*/ = variablesAnalysis.addCoreGuardVariable("FIXME", cArgument.getType()); + // variablesAnalysis.addConditionPredicate(cMiddleBottomPattern, createVariableExp(cArgumentVariable), cArgument); //createVariableExp(cArgumentVariable)); + cReferenceValue = cArgument; //createVariableExp(cArgumentVariable); } Variable rParameter/*dv*/ = rParameters.get(i); Property cCalledProperty/*pep*/ = relationalTransformation2tracePackage.getTraceProperty(QVTrelationUtil.getType(cCalledVariable), rParameter); @@ -1449,8 +1461,9 @@ import com.google.common.collect.Sets; targets = new ArrayList<>(); source2targets.put(relationElement, targets); } - assert !targets.contains(coreElement); - targets.add(coreElement); + if (!targets.contains(coreElement)) { // IteratorVariables are traced proactively + targets.add(coreElement); + } } protected @NonNull Set<@NonNull Predicate> selectPredicatesThatReferToVariables(@NonNull Set<@NonNull Predicate> rPredicates, @NonNull Set<@NonNull Variable> rVariables) { @@ -1547,7 +1560,7 @@ import com.google.common.collect.Sets; /** * All relations, including this one, that this relation overrides. */ - protected final @NonNull Set<@NonNull Relation> rAllOverridens = new HashSet<>(); + protected final @NonNull Set<@NonNull Relation> rAllOverriddens = new HashSet<>(); protected BasicRelation2Mappings(@NonNull RelationalTransformation2CoreTransformation relationalTransformation2coreTransformation, @NonNull RelationAnalysis relationAnalysis) { super(relationalTransformation2coreTransformation, relationAnalysis); @@ -1581,6 +1594,8 @@ import com.google.common.collect.Sets; } } // + // Gather all non-dead, non-implicit variables + // this.rAllVariables = new HashSet<>(); Variables2Variables.gatherReferredVariables(rAllVariables, QVTrelationUtil.getOwnedDomains(rRelation)); if (rWhenPattern != null) { @@ -1589,17 +1604,31 @@ import com.google.common.collect.Sets; if (rWherePattern != null) { Variables2Variables.gatherReferredVariables(rAllVariables, rWherePattern); } - this.rSharedVariables = Variables2Variables.getMiddleDomainVariables(rRelation); + List<@NonNull Variable> allVariablesList = new ArrayList<>(rAllVariables); + for (int i = 0; i < allVariablesList.size(); i++) { + Variable variable = allVariablesList.get(i); + OCLExpression ownedInit = variable.getOwnedInit(); + if (ownedInit != null) { + Set<@NonNull Variable> moreVariables = new HashSet<>(); + Variables2Variables.gatherReferredVariables(moreVariables, ownedInit); + for (@NonNull Variable moreVariable : moreVariables) { + if (rAllVariables.add(moreVariable)) { + allVariablesList.add(moreVariable); + } + } + } + } // + this.rSharedVariables = Variables2Variables.getMiddleDomainVariables(rRelation); // - gatherOverridens(rRelation); + gatherOverriddens(rRelation); } - private void gatherOverridens(@NonNull Relation rOverriding) { - if (rAllOverridens.add(rOverriding)) { + private void gatherOverriddens(@NonNull Relation rOverriding) { + if (rAllOverriddens.add(rOverriding)) { Relation rOverridden = QVTrelationUtil.basicGetOverridden(rOverriding); if (rOverridden != null) { - gatherOverridens(rOverridden); + gatherOverriddens(rOverridden); } } else { diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/NonTopRelation2Mappings.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/NonTopRelation2Mappings.java index 2391f0838..64054447d 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/NonTopRelation2Mappings.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/NonTopRelation2Mappings.java @@ -136,7 +136,7 @@ import com.google.common.collect.Iterables; public void analyze() throws CompilerChainException { boolean hasWhenInvocation = false; boolean hasWhereInvocation = false; - for (@NonNull Relation rOverriden : rAllOverridens) { + for (@NonNull Relation rOverriden : rAllOverriddens) { RelationAnalysis rOverrideAnalysis = transformationAnalysis.getRelationAnalysis(rOverriden); Iterable<@NonNull RelationCallExp> incomingWhenInvocations = rOverrideAnalysis.getIncomingWhenInvocations(); if ((incomingWhenInvocations != null) && !Iterables.isEmpty(incomingWhenInvocations)) { diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/ThisVariable2Variable.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/ThisVariable2Variable.java index 85ce3bac2..0b24d09e3 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/ThisVariable2Variable.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/ThisVariable2Variable.java @@ -15,6 +15,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.Variable; import org.eclipse.qvtd.pivot.qvtbase.TypedModel; import org.eclipse.qvtd.pivot.qvtcore.CorePattern; +import org.eclipse.qvtd.pivot.qvtrelation.RelationalTransformation; /** * A ThisVariableAnalysis describes the 'this' variable in relation and core transformations. @@ -27,6 +28,7 @@ public class ThisVariable2Variable extends AbstractVariable2Variable public ThisVariable2Variable(@NonNull Variables2Variables variablesAnalysis, @NonNull Variable rThisVariable, @NonNull Variable cThisVariable) { super(variablesAnalysis, rThisVariable); + assert rThisVariable.eContainer() instanceof RelationalTransformation; this.rThisVariable = rThisVariable; this.cThisVariable = cThisVariable; } diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/analysis/RelationVariableAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/analysis/RelationVariableAnalysis.java index 6b5381135..d5b81c0d8 100644 --- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/analysis/RelationVariableAnalysis.java +++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/analysis/RelationVariableAnalysis.java @@ -138,6 +138,19 @@ public class RelationVariableAnalysis extends AbstractVariableAnalysis // assert cWhereDomain == null; return Strategy.ENFORCED_GUARD; } + else if (rVariable.getOwnedInit() != null) { + // assert rEnforcedTypedModel == null; + // assert rKey == null; + // assert rTemplateExp == null; + // assert !isEnforcedBound; + // assert isEnforcedReferred; + // assert rOtherBound == null; + // assert rOtherReferred != null; + // assert !isRoot; + // assert cWhenDomain == null; + // assert cWhereDomain == null; + return Strategy.SHARED_BOTTOM; + } else if ((rWhenTypedModel != null) || (isEnforcedBound && variablesAnalysis.isInvoked() && isRoot) //rKey != null; || (!isEnforcedBound && (rOtherBound != null) && isRoot)) { |