Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2018-08-21 11:13:23 +0000
committerEd Willink2018-09-04 12:19:47 +0000
commitc25cdd01c16a65d4859fbeecaa5a58834b9aa9e3 (patch)
tree37581df6173d51b1aa60c37d99338a4541c46f5a
parentb6ea966062d14ff21ce28459342069908cad42a2 (diff)
downloadorg.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.tar.gz
org.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.tar.xz
org.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.zip
[529130] Eliminate spurious containment supertypes
-rw-r--r--plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ContainmentAnalysis.java25
-rw-r--r--tests/org.eclipse.qvtd.compiler.tests/src/org/eclipse/qvtd/compiler/tests/AnalysisTests.java16
2 files changed, 24 insertions, 17 deletions
diff --git a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ContainmentAnalysis.java b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ContainmentAnalysis.java
index b4564ec22..1b1092699 100644
--- a/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ContainmentAnalysis.java
+++ b/plugins/org.eclipse.qvtd.compiler/src/org/eclipse/qvtd/compiler/internal/qvtb2qvts/ContainmentAnalysis.java
@@ -18,22 +18,27 @@ import java.util.List;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.ocl.pivot.CollectionType;
import org.eclipse.ocl.pivot.CompleteClass;
import org.eclipse.ocl.pivot.CompleteModel;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
import org.eclipse.ocl.pivot.utilities.FeatureFilter;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
/**
* ContainmentAnalysis provides an analysis of all declared containment relationships in the EnvironmentFactory's resources. It therefore supports the compile time question:
*
* What declared container types could contain this declared contained type?
*
- * The declared contained type could actually be any of its subclasses, so the containment properties must consider them all.
- * The actual container types could be the sub-class of each possible containment property.
- * The declared container types could be the super-classes too.
+ * The declared contained type could actually be any of its subtypes, so the containment properties must consider them all super-types of 'this declared container type'.
+ * The actual containing types could also be an of the subtypes of each possible containing property owner.
+ *
+ * Considering e.g. EPackage.eClassifers, the containment is declared to contain EClassifier but may also be the container of the EClass/EDataType subtypes. The container is declared
+ * to be EPackage but could be a subtype of EPackage.
+ *
+ * The more general usage of anENamedElement.eClassifiers anotherENamedElement has selective solutions when anENamedElement and anotherENamedElement are suitable derived classes,
+ * but this is a separate problem requiring oclIsKindOf guards around the attempted containment test.
*/
public class ContainmentAnalysis
{
@@ -57,7 +62,7 @@ public class ContainmentAnalysis
this.completeModel = environmentFactory.getCompleteModel();
this.inheritanceAnalysis = new InheritanceAnalysis(environmentFactory);
for (@NonNull CompleteClass completeClass : inheritanceAnalysis.getAllCompleteClasses()) {
- computeContainedClass2ContainerClasses(completeClass);
+ computeContainedClass2containerClasses(completeClass);
}
}
@@ -81,16 +86,12 @@ public class ContainmentAnalysis
}
}
- private void computeContainedClass2ContainerClasses(@NonNull CompleteClass containerCompleteClass) {
+ private void computeContainedClass2containerClasses(@NonNull CompleteClass containerCompleteClass) {
for (@NonNull Property property : containerCompleteClass.getProperties(FeatureFilter.SELECT_NON_STATIC)) {
if (property.isIsComposite()) {
- Type type = property.getType();
- if (type instanceof CollectionType) {
- type = ((CollectionType) type).getElementType();
- }
- assert type != null;
+ Type type = PivotUtil.getElementalType(PivotUtil.getType(property));
CompleteClass containedCompleteClass = completeModel.getCompleteClass(type);
- for (@NonNull CompleteClass containedSubCompleteClass : inheritanceAnalysis.getAllSuperAndSelfAndSubClasses(containedCompleteClass)) {
+ for (@NonNull CompleteClass containedSubCompleteClass : inheritanceAnalysis./*getAllSuperAndSelfAndSubClasses*/getAllSelfAndSubClasses(containedCompleteClass)) {
addContainmentForContainedClasses(containerCompleteClass, property, containedSubCompleteClass);
}
}
diff --git a/tests/org.eclipse.qvtd.compiler.tests/src/org/eclipse/qvtd/compiler/tests/AnalysisTests.java b/tests/org.eclipse.qvtd.compiler.tests/src/org/eclipse/qvtd/compiler/tests/AnalysisTests.java
index 161b7d46f..9738d5c91 100644
--- a/tests/org.eclipse.qvtd.compiler.tests/src/org/eclipse/qvtd/compiler/tests/AnalysisTests.java
+++ b/tests/org.eclipse.qvtd.compiler.tests/src/org/eclipse/qvtd/compiler/tests/AnalysisTests.java
@@ -135,7 +135,8 @@ public class AnalysisTests extends XtextTestCase
ContainmentAnalysis containmentAnalysis = new ContainmentAnalysis(environmentFactory);
//
Set<@NonNull CompleteClass> oclAnyContainerClasses = Sets.newHashSet(containmentAnalysis.getContainerClasses(oclAnyClass));
- assertTrue((100 <= oclAnyContainerClasses.size()) && (oclAnyContainerClasses.size() <= 200)); // Currently 142
+ assertEquals(0, oclAnyContainerClasses.size());
+ // assertTrue((100 <= oclAnyContainerClasses.size()) && (oclAnyContainerClasses.size() <= 200)); // Currently 142
//
Set<@NonNull CompleteClass> eAnnotationContainerClasses = Sets.newHashSet(containmentAnalysis.getContainerClasses(eAnnotationClass));
assertEquals(Sets.newHashSet(eAnnotationClass, eAttributeClass, eClassClass, eClassifierClass, eDataTypeClass, eEnumClass, eEnumLiteralClass, eFactoryClass, eModelElementClass, eNamedElementClass, eOperationClass, ePackageClass, eParameterClass, eReferenceClass, eStructuralFeatureClass, eTypeParameterClass, eTypedElementClass), eAnnotationContainerClasses);
@@ -150,10 +151,12 @@ public class AnalysisTests extends XtextTestCase
assertEquals(Sets.newHashSet(ePackageClass), eClassifierSubClasses);
//
Set<@NonNull CompleteClass> eTypedElementContainerClasses = Sets.newHashSet(containmentAnalysis.getContainerClasses(eTypedElementClass));
- assertEquals(Sets.newHashSet(eClassClass, eOperationClass), eTypedElementContainerClasses);
+ assertEquals(0, eTypedElementContainerClasses.size());
+ // assertEquals(Sets.newHashSet(eClassClass, eOperationClass), eTypedElementContainerClasses);
//
Set<@NonNull CompleteClass> eModelElementContainerClasses = Sets.newHashSet(containmentAnalysis.getContainerClasses(eModelElementClass));
- assertEquals(Sets.newHashSet(eAnnotationClass, eAttributeClass, eClassClass, eClassifierClass, eDataTypeClass, eEnumClass, eEnumLiteralClass, eFactoryClass, eModelElementClass, eNamedElementClass, eOperationClass, ePackageClass, eParameterClass, eReferenceClass, eStructuralFeatureClass, eTypeParameterClass, eTypedElementClass), eModelElementContainerClasses);
+ assertEquals(0, eModelElementContainerClasses.size());
+ // assertEquals(Sets.newHashSet(eAnnotationClass, eAttributeClass, eClassClass, eClassifierClass, eDataTypeClass, eEnumClass, eEnumLiteralClass, eFactoryClass, eModelElementClass, eNamedElementClass, eOperationClass, ePackageClass, eParameterClass, eReferenceClass, eStructuralFeatureClass, eTypeParameterClass, eTypedElementClass), eModelElementContainerClasses);
//
Set<@NonNull CompleteClass> eGenericTypeContainerClasses = Sets.newHashSet(containmentAnalysis.getContainerClasses(eGenericTypeClass));
assertEquals(Sets.newHashSet(eAttributeClass, eClassClass, eGenericTypeClass, eOperationClass, eParameterClass, eReferenceClass, eStructuralFeatureClass, eTypeParameterClass, eTypedElementClass), eGenericTypeContainerClasses);
@@ -201,7 +204,8 @@ public class AnalysisTests extends XtextTestCase
ContainmentAnalysis containmentAnalysis = new ContainmentAnalysis(environmentFactory);
//
Set<@NonNull Property> oclAnyContainerProperties = Sets.newHashSet(containmentAnalysis.getContainmentProperties(oclAnyClass));
- assertTrue((100 <= oclAnyContainerProperties.size()) && (oclAnyContainerProperties.size() <= 120)); // Currently 104
+ assertEquals(0, oclAnyContainerProperties.size());
+ // assertTrue((100 <= oclAnyContainerProperties.size()) && (oclAnyContainerProperties.size() <= 120)); // Currently 104
//
Set<@NonNull Property> eAnnotationContainerProperties = Sets.newHashSet(containmentAnalysis.getContainmentProperties(eAnnotationClass));
assertEquals(Sets.newHashSet(/*eAnnotation__contents,*/ eModelElement__eAnnotations), eAnnotationContainerProperties);
@@ -334,7 +338,8 @@ public class AnalysisTests extends XtextTestCase
assertEquals(expectedReturns, actualReturns);
Set<@NonNull List<@NonNull Element>> actualHiddens = toElements(analyze.getHiddenPaths());
// Set<@NonNull List<@NonNull Element>> expectedHiddens = toExpected(Lists.newArrayList(employeeClass.getPrimaryClass()));
- assertEquals(187, actualHiddens.size());
+ // assertEquals(187, actualHiddens.size());
+ assertEquals(17, actualHiddens.size());
//
// "1_.getEmployees()" where 1_ is a department
//
@@ -379,6 +384,7 @@ public class AnalysisTests extends XtextTestCase
expectedHiddens.add(Lists.newArrayList(employeeClass.getPrimaryClass()));
expectedHiddens.add(Lists.newArrayList(companyClass.getPrimaryClass()));
expectedHiddens.add(Lists.newArrayList(companyClass.getPrimaryClass(), companyDepts));
+ expectedHiddens.add(Lists.newArrayList(departmentClass.getPrimaryClass())); //+
expectedHiddens.add(Lists.newArrayList(departmentClass.getPrimaryClass(), departmentEmployees));
expectedHiddens.add(Lists.newArrayList(departmentClass.getPrimaryClass(), departmentManager));
expectedHiddens.add(Lists.newArrayList(departmentClass.getPrimaryClass(), departmentSubdepts));

Back to the top