diff options
author | Ed Willink | 2016-04-28 15:32:40 +0000 |
---|---|---|
committer | Ed Willink | 2016-04-28 20:31:59 +0000 |
commit | 93ec8c0bafa14aa943f0cfe7068fb8caf036ee17 (patch) | |
tree | 113cbda2f83d5e1d9fd181bcc8b6b7b945e278e2 | |
parent | 95f95e039771319d8090882dbcb2a41d8e1d3656 (diff) | |
download | org.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.java | 17 |
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()) { |