Bug 157035

Summary: "Open Type Hierarchy" fails if subtype is anonymous or local class and location for this subtype contains ".class"
Product: [Eclipse Project] JDT Reporter: Ilya Klyuchnikov <ilya.klyuchnikov>
Component: CoreAssignee: Jerome Lanneluc <jerome_lanneluc>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: 3.2   
Target Milestone: 3.3 M5   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Attachments:
Description Flags
"bugged" java project none

Description Ilya Klyuchnikov CLA 2006-09-12 09:57:14 EDT
If type for which "Open Type Hierarchy" runs is local/anonymous and has location containing ".class" (e.g /example/bug.classic.example.jar|bug/example/Main$1.class) "Open Type Hierarchy" fails:

...
Root exception:
java.lang.StringIndexOutOfBoundsException: String index out of range: -38
at java.lang.String.substring(String.java:1768)
at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder$1.acceptIndexMatch(IndexBasedHierarchyBuilder.java:456)
at org.eclipse.jdt.internal.core.search.matching.InternalSearchPattern.acceptMatch(InternalSearchPattern.java:45)
at org.eclipse.jdt.internal.core.search.matching.InternalSearchPattern.findIndexMatches(InternalSearchPattern.java:89)
at org.eclipse.jdt.internal.core.search.matching.MatchLocator.findIndexMatches(MatchLocator.java:325)
at org.eclipse.jdt.internal.core.search.PatternSearchJob.search(PatternSearchJob.java:114)
at org.eclipse.jdt.internal.core.search.SubTypeSearchJob.search(SubTypeSearchJob.java:37)
at org.eclipse.jdt.internal.core.search.PatternSearchJob.execute(PatternSearchJob.java:64)
at org.eclipse.jdt.internal.core.search.processing.JobManager.performConcurrentJob(JobManager.java:261)
at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.searchAllPossibleSubTypes(IndexBasedHierarchyBuilder.java:501)
at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.determinePossibleSubTypes(IndexBasedHierarchyBuilder.java:384)
at org.eclipse.jdt.internal.core.hierarchy.IndexBasedHierarchyBuilder.build(IndexBasedHierarchyBuilder.java:118)
at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.compute(TypeHierarchy.java:300)
at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.refresh(TypeHierarchy.java:1235)
at org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation.executeOperation(CreateTypeHierarchyOperation.java:90)
at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:877)
at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:896)
at org.eclipse.jdt.internal.core.BinaryType.newTypeHierarchy(BinaryType.java:866)
at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.createTypeHierarchy(TypeHierarchyLifeCycle.java:118)
at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.doHierarchyRefresh(TypeHierarchyLifeCycle.java:157)
at org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle$1.run(TypeHierarchyLifeCycle.java:98)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:113)

How to reprodeuce:
1)create supertype:

package bug.example;

public interface MyInterface {
	void doIt();
}

2) create anonymous subtype:

package bug.example;

public class Main {

	public static void main(String[] args) {
		MyInterface myInterface = new MyInterface() {
			public void doIt() {
			}
		};
		myInterface.doIt();
	}

}

3) pack it in jar "bug.classic.example.jar"

4) create java project in eclipse, add this jar to project build path

5) try to open type hierarchy for bug.example.MyInterface
Comment 1 Ilya Klyuchnikov CLA 2006-09-12 10:00:40 EDT
Created attachment 49933 [details]
"bugged" java project
Comment 2 Jerome Lanneluc CLA 2007-01-10 07:27:31 EST
Changed IndexBasedHierarchyBuilder#searchAllPossibleSubTypes(...) to use lastIndexOf(".class") instead of indexOf(".class").
Added regression test TypeHierarchyTests#testBinaryTypeInDotClassJar().

Released for 3.3M5 in HEAD.
Comment 3 Olivier Thomann CLA 2007-02-05 11:23:21 EST
Verified for 3.3M5 using I20070205-0009.