### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java,v retrieving revision 1.87 diff -u -r1.87 TypeHierarchyTests.java --- src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java 27 May 2008 23:59:54 -0000 1.87 +++ src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java 12 Jun 2008 15:55:52 -0000 @@ -413,8 +413,7 @@ assertHierarchyEquals( "Focus: X [in X.class [in [in lib [in P]]]]\n" + "Super types:\n" + - "Sub types:\n" + - "Root classes:\n", + "Sub types:\n", hierarchy); } finally { deleteProject("P"); @@ -788,15 +787,15 @@ " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + "Sub types:\n" + " [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + - " Y2 [in foo() [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " [in field1 [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " [in field2 [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " [in foo() [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " [in field2 [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + " Y1 [in foo() [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + - " Y2 [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + - " Y1 [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n", + " Y2 [in foo() [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + + " Y1 [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n" + + " Y2 [in [in A [in A.java [in p7 [in src [in TypeHierarchy]]]]]]\n", hierarchy); } /* @@ -809,10 +808,10 @@ "Focus: X [in X.java [in [in src [in TypeHierarchy15]]]]\n" + "Super types:\n" + " ArrayList [in ArrayList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " AbstractList [in AbstractList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString("1.5") + "]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + "Sub types:\n", hierarchy ); @@ -827,8 +826,8 @@ "Focus: ArrayList [in ArrayList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + "Super types:\n" + " AbstractList [in AbstractList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString("1.5") + "]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + "Sub types:\n" + " X [in X.java [in [in src [in TypeHierarchy15]]]]\n" + " Y [in Y.java [in [in src [in TypeHierarchy15]]]]\n", @@ -845,10 +844,10 @@ "Focus: Y [in Y.java [in [in src [in TypeHierarchy15]]]]\n" + "Super types:\n" + " ArrayList [in ArrayList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " AbstractList [in AbstractList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString("1.5") + "]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + "Sub types:\n", hierarchy ); @@ -864,10 +863,10 @@ "Focus: X [in X.java [in [in src [in TypeHierarchy15]]]]\n" + "Super types:\n" + " ArrayList [in ArrayList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " AbstractList [in AbstractList.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + - " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString("1.5") + "]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + + " List [in List.class [in util [in lib15.jar [in TypeHierarchy15]]]]\n" + "Sub types:\n", hierarchy ); @@ -1838,24 +1837,68 @@ ITypeHierarchy hierarchy = JavaCore.newTypeHierarchy(region, null, null); assertHierarchyEquals( "Focus: \n" + + "Super types of root classes:\n" + + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + "Sub types of root classes:\n" + - " Class [in Class.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " Y [in Y.java [in [in [in P2]]]]\n" + - " Z [in Z.java [in [in [in P3]]]]\n" + - " String [in String.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " Error [in Error.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " CloneNotSupportedException [in CloneNotSupportedException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " IllegalMonitorStateException [in IllegalMonitorStateException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " InterruptedException [in InterruptedException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " RuntimeException [in RuntimeException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " Exception [in Exception.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " Throwable [in Throwable.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + - " X [in X.java [in [in [in P1]]]]\n", + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " Class [in Class.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " String [in String.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " Throwable [in Throwable.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " Error [in Error.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " Exception [in Exception.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " CloneNotSupportedException [in CloneNotSupportedException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " InterruptedException [in InterruptedException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " RuntimeException [in RuntimeException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " IllegalMonitorStateException [in IllegalMonitorStateException.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " X [in X.java [in [in [in P1]]]]\n" + + " Y [in Y.java [in [in [in P2]]]]\n" + + " Z [in Z.java [in [in [in P3]]]]\n", hierarchy); } finally { deleteProjects(new String[] {"P1", "P2", "P3"}); } } +/* + * Ensures that a type hierarchy on a region that contains a type with a missing super class is correct + * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=154865 ) + */ +public void testRegion5() throws Exception { + try { + createJavaProject("P", new String[] {""}, new String[] {"JCL_LIB"}, ""); + createFolder("/P/p"); + createFile( + "/P/p/X.java", + "package p;\n" + + "public class X {\n" + + "}\n" + + "class Y extends X {\n" + + "}" + ); + createFile( + "/P/p/Z.java", + "package p;\n" + + "public class Z extends Unknown {\n" + + "}" + ); + IPackageFragment pkg = getPackage("/P/p"); + IRegion region = JavaCore.newRegion(); + region.add(pkg); + ITypeHierarchy h = pkg.getJavaProject().newTypeHierarchy(region, null); + assertHierarchyEquals( + "Focus: \n" + + "Super types of root classes:\n" + + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " Z [in Z.java [in p [in [in P]]]]\n" + + "Sub types of root classes:\n" + + " Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + "]]]\n" + + " X [in X.java [in p [in [in P]]]]\n" + + " Y [in X.java [in p [in [in P]]]]\n" + + " Z [in Z.java [in p [in [in P]]]]\n", + h); + } finally { + deleteProject("P"); + } +} /** * @bug 150289: [hierarchy] NPE in hierarchy builder when region is empy * @test Ensure that no NPE is thrown when IRegion has no associated project #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java,v retrieving revision 1.101 diff -u -r1.101 TypeHierarchy.java --- model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java 27 Sep 2007 16:33:51 -0000 1.101 +++ model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java 12 Jun 2008 15:55:53 -0000 @@ -1471,30 +1471,37 @@ public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("Focus: "); //$NON-NLS-1$ - buffer.append(this.focusType == null ? "" : ((JavaElement)this.focusType).toStringWithAncestors(false/*don't show key*/)); //$NON-NLS-1$ - buffer.append("\n"); //$NON-NLS-1$ + if (this.focusType == null) { + buffer.append("\n"); //$NON-NLS-1$ + } else { + toString(buffer, this.focusType, 0); + } if (exists()) { if (this.focusType != null) { buffer.append("Super types:\n"); //$NON-NLS-1$ - toString(buffer, this.focusType, 1, true); + toString(buffer, this.focusType, 0, true); buffer.append("Sub types:\n"); //$NON-NLS-1$ - toString(buffer, this.focusType, 1, false); + toString(buffer, this.focusType, 0, false); } else { - buffer.append("Sub types of root classes:\n"); //$NON-NLS-1$ - IJavaElement[] roots = Util.sortCopy(getRootClasses()); - for (int i= 0; i < roots.length; i++) { - toString(buffer, (IType) roots[i], 1, false); - } - } - if (this.rootClasses.size > 1) { - buffer.append("Root classes:\n"); //$NON-NLS-1$ - IJavaElement[] roots = Util.sortCopy(getRootClasses()); - for (int i = 0, length = roots.length; i < length; i++) { - toString(buffer, (IType) roots[i], 1, false); + if (this.rootClasses.size > 0) { + IJavaElement[] roots = Util.sortCopy(getRootClasses()); + buffer.append("Super types of root classes:\n"); //$NON-NLS-1$ + int length = roots.length; + for (int i = 0; i < length; i++) { + IJavaElement root = roots[i]; + toString(buffer, root, 1); + toString(buffer, root, 1, true); + } + buffer.append("Sub types of root classes:\n"); //$NON-NLS-1$ + for (int i = 0; i < length; i++) { + IJavaElement root = roots[i]; + toString(buffer, root, 1); + toString(buffer, root, 1, false); + } + } else if (this.rootClasses.size == 0) { + // see http://bugs.eclipse.org/bugs/show_bug.cgi?id=24691 + buffer.append("No root classes"); //$NON-NLS-1$ } - } else if (this.rootClasses.size == 0) { - // see http://bugs.eclipse.org/bugs/show_bug.cgi?id=24691 - buffer.append("No root classes"); //$NON-NLS-1$ } } else { buffer.append("(Hierarchy became stale)"); //$NON-NLS-1$ @@ -1506,18 +1513,20 @@ * beginning with the specified indentation level. * If ascendant, shows the super types, otherwise show the sub types. */ -private void toString(StringBuffer buffer, IType type, int indent, boolean ascendant) { - IType[] types= ascendant ? getSupertypes(type) : getSubtypes(type); +private void toString(StringBuffer buffer, IJavaElement type, int indent, boolean ascendant) { + IType[] types= ascendant ? getSupertypes((IType) type) : getSubtypes((IType) type); IJavaElement[] sortedTypes = Util.sortCopy(types); for (int i= 0; i < sortedTypes.length; i++) { - for (int j= 0; j < indent; j++) { - buffer.append(" "); //$NON-NLS-1$ - } - JavaElement element = (JavaElement)sortedTypes[i]; - buffer.append(element.toStringWithAncestors(false/*don't show key*/)); - buffer.append('\n'); - toString(buffer, types[i], indent + 1, ascendant); + toString(buffer, sortedTypes[i], indent + 1); + toString(buffer, sortedTypes[i], indent + 1, ascendant); + } +} +private void toString(StringBuffer buffer, IJavaElement type, int indent) { + for (int j= 0; j < indent; j++) { + buffer.append(" "); //$NON-NLS-1$ } + buffer.append(((JavaElement) type).toStringWithAncestors(false/*don't show key*/)); + buffer.append('\n'); } /** * Returns whether one of the types in this hierarchy has a supertype whose simple Index: model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java,v retrieving revision 1.84 diff -u -r1.84 HierarchyResolver.java --- model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java 27 May 2008 23:40:22 -0000 1.84 +++ model/org/eclipse/jdt/internal/core/hierarchy/HierarchyResolver.java 12 Jun 2008 15:55:53 -0000 @@ -525,7 +525,7 @@ this.builder.connect(suppliedType, this.builder.getHandle(suppliedType, typeBinding), superclass, superinterfaces); } // add java.lang.Object only if the super class is not missing - if (!this.hasMissingSuperClass && objectIndex > -1) { + if (objectIndex > -1 && (!this.hasMissingSuperClass || this.focusType == null)) { IGenericType objectType = this.typeModels[objectIndex]; this.builder.connect(objectType, this.builder.getHandle(objectType, this.typeBindings[objectIndex]), null, null); }