diff options
author | sboyko | 2016-04-28 14:11:21 +0000 |
---|---|---|
committer | sboyko | 2016-04-28 14:11:21 +0000 |
commit | e7b359b0e1572ff44f0b91503a71855f3ffddde0 (patch) | |
tree | 3bc1fb47a83dc5e72e90b0c8183f385055326799 | |
parent | b5769e42394113ffba4c7d26f3915a772f160b9f (diff) | |
download | org.eclipse.qvto-e7b359b0e1572ff44f0b91503a71855f3ffddde0.tar.gz org.eclipse.qvto-e7b359b0e1572ff44f0b91503a71855f3ffddde0.tar.xz org.eclipse.qvto-e7b359b0e1572ff44f0b91503a71855f3ffddde0.zip |
[490424] Assigning incompatible enumeration values does not produce an
error
9 files changed, 129 insertions, 87 deletions
diff --git a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalParserUtil.java b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalParserUtil.java index c46fd14cb..90fefb62b 100644 --- a/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalParserUtil.java +++ b/plugins/org.eclipse.m2m.qvt.oml/src/org/eclipse/m2m/internal/qvt/oml/ast/parser/QvtOperationalParserUtil.java @@ -337,8 +337,8 @@ public class QvtOperationalParserUtil { // FIXME - better be handled in OCL itself // check was added due to https://bugs.eclipse.org/bugs/show_bug.cgi?id=275824 - if (variableType instanceof EDataType && initialiserType instanceof EDataType && variableType instanceof PredefinedType<?> == false) { - if (((EDataType) variableType).getInstanceClass() == ((EDataType) initialiserType).getInstanceClass()) { + if (variableType instanceof EDataType && initialiserType instanceof EDataType && variableType instanceof PredefinedType == false) { + if (variableType.getInstanceClass() == initialiserType.getInstanceClass() && variableType.getInstanceClass() != null) { return true; } if (initialiserType instanceof EEnum && @@ -447,7 +447,7 @@ public class QvtOperationalParserUtil { actualType = ((CollectionType) actualType).getElementType(); } - if (!QvtOperationalParserUtil.isAssignableToFrom(env, baseType, actualType)) { + if (!isAssignableToFrom(env, baseType, actualType)) { QvtOperationalUtil.reportError(env, NLS.bind(ValidationMessages.SemanticUtil_5, new Object[] { leftName, QvtOperationalTypesUtil.getTypeFullName(baseType), QvtOperationalTypesUtil.getTypeFullName(actualType) }), rValueCS); @@ -461,7 +461,7 @@ public class QvtOperationalParserUtil { actualType = ((CollectionType) actualType).getElementType(); } - if (!QvtOperationalParserUtil.isAssignableToFrom(env, baseType, actualType)) { + if (!isAssignableToFrom(env, baseType, actualType)) { QvtOperationalUtil.reportError(env, NLS.bind(ValidationMessages.SemanticUtil_5, new Object[] { leftName, QvtOperationalTypesUtil.getTypeFullName(baseType), QvtOperationalTypesUtil.getTypeFullName(actualType) }), rValueCS); @@ -469,7 +469,7 @@ public class QvtOperationalParserUtil { } } else { - if (!QvtOperationalParserUtil.isAssignableToFrom(env, leftType, rightType)) { + if (!isAssignableToFrom(env, leftType, rightType)) { QvtOperationalUtil.reportError(env, NLS.bind(ValidationMessages.SemanticUtil_8, new Object[] { leftName, QvtOperationalTypesUtil.getTypeFullName(leftType), QvtOperationalTypesUtil.getTypeFullName(rightType) }), rValueCS); diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/bug490424.qvto b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/bug490424.qvto new file mode 100644 index 000000000..4c542e311 --- /dev/null +++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/bug490424.qvto @@ -0,0 +1,18 @@ +modeltype test1 "strict" uses "http://example.org/test1"; +modeltype imperativeOCL "strict" uses "http://www.eclipse.org/qvt/1.0/ImperativeOCL"; + +transformation bug490424; + +main() { + object XExpression { + operator := test1::XOperator::DoX; + operator := /*<error>*/test1::YOperator::DoY/*</error>*/; + operator := /*<error>*/imperativeOCL::SeverityKind::error/*</error>*/; + }; + + object YExpression { + operator := /*<error>*/test1::XOperator::DoX/*</error>*/; + operator := test1::YOperator::DoY; + operator := /*<error>*/imperativeOCL::SeverityKind::error/*</error>*/; + }; +} diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/test1.ecore b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/test1.ecore new file mode 100644 index 000000000..47ab11404 --- /dev/null +++ b/tests/org.eclipse.m2m.tests.qvt.oml/parserTestData/sources/bug490424/test1.ecore @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="test1" nsURI="http://example.org/test1" nsPrefix="test1"> + <eClassifiers xsi:type="ecore:EClass" name="XExpression"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1" + eType="#//XOperator"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EEnum" name="XOperator"> + <eLiterals name="DoX" literal="DoX"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EEnum" name="YOperator"> + <eLiterals name="DoY" value="11" literal="DoY"/> + </eClassifiers> + <eClassifiers xsi:type="ecore:EClass" name="YExpression"> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" lowerBound="1" + eType="#//YOperator"/> + </eClassifiers> +</ecore:EPackage> 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 d39fcf9e9..055ac4013 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 @@ -13,6 +13,10 @@ *******************************************************************************/ package org.eclipse.m2m.tests.qvt.oml; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.emf.common.util.URI; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @@ -33,6 +37,12 @@ public class ParserTests { usesSourceAnnotations = false; } + public TestData includeMetamodel(String relativePath) { + URI relativeURI = URI.createURI(relativePath); + ecoreFileMetamodels.add(relativeURI); + return this; + } + public String getDir() { return myDir; } public int getErrCount() { return myErrCount; } public int getWarnCount() { return myWarnCount; } @@ -45,6 +55,10 @@ public class ParserTests { return usesSourceAnnotations; } + public List<URI> getMetamodels() { + return ecoreFileMetamodels; + } + @Override public String toString() { return getDir(); @@ -53,6 +67,7 @@ public class ParserTests { private final String myDir; private final int myErrCount; private final int myWarnCount; + protected final List<URI> ecoreFileMetamodels = new ArrayList<URI>(); private boolean usesSourceAnnotations; /** diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/TestQvtParser.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/TestQvtParser.java index c549c9098..8367897ae 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/TestQvtParser.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/TestQvtParser.java @@ -32,11 +32,13 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.URIUtil; import org.eclipse.emf.common.util.BasicMonitor; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.m2m.internal.qvt.oml.QvtMessage; import org.eclipse.m2m.internal.qvt.oml.common.MDAConstants; import org.eclipse.m2m.internal.qvt.oml.common.io.FileUtil; import org.eclipse.m2m.internal.qvt.oml.compiler.CompiledUnit; -import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerUtils; import org.eclipse.m2m.internal.qvt.oml.compiler.QVTOCompiler; import org.eclipse.m2m.internal.qvt.oml.compiler.QvtCompilerOptions; import org.eclipse.m2m.internal.qvt.oml.compiler.UnitProxy; @@ -218,6 +220,7 @@ public class TestQvtParser extends TestCase { TestData.createSourceChecked("bug484020", 14, 0), //$NON-NLS-1$ TestData.createSourceChecked("bug473151", 0, 5), //$NON-NLS-1$ new TestData("bug488742", 0), //$NON-NLS-1$ + TestData.createSourceChecked("bug490424", 4, 0).includeMetamodel("test1.ecore"), //$NON-NLS-1$ //$NON-NLS-2$ } ); } @@ -257,10 +260,17 @@ public class TestQvtParser extends TestCase { public void runTest() throws Exception { copyData("sources/" + myData.getDir(), "parserTestData/sources/" + myData.getDir()); //$NON-NLS-1$ //$NON-NLS-2$ - File folder = getDestinationFolder(); //$NON-NLS-1$ + final File folder = getDestinationFolder(); assertTrue("Invalid folder " + folder, folder.exists() && folder.isDirectory()); //$NON-NLS-1$ - //System.err.println("testParsing: " + folder.getName()); //$NON-NLS-1$ + resSet = TestUtil.getMetamodelResolutionRS(new ResourceSetImpl(), myData.getMetamodels(), new TestUtil.UriProvider() { + + public URI getModelUri(String model) { + String absolutePath = getFile(folder, model).getAbsolutePath(); + return URI.createFileURI(absolutePath); + } + }); + myCompiled = compile(folder); assertTrue("No results", myCompiled.length > 0); //$NON-NLS-1$ @@ -368,7 +378,7 @@ public class TestQvtParser extends TestCase { final String topName = folder.getName() + MDAConstants.QVTO_FILE_EXTENSION_WITH_DOT; getFile(folder, topName); WorkspaceUnitResolver resolver = new WorkspaceUnitResolver(Collections.singletonList(getIFolder(folder))); - QVTOCompiler compiler = CompilerUtils.createCompiler(); + QVTOCompiler compiler = QVTOCompiler.createCompiler(resSet.getPackageRegistry()); QvtCompilerOptions options = new QvtCompilerOptions(); options.setGenerateCompletionData(false); @@ -405,4 +415,5 @@ public class TestQvtParser extends TestCase { private final TestData myData; private TestProject myProject; private CompiledUnit[] myCompiled; + private ResourceSet resSet; } diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/DebugExecutorTest.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/DebugExecutorTest.java index 180d8c6b7..835472502 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/DebugExecutorTest.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/DebugExecutorTest.java @@ -26,9 +26,6 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.common.util.WrappedException; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; @@ -215,41 +212,12 @@ public class DebugExecutorTest extends TestCase { } protected ResourceSet getMetamodelResolutionRS() { - ResourceSet resSet = new ResourceSetImpl(); - - if (myData.getEcoreMetamodels().isEmpty()) { - return resSet; - } - - EPackage.Registry packageRegistry = resSet.getPackageRegistry(); - - for (URI ecoreFileURI : myData.getEcoreMetamodels()) { - URI absoluteURI = ecoreFileURI; - if(ecoreFileURI.isRelative()) { - absoluteURI = getModelUri(ecoreFileURI.toString()); - } - - EPackage metamodelPackage = null; - try { - Resource ecoreResource = resSet.getResource(absoluteURI, true); - if(!ecoreResource.getContents().isEmpty()) { - EObject obj = ecoreResource.getContents().get(0); - if(obj instanceof EPackage) { - metamodelPackage = (EPackage) obj; - } - } - } catch (WrappedException e) { - TestCase.fail("Failed to load metamodel EPackage. " + e.getMessage()); //$NON-NLS-1$ + return TestUtil.getMetamodelResolutionRS(new ResourceSetImpl(), myData.getEcoreMetamodels(), new TestUtil.UriProvider() { + + public URI getModelUri(String model) { + return DebugExecutorTest.this.getModelUri(model); } - - if(metamodelPackage == null) { - TestCase.fail("No metamodel EPackage available in " + absoluteURI); //$NON-NLS-1$ - } - - packageRegistry.put(metamodelPackage.getNsURI(), metamodelPackage); - } - - return resSet; + }); } private void copyModelData() throws Exception { diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TestQvtStandaloneExecutor.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TestQvtStandaloneExecutor.java index 3bfa5f81f..29c887711 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TestQvtStandaloneExecutor.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TestQvtStandaloneExecutor.java @@ -88,7 +88,7 @@ public class TestQvtStandaloneExecutor extends TestQvtExecutor { return URI.createFileURI(new File("").getAbsolutePath()).appendSegment(getTestDataFolder()).appendSegment(ModelTestData.MODEL_FOLDER).appendSegment(getName()).appendSegment(getName()).appendFileExtension(MDAConstants.QVTO_FILE_EXTENSION); } - URI getModelUri(String name) { + public URI getModelUri(String name) { return URI.createFileURI(new File("").getAbsolutePath()).appendSegment(getTestDataFolder()).appendSegment(ModelTestData.MODEL_FOLDER).appendSegment(getName()).appendSegment(name); } diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TransformationExecutorTest.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TransformationExecutorTest.java index 378362399..c6c576c0c 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TransformationExecutorTest.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/callapi/TransformationExecutorTest.java @@ -21,9 +21,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.common.util.WrappedException; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; @@ -45,6 +42,7 @@ import org.eclipse.m2m.qvt.oml.TransformationExecutor; import org.eclipse.m2m.qvt.oml.util.Trace; import org.eclipse.m2m.tests.qvt.oml.transform.FileToFileData; import org.eclipse.m2m.tests.qvt.oml.transform.ModelTestData; +import org.eclipse.m2m.tests.qvt.oml.util.TestUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -67,7 +65,7 @@ public abstract class TransformationExecutorTest extends TestCase { ResourceSet resSet; - static class UriCreator extends FileToFileData { + static class UriCreator extends FileToFileData implements TestUtil.UriProvider { UriCreator(String name) { super(name); } @@ -78,7 +76,7 @@ public abstract class TransformationExecutorTest extends TestCase { + MDAConstants.QVTO_FILE_EXTENSION_WITH_DOT, true); } - URI getModelUri(String name) { + public URI getModelUri(String name) { return URI.createPlatformPluginURI(getBundle() + IPath.SEPARATOR + getTestDataFolder() + IPath.SEPARATOR + ModelTestData.MODEL_FOLDER + IPath.SEPARATOR + getName() + IPath.SEPARATOR + name, true); } @@ -206,41 +204,7 @@ public abstract class TransformationExecutorTest extends TestCase { } protected ResourceSet getMetamodelResolutionRS() { - ResourceSet resSet = createResourceSet(); - - if (getEcoreMetamodels().isEmpty()) { - return resSet; - } - - EPackage.Registry packageRegistry = resSet.getPackageRegistry(); - - for (URI ecoreFileURI : getEcoreMetamodels()) { - URI absoluteURI = ecoreFileURI; - if(ecoreFileURI.isRelative()) { - absoluteURI = uriCreator.getModelUri(ecoreFileURI.toString()); - } - - EPackage metamodelPackage = null; - try { - Resource ecoreResource = resSet.getResource(absoluteURI, true); - if(!ecoreResource.getContents().isEmpty()) { - EObject obj = ecoreResource.getContents().get(0); - if(obj instanceof EPackage) { - metamodelPackage = (EPackage) obj; - } - } - } catch (WrappedException e) { - TestCase.fail("Failed to load metamodel EPackage. " + e.getMessage()); //$NON-NLS-1$ - } - - if(metamodelPackage == null) { - TestCase.fail("No metamodel EPackage available in " + absoluteURI); //$NON-NLS-1$ - } - - packageRegistry.put(metamodelPackage.getNsURI(), metamodelPackage); - } - - return resSet; + return TestUtil.getMetamodelResolutionRS(createResourceSet(), getEcoreMetamodels(), uriCreator); } } diff --git a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/util/TestUtil.java b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/util/TestUtil.java index 37b6fa97e..cda97e1f8 100644 --- a/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/util/TestUtil.java +++ b/tests/org.eclipse.m2m.tests.qvt.oml/src/org/eclipse/m2m/tests/qvt/oml/util/TestUtil.java @@ -42,7 +42,11 @@ import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.common.util.WrappedException; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.m2m.internal.qvt.oml.common.MdaException; @@ -310,4 +314,48 @@ public class TestUtil extends Assert { catch (ClassNotFoundException e) { } } + + + public interface UriProvider { + + URI getModelUri(String model); + + } + + public static ResourceSet getMetamodelResolutionRS(ResourceSet resSet, List<URI> metamodels, UriProvider uriProv) { + if (metamodels.isEmpty()) { + return resSet; + } + + EPackage.Registry packageRegistry = resSet.getPackageRegistry(); + + for (URI ecoreFileURI : metamodels) { + URI absoluteURI = ecoreFileURI; + if(ecoreFileURI.isRelative()) { + absoluteURI = uriProv.getModelUri(ecoreFileURI.toString()); + } + + EPackage metamodelPackage = null; + try { + Resource ecoreResource = resSet.getResource(absoluteURI, true); + if(!ecoreResource.getContents().isEmpty()) { + EObject obj = ecoreResource.getContents().get(0); + if(obj instanceof EPackage) { + metamodelPackage = (EPackage) obj; + } + } + } catch (WrappedException e) { + TestCase.fail("Failed to load metamodel EPackage. " + e.getMessage()); //$NON-NLS-1$ + } + + if(metamodelPackage == null) { + TestCase.fail("No metamodel EPackage available in " + absoluteURI); //$NON-NLS-1$ + } + + packageRegistry.put(metamodelPackage.getNsURI(), metamodelPackage); + } + + return resSet; + } + } |