Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2017-10-07 15:16:32 +0000
committerEd Willink2017-10-07 15:37:53 +0000
commitc1c79605e8d003b156a8887570232d0eafde2104 (patch)
tree2a2d639afa7423b6ae32f433d749252558761354
parent93bb8b7f8a3431fc705bb8e1c0768c008d1e7418 (diff)
downloadorg.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.tar.gz
org.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.tar.xz
org.eclipse.qvtd-c1c79605e8d003b156a8887570232d0eafde2104.zip
[514590] Use middle bottom for initialized variables
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/AbstractVariable2Variable.java8
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/BasicRelation2Mappings.java57
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/NonTopRelation2Mappings.java2
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/ThisVariable2Variable.java2
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtr2qvtc/analysis/RelationVariableAnalysis.java13
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)) {

Back to the top