From 7b2e23b94ea5c5a70005af13c2cca5b77b020a11 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Wed, 6 Sep 2017 08:48:46 +0200 Subject: [PATCH] [479137]improved Misleading error message 'Cannot create datatype' for terminal rule #91 - added test - fixed broken test framework Signed-off-by: Christian Dietrich --- .../xtext/tests/TestErrorAcceptor.java | 7 +++- .../Xtext2EcoreTransformerTest.xtend | 16 ++++++++++ .../Xtext2EcoreTransformerTest.java | 32 +++++++++++++++++++ .../Xtext2EcoreTransformer.java | 17 +++++++--- 4 files changed, 67 insertions(+), 5 deletions(-) diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/tests/TestErrorAcceptor.java b/org.eclipse.xtext.tests/src/org/eclipse/xtext/tests/TestErrorAcceptor.java index b2b215e97..70637a14f 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/tests/TestErrorAcceptor.java +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/tests/TestErrorAcceptor.java @@ -28,7 +28,12 @@ public class TestErrorAcceptor extends Assert implements ErrorAcceptor { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return "toString".equals(method.getName()) ? "ANY_EOBJECT" : null; + if ("toString".equals(method.getName())) { + return "ANY_EOBJECT"; + } else if ("equals".equals(method.getName()) && args.length == 1) { + return args[0] instanceof EObject; + } + return null; } }); diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.xtend b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.xtend index 9576ea018..38682f6a1 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.xtend +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.xtend @@ -2123,5 +2123,21 @@ class Xtext2EcoreTransformerTest extends AbstractXtextTests { var featureB_a = clazzB.feature("a") assertEquals("Model", featureB_a.EType.name) } + + @Test def void testIssue91() { + var String grammar = ''' + grammar test.Test + generate test 'http://test' + Foo: + bar = BAR + ; + terminal BAR: + 'bar' + ; + ''' + errorAcceptorMock.acceptError(TransformationErrorCode.NoSuchTypeAvailable, + "Cannot create datatype BAR. Make sure you have imported 'http://www.eclipse.org/emf/2002/Ecore'", TestErrorAcceptor.ANY_EOBJECT) + getEPackageFromGrammar(grammar, 1) + } } diff --git a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.java b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.java index f75a8ef3a..280875eff 100644 --- a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.java +++ b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformerTest.java @@ -43,6 +43,7 @@ import org.eclipse.xtext.tests.AbstractXtextTests; import org.eclipse.xtext.tests.TestErrorAcceptor; import org.eclipse.xtext.util.OnChangeEvictingCache; import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xtext.XtextLinker; import org.eclipse.xtext.xtext.ecoreInference.EClassifierInfos; @@ -2871,4 +2872,35 @@ public class Xtext2EcoreTransformerTest extends AbstractXtextTests { EStructuralFeature featureB_a = this.feature(clazzB, "a"); Assert.assertEquals("Model", featureB_a.getEType().getName()); } + + @Test + public void testIssue91() { + try { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("grammar test.Test"); + _builder.newLine(); + _builder.append("generate test \'http://test\'"); + _builder.newLine(); + _builder.append("Foo:"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("bar = BAR"); + _builder.newLine(); + _builder.append(";"); + _builder.newLine(); + _builder.append("terminal BAR:"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("\'bar\'"); + _builder.newLine(); + _builder.append(";"); + _builder.newLine(); + String grammar = _builder.toString(); + this.errorAcceptorMock.acceptError(TransformationErrorCode.NoSuchTypeAvailable, + "Cannot create datatype BAR. Make sure you have imported \'http://www.eclipse.org/emf/2002/Ecore\'", TestErrorAcceptor.ANY_EOBJECT); + this.getEPackageFromGrammar(grammar, 1); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java b/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java index 2ca506034..f2e048ef2 100755 --- a/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.print.attribute.standard.Media; + import org.apache.log4j.Logger; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; @@ -28,6 +30,7 @@ import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; @@ -1016,12 +1019,18 @@ public class Xtext2EcoreTransformer { EClassifier classifier = generatedEPackage.getEClassifier(classifierName); if (classifier == null) { - if (GrammarUtil.containingParserRule(typeRef) != null) + if (GrammarUtil.containingParserRule(typeRef) != null) { classifier = EcoreFactory.eINSTANCE.createEClass(); - else if (GrammarUtil.containingEnumRule(typeRef) != null) + } else if (GrammarUtil.containingEnumRule(typeRef) != null) { classifier = EcoreFactory.eINSTANCE.createEEnum(); - else - throw new TransformationException(TransformationErrorCode.NoSuchTypeAvailable, "Cannot create datatype " + classifierName, typeRef); + } else { + for (AbstractMetamodelDeclaration mmd : grammar.getMetamodelDeclarations()) { + if (mmd instanceof ReferencedMetamodel && mmd.getEPackage() != null && mmd.getEPackage().getNsURI().equals(EcorePackage.eNS_URI)) { + throw new TransformationException(TransformationErrorCode.NoSuchTypeAvailable, "Cannot create datatype " + classifierName, typeRef); + } + } + throw new TransformationException(TransformationErrorCode.NoSuchTypeAvailable, "Cannot create datatype " + classifierName + ". Make sure you have imported '"+EcorePackage.eNS_URI+"'", typeRef); + } classifier.setName(classifierName); generatedEPackage.getEClassifiers().add(classifier); typeRef.setClassifier(classifier);