diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java index 866d5fa89..4ac6e5a8c 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java @@ -21,6 +21,7 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -132,7 +133,7 @@ public class EcoreUtil2 extends EcoreUtil { if (isCommonCompatibleType(candidate, sortedCandidates)) return candidate; - return null; + return EcorePackage.Literals.EOBJECT; } private static class EClassTypeHierarchyComparator implements Comparator { diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/metamodel/Xtext2ECoreInterpretationContext.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/metamodel/Xtext2ECoreInterpretationContext.java index d169c75da..821d878fd 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/metamodel/Xtext2ECoreInterpretationContext.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/metamodel/Xtext2ECoreInterpretationContext.java @@ -16,7 +16,6 @@ import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.AbstractElement; import org.eclipse.xtext.AbstractRule; -import org.eclipse.xtext.Action; import org.eclipse.xtext.Alternatives; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.CrossReference; diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/EcoreUtil2Tests.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/EcoreUtil2Tests.java index 0560679a9..88fed92a6 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/EcoreUtil2Tests.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/EcoreUtil2Tests.java @@ -11,11 +11,14 @@ import junit.framework.TestCase; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.EcorePackage; /** * @author Heiko Behrens - Initial contribution and API */ public class EcoreUtil2Tests extends TestCase { + static private final EClass EOBJECT = EcorePackage.Literals.EOBJECT; + private EClass createEClass(String name) { EClass result = EcoreFactory.eINSTANCE.createEClass(); result.setName(name); @@ -39,10 +42,10 @@ public class EcoreUtil2Tests extends TestCase { f.getESuperTypes().add(e); assertSame(a, EcoreUtil2.getCompatibleType(a, a)); - assertSame(null, EcoreUtil2.getCompatibleType(d, f)); + assertSame(EOBJECT, EcoreUtil2.getCompatibleType(d, f)); assertSame(c, EcoreUtil2.getCompatibleType(d, e)); assertSame(b, EcoreUtil2.getCompatibleType(b, f)); - assertSame(null, EcoreUtil2.getCompatibleType(b, c)); + assertSame(EOBJECT, EcoreUtil2.getCompatibleType(b, c)); } public void testCommonCompatibleType02() { diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/resource/metamodel/Xtext2EcoreTransformerTests.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/resource/metamodel/Xtext2EcoreTransformerTests.java index 9b2b3d02b..bdbe83a65 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/resource/metamodel/Xtext2EcoreTransformerTests.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/resource/metamodel/Xtext2EcoreTransformerTests.java @@ -594,4 +594,29 @@ public class Xtext2EcoreTransformerTests extends AbstractGeneratorTest { assertReferenceConfiguration(typeA, 0, "featureA", "RuleC", true, 0, 1); } + public void testAddingDifferentFeaturesWithSameName03() throws Exception { + // independent rules are combined as EObject + String grammar = "language test generate test 'http://test'"; + grammar += " RuleA returns TypeA: featureA1=ID featureA2=RuleD featureA3=RuleC;"; + grammar += " RuleB returns TypeA: featureA2=RuleC featureA4=INT;"; + grammar += " RuleC: featureC=INT;"; + grammar += " RuleD: featureD=ID;"; + EPackage ePackage = getEPackageFromGrammar(grammar); + + assertEquals(3, ePackage.getEClassifiers().size()); + EClass typeA = (EClass) ePackage.getEClassifier("TypeA"); + assertNotNull(typeA); + EClass ruleC = (EClass) ePackage.getEClassifier("RuleC"); + assertNotNull(ruleC); + EClass ruleD = (EClass) ePackage.getEClassifier("RuleD"); + assertNotNull(ruleD); + + assertEquals(2, typeA.getEAllAttributes().size()); + assertAttributeConfiguration(typeA, 0, "featureA1", "EString"); + assertAttributeConfiguration(typeA, 1, "featureA4", "EInt"); + + assertEquals(2, typeA.getEReferences().size()); + assertReferenceConfiguration(typeA, 0, "featureA2", "EObject", true, 0, 1); + assertReferenceConfiguration(typeA, 1, "featureA3", "RuleC", true, 0, 1); + } }