Bug 180524

Summary: NPE in ITypeBinding#createArrayType(..) on anonymous type
Product: [Eclipse Project] JDT Reporter: Markus Keller <markus.kell.r>
Component: CoreAssignee: Olivier Thomann <Olivier_Thomann>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: martinae
Version: 3.3   
Target Milestone: 3.3 M7   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Attachments:
Description Flags
Proposed fix none

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.