Bug 180524 - NPE in ITypeBinding#createArrayType(..) on anonymous type
Summary: NPE in ITypeBinding#createArrayType(..) on anonymous type
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.3   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.3 M7   Edit
Assignee: Olivier Thomann CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-04-02 13:37 EDT by Markus Keller CLA
Modified: 2007-04-27 10:13 EDT (History)
1 user (show)

See Also:


Attachments
Proposed fix (2.45 KB, patch)
2007-04-02 20:54 EDT, Olivier Thomann CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Markus Keller CLA 2007-04-02 13:37:13 EDT
HEAD

NPE in ITypeBinding#createArrayType(..) on anonymous type, e.g. here:

package test;
public class E1 {
	void m() {
		new Object() {/*anon*/};
	}
}


java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding.createArrayType(LocalTypeBinding.java:96)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createArrayType(LookupEnvironment.java:541)
	at org.eclipse.jdt.core.dom.DefaultBindingResolver.resolveArrayType(DefaultBindingResolver.java:1783)
	at org.eclipse.jdt.core.dom.TypeBinding.createArrayType(TypeBinding.java:92)
	at org.eclipse.jdt.astview.views.Binding.getChildren(Binding.java:143)
	at org.eclipse.jdt.astview.views.ASTViewContentProvider.getChildren(ASTViewContentProvider.java:95)
	at org.eclipse.jdt.astview.views.ASTViewContentProvider.hasChildren(ASTViewContentProvider.java:246)
	at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:1980)
	at org.eclipse.jface.viewers.TreeViewer.isExpandable(TreeViewer.java:449)
	at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2006)
	at org.eclipse.jface.viewers.AbstractTreeViewer.updatePlus(AbstractTreeViewer.java:2619)
	at org.eclipse.jface.viewers.TreeViewer.updatePlus(TreeViewer.java:693)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:800)
	at org.eclipse.jface.viewers.AbstractTreeViewer$1.run(AbstractTreeViewer.java:777)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:751)
	at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:495)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1507)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1504)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1504)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1504)
	at org.eclipse.jface.viewers.AbstractTreeViewer.reveal(AbstractTreeViewer.java:2129)
	at org.eclipse.jdt.astview.views.ASTView.doLinkWithEditor(ASTView.java:1158)
	at org.eclipse.jdt.astview.views.ASTView.handleEditorPostSelectionChanged(ASTView.java:1145)
	at org.eclipse.jdt.astview.views.ASTView$ListenerMix.selectionChanged(ASTView.java:214)
	at org.eclipse.ui.internal.AbstractSelectionService.firePostSelection(AbstractSelectionService.java:179)
	at org.eclipse.ui.internal.AbstractSelectionService$2.selectionChanged(AbstractSelectionService.java:71)
	at org.eclipse.jface.text.TextViewer.firePostSelectionChanged(TextViewer.java:2550)
	at org.eclipse.jface.text.TextViewer.firePostSelectionChanged(TextViewer.java:2502)
	at org.eclipse.jface.text.TextViewer$5.run(TextViewer.java:2481)
	at org.eclipse.swt.widgets.Display.runTimer(Display.java:3736)
	at org.eclipse.swt.widgets.Display.messageProc(Display.java:2958)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2226)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3282)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2361)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2325)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200)
	at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:101)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:152)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:359)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:174)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:615)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:476)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:416)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1141)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1116)
Comment 1 Olivier Thomann CLA 2007-04-02 19:53:26 EDT
I would say this should be rejected.
Arrays of anonymous class doesn't make sense.
Comment 2 Olivier Thomann CLA 2007-04-02 20:26:00 EDT
However I can fix it.
so we need to decide if we want to reject it which means that we should throw an IllegalArgumentException or return an array of an anonymous type binding.
Comment 3 Olivier Thomann CLA 2007-04-02 20:54:33 EDT
Created attachment 62737 [details]
Proposed fix
Comment 4 Markus Keller CLA 2007-04-03 04:56:28 EDT
I just checked the Javadocs again, and I guess it would make sense to throw an IAE on anonymous types. However, 
	 * <li>if the receiver represents a recovered binding</li>
is too restrictive IMO. In source, you can produce arrays of recovered types, so why should it not be possible from a binding?
Comment 5 Philipe Mulet CLA 2007-04-03 07:45:33 EDT
I would also allow creating them. These could also appear through generic inference, e.g.:

public class X {
	static <T> T[] toArray(T t) { return null; }
	public static void main(String[] args) {
		System.out.println(toArray(new Object(){}));
	}
}

The resolvedType of #toArray invocation expression is an array of an anonymous type.


     
     
Comment 6 Olivier Thomann CLA 2007-04-03 14:18:53 EDT
Released for 3.3M7
Comment 7 Maxime Daniel CLA 2007-04-27 10:13:48 EDT
Verified for 3.3 M7 using  build I20070427-0010.
Test case is org.eclipse.jdt.core.tests.dom.ASTConverterTestAST3_2.test0674.