Fix + test.
441027: Enum type in 'from' section of lazy rules
https://bugs.eclipse.org/bugs/show_bug.cgi?id=441027
diff --git a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
index 64e23c0..0ce6078 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
+++ b/plugins/org.eclipse.m2m.atl.emftvm/src/org/eclipse/m2m/atl/emftvm/impl/RuleImpl.java
@@ -26,6 +26,8 @@
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -52,6 +54,7 @@
import org.eclipse.m2m.atl.emftvm.trace.TraceLink;
import org.eclipse.m2m.atl.emftvm.trace.TraceLinkSet;
import org.eclipse.m2m.atl.emftvm.trace.TracedRule;
+import org.eclipse.m2m.atl.emftvm.util.EnumLiteral;
import org.eclipse.m2m.atl.emftvm.util.FieldContainer;
import org.eclipse.m2m.atl.emftvm.util.LazySet;
import org.eclipse.m2m.atl.emftvm.util.StackFrame;
@@ -2103,7 +2106,13 @@
"Cannot match rule input element %s against null value for %s",
re, this));
}
- if (!re.getEType().isInstance(value)) {
+ EClassifier eType = re.getEType();
+ if (eType instanceof EEnum) {
+ // Fix for Bug # 441027
+ if (!(value instanceof EnumLiteral)) {
+ return false;
+ }
+ } else if (!eType.isInstance(value)) {
return false;
}
EList<Model> inmodels = re.getEModels();
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java b/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
index e955d2a..4efbaf2 100644
--- a/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/src/org/eclipse/m2m/atl/emftvm/tests/integration/IntegrationTest.java
@@ -320,6 +320,27 @@
}
/**
+ * Tests regression of <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=441027">Bug # 441027</a>.
+ */
+ public void testBug441027() {
+ final ResourceSet rs = new ResourceSetImpl();
+ final ExecEnv env = EmftvmFactory.eINSTANCE.createExecEnv();
+ final TimingData td = new TimingData();
+ final Model in = loadTestModel(rs, "/test-data/Regression/Bug441027.emftvm");
+ final Model out = createTestModel(rs, "/test-data/Regression/Bug441027-out.xmi");
+ env.registerInputModel("IN", in);
+ env.registerOutputModel("OUT", out);
+ env.loadModule(createTestModuleResolver(), "Regression::Bug441027");
+ td.finishLoading();
+ env.run(td);
+ td.finish();
+
+ final ResourceSet refRs = new ResourceSetImpl();
+ final Model refOut = loadTestModel(refRs, "/test-data/Regression/Bug441027-out.xmi");
+ assertEquals(refOut.getResource(), out.getResource());
+ }
+
+ /**
* Tests "ToStringTest.atl".
*/
public void testToString() {
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi
new file mode 100644
index 0000000..c0efaf4
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027-out.xmi
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ASCII"?>
+<emftvm:Module xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:emftvm="http://www.eclipse.org/m2m/atl/2011/EMFTVM">
+ <features xsi:type="emftvm:Operation" name="FINDTYPE"/>
+ <features xsi:type="emftvm:Operation" name="NEW"/>
+ <features xsi:type="emftvm:Operation" name="STORE"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+ <features xsi:type="emftvm:Operation" name="FINDTYPE"/>
+ <features xsi:type="emftvm:Operation" name="PUSH"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="GETCB"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="SET"/>
+ <features xsi:type="emftvm:Operation" name="GETENVTYPE"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+ <features xsi:type="emftvm:Operation" name="GET"/>
+ <features xsi:type="emftvm:Operation" name="PUSH"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE_STATIC"/>
+ <features xsi:type="emftvm:Operation" name="GETENVTYPE"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE_STATIC"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="INVOKE"/>
+ <features xsi:type="emftvm:Operation" name="SET"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+ <features xsi:type="emftvm:Operation" name="LOAD"/>
+</emftvm:Module>
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl
new file mode 100644
index 0000000..a4e333d
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.atl
@@ -0,0 +1,24 @@
+-- @atlcompiler emftvm
+-- @nsURI EMFTVM=http://www.eclipse.org/m2m/atl/2011/EMFTVM
+module "Regression::Bug441027";
+
+create OUT : EMFTVM from IN : EMFTVM;
+
+lazy rule OpcodeToOperation {
+ from s : EMFTVM!Opcode
+ to t : EMFTVM!Operation (
+ name <- s.getName()
+ )
+ do {
+ t;
+ }
+}
+
+endpoint rule Module() {
+ to t : EMFTVM!Module (
+ features <- EMFTVM!Instruction.allInstancesFrom('IN')
+ ->collect(i |
+ thisModule.OpcodeToOperation(i.opcode.debug('opcode'))
+ )
+ )
+}
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm
new file mode 100644
index 0000000..c136b66
--- /dev/null
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/test-data/Regression/Bug441027.emftvm
Binary files differ