[438038] - Compilation error when using an overriding mapping as
disjuncted mapping
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
index 0772cf0..7266ef1 100644
--- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
+++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalVisitorCS.java
@@ -8,7 +8,7 @@
* Contributors:
* Borland Software Corporation - initial API and implementation
* Christopher Gerking - bugs 302594, 310991, 289982, 391289, 425634, 427237,
- * 433585, 433919
+ * 433585, 433919, 438038
* Alex Paperno - bugs 272869, 268636, 404647, 414363, 414363, 401521,
* 419299, 414619, 403440, 415024, 420970, 413391,
* 424584, 424869
@@ -3936,7 +3936,7 @@
owningType = env.getModuleContextType();
result = env.lookupMappingOperations(owningType, identifierCS.getName());
}
- // filter out inherited mappings
+ // filter out inherited and overridden mappings
if(!result.isEmpty()) {
List<MappingOperation> ownerLocalOpers = new ArrayList<MappingOperation>(result.size());
for (MappingOperation operation : result) {
@@ -3945,12 +3945,20 @@
ownerLocalOpers.add(operation);
}
}
- result = ownerLocalOpers;
+
+ List<MappingOperation> filteredMappings = new ArrayList<MappingOperation>(ownerLocalOpers.size());
+ for (MappingOperation mapping : ownerLocalOpers) {
+ if (!ownerLocalOpers.contains(mapping.getOverridden())) {
+ filteredMappings.add(mapping);
+ }
+ }
+
+ result = filteredMappings;
}
// validate the result
if(result.isEmpty()) {
if(owningType != null) {
- // unresolved type reported above by visiTypeCS(...)
+ // unresolved type reported above by visitTypeCS(...)
String errMessage = NLS.bind(ValidationMessages.QvtOperationalVisitorCS_unresolvedMappingOperationReference,
QvtOperationalParserUtil.getStringRepresentation(identifierCS));
env.reportError(errMessage, identifierCS);
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/ExtendedLibrary.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/ExtendedLibrary.qvto
new file mode 100644
index 0000000..d1bb799
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/ExtendedLibrary.qvto
@@ -0,0 +1,5 @@
+modeltype ecore uses "http://www.eclipse.org/emf/2002/Ecore";
+
+library ExtendedLibrary();
+
+mapping EClass :: EClass2EClass() : EClass {};
\ No newline at end of file
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/bug438038.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/bug438038.qvto
new file mode 100644
index 0000000..01b0a6e
--- /dev/null
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug438038/bug438038.qvto
@@ -0,0 +1,14 @@
+import ExtendedLibrary;
+
+modeltype ecore uses "http://www.eclipse.org/emf/2002/Ecore";
+
+transformation bug438038();
+
+main() {
+
+}
+
+mapping EClassifier :: EClassifier2EClassifier() : EClassifier
+ disjuncts EClass::EClass2EClass;
+
+mapping EClass :: EClass2EClass() : EClass {};
diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/ParserTests.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/ParserTests.java
index 43bb165..b4ec44b 100644
--- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/ParserTests.java
+++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/ParserTests.java
@@ -224,5 +224,6 @@
new TestData("bug428028", 0), //$NON-NLS-1$
TestData.createSourceChecked("bug425634", 0, 6), //$NON-NLS-1$
new TestData("bug433585", 0), //$NON-NLS-1$
+ new TestData("bug438038", 0) //$NON-NLS-1$
};
}