getEClassForClass gives unexpected result in presence of inheritance
Suppose there are two EClasses A
and B
where A
is a supertype of B
. In this situation, the call getEClassForClass(A.getInstanceClass())
may return either A
or B
. It is unexpected that B
can be returned.
It seems that getEClassForClass(clazz)
picks the first EClass whose instance class is assignable to clazz
. Depending on the order of the packages in the package cache, this can be either A
or B
:
// Query all registered EPackages for the given clazz
for(EPackage ePackage : ePackagesCache) {
for(EClassifier eClassifier : ePackage.getEClassifiers()) {
if(eClassifier instanceof EClass && eClassifier.getInstanceClass() != null &&
clazz.isAssignableFrom(eClassifier.getInstanceClass())) {
eClass = (EClass)eClassifier;
clazz2EClassCache.put(clazz, eClass);
return eClass;
}
}
}
return null;
Should this code be changed so that it returns not just any EClass whose instance class is assignable to clazz
but a most general one?
// Query all registered EPackages for the given clazz
for(EPackage ePackage : ePackagesCache) {
for(EClassifier eClassifier : ePackage.getEClassifiers()) {
if(eClassifier instanceof EClass && eClassifier.getInstanceClass() != null &&
clazz.isAssignableFrom(eClassifier.getInstanceClass())) {
if(eClass == null || /* eClassifier is more general then eClass */ eClassifier
.getInstanceClass().isAssignableFrom(eClass.getInstanceClass())) {
eClass = (EClass)eClassifier;
clazz2EClassCache.put(clazz, eClass);
}
}
}
}
return eClass;