diff options
author | Ed Willink | 2018-08-21 11:13:23 +0000 |
---|---|---|
committer | Ed Willink | 2018-09-04 12:19:47 +0000 |
commit | c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3 (patch) | |
tree | 37581df6173d51b1aa60c37d99338a4541c46f5a | |
parent | b6ea966062d14ff21ce28459342069908cad42a2 (diff) | |
download | org.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.tar.gz org.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.tar.xz org.eclipse.qvtd-c25cdd01c16a65d4859fbeecaa5a58834b9aa9e3.zip |
[529130] Eliminate spurious containment supertypes
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)); |