Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2016-04-28 15:32:40 +0000
committerEd Willink2016-04-28 20:31:59 +0000
commit93ec8c0bafa14aa943f0cfe7068fb8caf036ee17 (patch)
tree113cbda2f83d5e1d9fd181bcc8b6b7b945e278e2
parent95f95e039771319d8090882dbcb2a41d8e1d3656 (diff)
downloadorg.eclipse.qvtd-93ec8c0bafa14aa943f0cfe7068fb8caf036ee17.tar.gz
org.eclipse.qvtd-93ec8c0bafa14aa943f0cfe7068fb8caf036ee17.tar.xz
org.eclipse.qvtd-93ec8c0bafa14aa943f0cfe7068fb8caf036ee17.zip
[486722] Check variable initialization compatibility
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/scheduler/ExpressionAnalyzer.java17
1 files changed, 14 insertions, 3 deletions
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 c97057415..f9e13a6e4 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
@@ -13,6 +13,7 @@ package org.eclipse.qvtd.compiler.internal.scheduler;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.CallExp;
@@ -291,7 +292,7 @@ public class ExpressionAnalyzer extends AbstractExtendingQVTimperativeVisitor<@N
return Nodes.AttributeNodeRoleFactory.PREDICATED_CLASS.createSimpleNode(context, name, classDatumAnalysis);
}
- protected @NonNull SimpleEdge createRealizedArumentEdge(@NonNull SimpleNode sourceNode, @Nullable String name, @NonNull SimpleNode targetNode) {
+ protected @NonNull SimpleEdge createRealizedArgumentEdge(@NonNull SimpleNode sourceNode, @Nullable String name, @NonNull SimpleNode targetNode) {
return Edges.ArgumentEdgeRoleFactory.REALIZED_ARGUMENT.createEdge(context, sourceNode, name, targetNode);
}
@@ -646,7 +647,6 @@ public class ExpressionAnalyzer extends AbstractExtendingQVTimperativeVisitor<@N
assert property != null;
SimpleNode slotNode = analyze(propertyAssignment.getSlotExpression());
assert slotNode.isClassNode();
-// context.get
SimpleNode valueNode = analyze(propertyAssignment.getValue());
// if (!valueNode.isClassNode() && !valueNode.isNull()) {
if (valueNode.isExpression()) {
@@ -654,7 +654,7 @@ public class ExpressionAnalyzer extends AbstractExtendingQVTimperativeVisitor<@N
Type type = property.getType();
if (type instanceof DataType) {
valueNode = context.getAssignedAttributeNode(slotNode, property);
- createRealizedArumentEdge(computedValueNode, null, valueNode);
+ createRealizedArgumentEdge(computedValueNode, null, valueNode);
}
else {
String name = property.getName();
@@ -664,6 +664,17 @@ public class ExpressionAnalyzer extends AbstractExtendingQVTimperativeVisitor<@N
}
}
SimpleNavigationEdge navigationEdge = slotNode.getNavigationEdge(property);
+ CompleteClass valueCompleteClass = valueNode.getCompleteClass();
+ Type propertyType = ClassUtil.nonNullState(property.getType());
+ CompleteClass targetCompleteClass = scheduler.getEnvironmentFactory().getCompleteModel().getCompleteClass(propertyType);
+ if (!valueCompleteClass.conformsTo(targetCompleteClass)) {
+ if (targetCompleteClass.getPrimaryClass().getESObject() != EcorePackage.Literals.EOBJECT) { // FIXME fudge for Adolfo's suspect tests
+ // FIXME we could synthesize a cast, but it's easier to do oclAsType() in QVTm/QVTp
+ if (!valueCompleteClass.conformsTo(targetCompleteClass)) {
+ throw new IllegalStateException("Incompatible types for " + propertyAssignment);
+ }
+ }
+ }
context.addAssignmentEdge(slotNode, property, valueNode);
Property oppositeProperty = property.getOpposite();
if (valueNode.isClassNode() && (oppositeProperty != null) && !oppositeProperty.isIsMany()) {

Back to the top