diff options
3 files changed, 26 insertions, 6 deletions
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 f7167cca2..8a92cca2a 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 @@ -4737,7 +4737,7 @@ public class QvtOperationalVisitorCS } private org.eclipse.ocl.ecore.OCLExpression visitResolveExpCS(ResolveExpCS resolveExpCS, QvtOperationalEnv env) { - ResolveExp resolveExp = populateResolveExp(resolveExpCS, env, ExpressionsFactory.eINSTANCE.createResolveExp()); + ResolveExp resolveExp = populateResolveExp(resolveExpCS, env, ExpressionsFactory.eINSTANCE.createResolveExp(), null); // if (resolveExp.getSource() == null) { // env.reportError(NLS.bind(ValidationMessages.ResolveExpMustHaveASource, new Object[] { }), resolveExpCS); // } @@ -4783,9 +4783,11 @@ public class QvtOperationalVisitorCS String mappingFQName = (eClassifier == null) ? "" : eClassifier.getName() + EmfUtil.PATH_SEPARATOR; //$NON-NLS-1$ mappingFQName += mappingName; + EClassifier mappingResultType = null; if (mappingOperations.size() == 1) { env.registerResolveInExp(resolveInExp, eClassifier, mappingName); + mappingResultType = mappingOperations.get(0).getEType(); } else { if (mappingOperations.size() == 0) { env.reportError(NLS.bind(ValidationMessages.QvtOperationalVisitorCS_ResolveInMappingNotFound, new Object[] { @@ -4797,12 +4799,11 @@ public class QvtOperationalVisitorCS } } - ResolveExp result = populateResolveExp(resolveInExpCS, env, resolveInExp); + ResolveExp result = populateResolveExp(resolveInExpCS, env, resolveInExp, mappingResultType); // DeprecatedImplicitSourceCallHelper.validateCallExp(resolveInExpCS, result, env); if (mappingOperations.size() == 1 && resolveInExp.getTarget() != null) { EClassifier targetVariableType = resolveInExp.getTarget().getType(); - EClassifier mappingResultType = mappingOperations.get(0).getEType(); if(!TypeUtil.compatibleTypeMatch(env, mappingResultType, targetVariableType)) { env.reportWarning( @@ -4819,7 +4820,7 @@ public class QvtOperationalVisitorCS return result; } - private ResolveExp populateResolveExp(ResolveExpCS resolveExpCS, QvtOperationalEnv env, ResolveExp resolveExp) { + private ResolveExp populateResolveExp(ResolveExpCS resolveExpCS, QvtOperationalEnv env, ResolveExp resolveExp, EClassifier mappingResultType) { // AST binding if(myCompilerOptions.isGenerateCompletionData()) { ASTBindingHelper.createCST2ASTBinding(resolveExpCS, resolveExp, env); @@ -4892,10 +4893,11 @@ public class QvtOperationalVisitorCS } } } else { + EClassifier resultType = mappingResultType == null ? env.getOCLStandardLibrary().getOclAny() : mappingResultType; if (resolveExp.isOne()) { - resolveExp.setType(env.getOCLStandardLibrary().getOclAny()); + resolveExp.setType(resultType); } else { - EClassifier resolveType = (EClassifier) env.getOCLFactory().createSequenceType(env.getOCLStandardLibrary().getOclAny()); + EClassifier resolveType = (EClassifier) env.getOCLFactory().createSequenceType(resultType); resolveExp.setType(TypeUtil.resolveType(env, resolveType)); } } diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/bug432786/bug432786.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/bug432786/bug432786.qvto new file mode 100644 index 000000000..d5291d2f9 --- /dev/null +++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/models/bug432786/bug432786.qvto @@ -0,0 +1,17 @@ +modeltype ecore uses "http://www.eclipse.org/emf/2002/Ecore"; +transformation bug432786; + +main() { + var p1 : EClassifier = resolveoneIn(m1); + assert fatal (p1 = null); + + var obj = map m1(); + var p2 : ENamedElement = resolveoneIn(m1); + assert fatal (p2 = obj); +} + +mapping m1() : EClassifier { + init { + result := object EClass{}; + } +} diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java index 8231d1dd1..83756666a 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/transform/TransformTests.java @@ -388,6 +388,7 @@ public class TransformTests { }), new FileToFileData("bug427237a"), //$NON-NLS-1$ new FilesToFilesData("bug425069"), //$NON-NLS-1$ + new FilesToFilesData("bug432786"), //$NON-NLS-1$ }; } |