Bug 19638 - Open Type Hierarchy can start infinite progress monitor
Summary: Open Type Hierarchy can start infinite progress monitor
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 2.0   Edit
Hardware: PC Windows 2000
: P3 critical (vote)
Target Milestone: 2.0 F3   Edit
Assignee: Jerome Lanneluc CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2002-06-07 14:22 EDT by Grant Gayed CLA
Modified: 2002-06-14 05:41 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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.