Bug 19638

Summary: Open Type Hierarchy can start infinite progress monitor
Product: [Eclipse Project] JDT Reporter: Grant Gayed <grant_gayed>
Component: CoreAssignee: Jerome Lanneluc <jerome_lanneluc>
Status: VERIFIED FIXED QA Contact:
Severity: critical    
Priority: P3    
Version: 2.0   
Target Milestone: 2.0 F3   
Hardware: PC   
OS: Windows 2000   
Whiteboard:

Description Grant Gayed CLA 2002-06-07 14:22:45 EDT
F2 integration build 0607

- retrieve the org.eclipse.swt project from dev.eclipse.org into your workspace 
(take HEAD)
- in the Resource navigator rename org.eclipse.swt's contained 
file .classpath_win32 to .classpath
- Eclipse does a compilation
- Window -> Open Perspective -> Java
- in the packages viewer expand the org.eclipse.swt tree
- select Eclipse SWT/win32
- right-click -> Open Type Hierarchy
- Hierarchy view comes to front but never populates, and progress monitor in 
bottom-right goes on indefinitely
Comment 1 Erich Gamma CLA 2002-06-08 17:00:24 EDT
Can reproduce and the reason is a NullPointerException during the type 
hierarchy computation (see below). Moving to JDT CORE should investigate for F3.

java.version=1.3.0_02
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
Command-line arguments: -os win32 -ws win32 -arch x86 -install 
file:D:/eclipse/20020607/eclipse/
!ENTRY org.eclipse.jdt.ui 4 1 Jun 08, 2002 23:12:50.841
!MESSAGE Internal Error
!STACK 1
org.eclipse.jdt.core.JavaModelException[4]: java.lang.NullPointerException
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.removeType
(RegionBasedTypeHierarchy.java:140)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.removeType
(RegionBasedTypeHierarchy.java:134)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:111)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:107)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:115)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:99)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedHierarchyBuilder.build
(RegionBasedHierarchyBuilder.java:51)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.compute
(RegionBasedTypeHierarchy.java:73)
	at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.refresh
(TypeHierarchy.java:1131)
	at 
org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation.executeOperation
(CreateTypeHierarchyOperation.java:69)
	at org.eclipse.jdt.internal.core.JavaModelOperation.execute
(JavaModelOperation.java:307)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run
(JavaModelOperation.java:515)
	at org.eclipse.jdt.internal.core.JavaModelManager.runOperation
(JavaModelManager.java:1181)
	at org.eclipse.jdt.internal.core.JavaElement.runOperation
(JavaElement.java:574)
	at org.eclipse.jdt.internal.core.JavaProject.newTypeHierarchy
(JavaProject.java:1597)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.doHierarchyRefr
esh(TypeHierarchyLifeCycle.java:173)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.access$0
(TypeHierarchyLifeCycle.java:133)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle$1.run
(TypeHierarchyLifeCycle.java:109)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread
(ModalContext.java:299)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:249)
	at org.eclipse.jface.window.ApplicationWindow$1.run
(ApplicationWindow.java:394)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:64)
	at org.eclipse.jface.window.ApplicationWindow.run
(ApplicationWindow.java:391)
	at org.eclipse.ui.internal.WorkbenchWindow.run
(WorkbenchWindow.java:1068)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.ensureRefreshed
TypeHierarchy(TypeHierarchyLifeCycle.java:117)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.updateInput
(TypeHierarchyViewPart.java:406)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.setInputElement
(TypeHierarchyViewPart.java:392)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.openInViewPart
(OpenTypeHierarchyUtil.java:120)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.open
(OpenTypeHierarchyUtil.java:97)
	at org.eclipse.jdt.ui.actions.OpenTypeHierarchyAction.run
(OpenTypeHierarchyAction.java:120)
	at org.eclipse.jdt.ui.actions.OpenTypeHierarchyAction.run
(OpenTypeHierarchyAction.java:112)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun
(SelectionDispatchAction.java:178)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run
(SelectionDispatchAction.java:156)
	at org.eclipse.jface.action.Action.runWithEvent(Action.java:749)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection
(ActionContributionItem.java:407)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetEvent
(ActionContributionItem.java:361)
	at org.eclipse.jface.action.ActionContributionItem.access$0
(ActionContributionItem.java:352)
	at 
org.eclipse.jface.action.ActionContributionItem$ActionListener.handleEvent
(ActionContributionItem.java:47)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:75)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:825)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1527)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1289)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1177)
	at org.eclipse.ui.internal.Workbench.run(Workbench.java:1160)
	at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:739)
	at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462)
	at java.lang.reflect.Method.invoke(Native Method)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:248)
	at org.eclipse.core.launcher.Main.run(Main.java:697)
	at org.eclipse.core.launcher.Main.main(Main.java:530)
!ENTRY org.eclipse.jdt.core 4 4 Jun 08, 2002 23:12:50.841
!MESSAGE 
!STACK 0
java.lang.NullPointerException
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.removeType
(RegionBasedTypeHierarchy.java:140)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.removeType
(RegionBasedTypeHierarchy.java:134)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:111)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:107)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:115)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.pruneDeadBranch
es(RegionBasedTypeHierarchy.java:99)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedHierarchyBuilder.build
(RegionBasedHierarchyBuilder.java:51)
	at 
org.eclipse.jdt.internal.core.hierarchy.RegionBasedTypeHierarchy.compute
(RegionBasedTypeHierarchy.java:73)
	at org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy.refresh
(TypeHierarchy.java:1131)
	at 
org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation.executeOperation
(CreateTypeHierarchyOperation.java:69)
	at org.eclipse.jdt.internal.core.JavaModelOperation.execute
(JavaModelOperation.java:307)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run
(JavaModelOperation.java:515)
	at org.eclipse.jdt.internal.core.JavaModelManager.runOperation
(JavaModelManager.java:1181)
	at org.eclipse.jdt.internal.core.JavaElement.runOperation
(JavaElement.java:574)
	at org.eclipse.jdt.internal.core.JavaProject.newTypeHierarchy
(JavaProject.java:1597)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.doHierarchyRefr
esh(TypeHierarchyLifeCycle.java:173)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.access$0
(TypeHierarchyLifeCycle.java:133)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle$1.run
(TypeHierarchyLifeCycle.java:109)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread
(ModalContext.java:299)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:249)
	at org.eclipse.jface.window.ApplicationWindow$1.run
(ApplicationWindow.java:394)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:64)
	at org.eclipse.jface.window.ApplicationWindow.run
(ApplicationWindow.java:391)
	at org.eclipse.ui.internal.WorkbenchWindow.run
(WorkbenchWindow.java:1068)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle.ensureRefreshed
TypeHierarchy(TypeHierarchyLifeCycle.java:117)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.updateInput
(TypeHierarchyViewPart.java:406)
	at 
org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyViewPart.setInputElement
(TypeHierarchyViewPart.java:392)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.openInViewPart
(OpenTypeHierarchyUtil.java:120)
	at org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil.open
(OpenTypeHierarchyUtil.java:97)
	at org.eclipse.jdt.ui.actions.OpenTypeHierarchyAction.run
(OpenTypeHierarchyAction.java:120)
	at org.eclipse.jdt.ui.actions.OpenTypeHierarchyAction.run
(OpenTypeHierarchyAction.java:112)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun
(SelectionDispatchAction.java:178)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run
(SelectionDispatchAction.java:156)
	at org.eclipse.jface.action.Action.runWithEvent(Action.java:749)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection
(ActionContributionItem.java:407)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetEvent
(ActionContributionItem.java:361)
	at org.eclipse.jface.action.ActionContributionItem.access$0
(ActionContributionItem.java:352)
	at 
org.eclipse.jface.action.ActionContributionItem$ActionListener.handleEvent
(ActionContributionItem.java:47)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:75)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:825)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1527)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1289)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1177)
	at org.eclipse.ui.internal.Workbench.run(Workbench.java:1160)
	at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:739)
	at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462)
	at java.lang.reflect.Method.invoke(Native Method)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:248)
	at org.eclipse.core.launcher.Main.run(Main.java:697)
	at org.eclipse.core.launcher.Main.main(Main.java:530)
Comment 2 Philipe Mulet CLA 2002-06-09 09:12:35 EDT
Added null checks, but scenario should not occur. Would a case where a type 
knows about a superclass which doesn't know it in return.
Comment 3 Philipe Mulet CLA 2002-06-10 04:58:55 EDT
Might be region pruning causing this to happen. Need to investigate
Comment 4 Philipe Mulet CLA 2002-06-10 05:17:32 EDT
Offending type is "CoolItem". When it is being removed, the subtypes collection 
is completely empty, even though the hierarchy was build with subtypes flag on.
Comment 5 Philipe Mulet CLA 2002-06-10 05:32:52 EDT
CoolItem's superclass is Item, defined outside the region (swt/win32) since it 
belongs to (swt/common).

But actually, the implementation of RegionBasedTypeHierarchy#removeType looks 
suspicious, since it is parent from children collection, before iterating into 
children... (see second line in method "this.typeToSubtypes.remove(type)".

Given that, the null check is likely the best fix. Might revisit this code past 
2.0, but it is fairly conservative (delete as much as possible locally before 
iterating into children).

protected void removeType(IType type) {
	IType[] subtypes = this.getSubtypes(type);
	this.typeToSubtypes.remove(type);
	if (subtypes != null) {
		for (int i= 0; i < subtypes.length; i++) {
			this.removeType(subtypes[i]);
		}
	}
	IType superclass = (IType)this.classToSuperclass.remove(type);
	if (superclass != null) {
		TypeVector types = (TypeVector)this.typeToSubtypes.get
(superclass);
		if (types != null) types.remove(type);
	}
	IType[] superinterfaces = (IType[])this.typeToSuperInterfaces.remove
(type);
	if (superinterfaces != null) {
		for (int i = 0, length = superinterfaces.length; i < length; 
i++) {
			IType superinterface = superinterfaces[i];
			TypeVector types = (TypeVector)this.typeToSubtypes.get
(superinterface);
			if (types != null) types.remove(type);
		}
	}
}

Comment 6 David Audel CLA 2002-06-14 05:41:57 EDT
Verified.