Community
Participate
Working Groups
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)
I would say this should be rejected. Arrays of anonymous class doesn't make sense.
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.
Created attachment 62737 [details] Proposed fix
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?
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.
Released for 3.3M7
Verified for 3.3 M7 using build I20070427-0010. Test case is org.eclipse.jdt.core.tests.dom.ASTConverterTestAST3_2.test0674.