This commit is contained in:
sefftinge 2008-10-08 12:28:06 +00:00
parent a849b76b90
commit a89298ee83
3 changed files with 41 additions and 6 deletions

View file

@ -17,6 +17,7 @@ import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.resource.metamodel.ErrorAcceptor.ErrorCode;
import org.eclipse.xtext.util.Strings;
/**
* @author Jan Köhnlein - Initial contribution and API
@ -89,8 +90,12 @@ public abstract class EClassifierInfo {
public boolean addFeature(EStructuralFeature prototype) {
try {
return addFeature(prototype.getName(), prototype.getEType(), prototype.isMany(), prototype
.getUpperBound() > 1, null);
boolean isContainment = false;
if (prototype instanceof EReference) {
EReference reference = (EReference) prototype;
isContainment = reference.isContainment();
}
return addFeature(prototype.getName(), prototype.getEType(), prototype.isMany(), isContainment, null);
}
catch (TransformationException e) {
throw new IllegalArgumentException(e.getMessage());
@ -163,13 +168,16 @@ public abstract class EClassifierInfo {
@Override
public boolean addSupertype(EClassifierInfo superTypeInfo) {
throw new UnsupportedOperationException("Cannot add supertype to simple datatype");
throw new UnsupportedOperationException("Cannot add supertype "
+ Strings.emptyIfNull(superTypeInfo.getEClassifier().getName()) + " to simple datatype "
+ Strings.emptyIfNull(this.getEClassifier().getName()));
}
@Override
public boolean addFeature(String featureName, EClassifierInfo featureType, boolean isMultivalue,
boolean isContainment, EObject parserElement) throws TransformationException {
throw new UnsupportedOperationException("Cannot add feature to simple datatype");
throw new UnsupportedOperationException("Cannot add feature " + featureName + " to simple datatype"
+ Strings.emptyIfNull(this.getEClassifier().getName()));
}
}

View file

@ -71,11 +71,12 @@ public class TypeHierarchyHelperTests extends TestCase {
eClass.getEClass().getEStructuralFeatures().add(feature);
}
private void addReference(EClassInfo eClass, EClassInfo ref, String name) {
private EReference addReference(EClassInfo eClass, EClassInfo ref, String name) {
EReference feature = EcoreFactory.eINSTANCE.createEReference();
feature.setName(name);
feature.setEType(ref.getEClassifier());
eClass.getEClass().getEStructuralFeatures().add(feature);
return feature;
}
public void testSimpeCase01() throws Exception {
@ -220,6 +221,32 @@ public class TypeHierarchyHelperTests extends TestCase {
assertEquals(0, c.getEClass().getEStructuralFeatures().size());
}
public void testConfigurationOfLiftedReference() throws Exception {
EClassInfo a = addClass("a");
EClassInfo b = addClass("b");
EClassInfo c = addClass("c");
b.addSupertype(a);
c.addSupertype(a);
EReference refB = addReference(b, a, "ref");
refB.setContainment(true);
EReference refC = addReference(c, a, "ref");
refC.setContainment(true);
assertEquals(0, a.getEClass().getEStructuralFeatures().size());
assertEquals(1, b.getEClass().getEStructuralFeatures().size());
assertEquals(1, c.getEClass().getEStructuralFeatures().size());
liftUpFeatures();
assertEquals(1, a.getEClass().getEStructuralFeatures().size());
assertEquals(0, b.getEClass().getEStructuralFeatures().size());
assertEquals(0, c.getEClass().getEStructuralFeatures().size());
EReference refA = (EReference) a.getEClass().getEStructuralFeatures().get(0);
assertTrue(refA.isContainment());
}
public void testDublicateDerivedFeature() throws Exception {
EClassInfo a = addClass("a");
EClassInfo b = addClass("b");

View file

@ -337,7 +337,7 @@ public class Xtext2EcoreTransformerTests extends AbstractGeneratorTest {
assertEquals(1, ruleA.getEAttributes().size());
assertAttributeConfiguration(ruleA, 0, "featureAS", "EString");
assertEquals(1, ruleA.getEReferences().size());
assertReferenceConfiguration(ruleA, 0, "a", "RuleA", false, 0, 1);
assertReferenceConfiguration(ruleA, 0, "a", "RuleA", true, 0, 1);
assertEquals(0, add.getEAttributes().size());
assertEquals(0, add.getEReferences().size());