Patch from Heiko

Common Compatible Type of two EClasses is always EObject
see https://bugs.eclipse.org/bugs/attachment.cgi?id=113712
This commit is contained in:
jkohnlein 2008-09-29 11:56:32 +00:00
parent b6ccf855d9
commit 103b86c201
4 changed files with 32 additions and 4 deletions

View file

@ -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<EClass> {

View file

@ -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;

View file

@ -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() {

View file

@ -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);
}
}