Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 330081 - [compiler] ArrayIndexOutOfBoundsException when Switched from C/C++ Perspective to Java Perspective
Summary: [compiler] ArrayIndexOutOfBoundsException when Switched from C/C++ Perspectiv...
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.7   Edit
Hardware: All All
: P3 major (vote)
Target Milestone: 3.6.2   Edit
Assignee: Olivier Thomann CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-11-12 08:11 EST by Thomas . CLA
Modified: 2011-01-20 04:01 EST (History)
4 users (show)

See Also:
daniel_megert: pmc_approved+


Attachments
Proposed fix + regression test (3.16 KB, patch)
2010-11-15 10:54 EST, Olivier Thomann CLA
no flags Details | Diff
Proposed fix + regression tests (6.30 KB, patch)
2010-11-15 11:10 EST, 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 Thomas . CLA 2010-11-12 08:11:41 EST
Build Identifier: 20100917-0705

Have a big workspace with a number of independent projects.  Each project has Java nature, C/C++ nature and Remote C/C++ nature.
I switched from the C/C++ perspective to the Java perspective, and the tab titled "Package Explorer" no package explorer is displayed. Instead the error message "Could not create the view: 4" is displayed in that tab with the following details:
java.lang.ArrayIndexOutOfBoundsException: 4
	at org.eclipse.jdt.internal.compiler.parser.Scanner.internalScanIdentifierOrKeyword(Scanner.java:2983)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.scanIdentifierOrKeywordWithBoundCheck(Scanner.java:2770)
	at org.eclipse.jdt.internal.compiler.parser.Scanner.scanIdentifier(Scanner.java:1038)
	at org.eclipse.jdt.core.JavaConventions.scannedIdentifier(JavaConventions.java:82)
	at org.eclipse.jdt.core.JavaConventions.validateIdentifier(JavaConventions.java:312)
	at org.eclipse.jdt.internal.core.util.Util.isValidFolderNameForPackage(Util.java:1742)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.computeFolderChildren(PackageFragmentRoot.java:236)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.computeFolderChildren(PackageFragmentRoot.java:241)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.computeFolderChildren(PackageFragmentRoot.java:241)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.computeFolderChildren(PackageFragmentRoot.java:241)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.computeChildren(PackageFragmentRoot.java:193)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.buildStructure(PackageFragmentRoot.java:154)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:258)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:515)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:252)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:238)
	at org.eclipse.jdt.internal.core.PackageFragmentRoot.getKind(PackageFragmentRoot.java:477)
	at org.eclipse.jdt.internal.core.PackageFragment.getKind(PackageFragment.java:290)
	at org.eclipse.jdt.internal.core.PackageFragment.validateExistence(PackageFragment.java:506)
	at org.eclipse.jdt.internal.core.Openable.exists(Openable.java:206)
	at org.eclipse.jdt.internal.core.PackageFragment.exists(PackageFragment.java:174)
	at org.eclipse.jdt.ui.StandardJavaElementContentProvider.internalGetParent(StandardJavaElementContentProvider.java:471)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider.internalGetParent(PackageExplorerContentProvider.java:395)
	at org.eclipse.jdt.ui.StandardJavaElementContentProvider.getParent(StandardJavaElementContentProvider.java:251)
	at org.eclipse.jface.viewers.AbstractTreeViewer.getParentElement(AbstractTreeViewer.java:1658)
	at org.eclipse.jface.viewers.TreeViewer.getParentElement(TreeViewer.java:607)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpand(AbstractTreeViewer.java:1585)
	at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToWidget(AbstractTreeViewer.java:2466)
	at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1741)
	at org.eclipse.jface.viewers.AbstractTreeViewer.setSelectionToWidget(AbstractTreeViewer.java:2906)
	at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1697)
	at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1139)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart.showInput(PackageExplorerPart.java:1050)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart.editorActivated(PackageExplorerPart.java:999)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart.setLinkingEnabled(PackageExplorerPart.java:1271)
	at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart.createPartControl(PackageExplorerPart.java:548)
	at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375)
	at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:229)
	at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
	at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:313)
	at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:529)
	at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)
	at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)
	at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)
	at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1254)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:666)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:574)
	at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:568)
	at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:272)
	at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:981)
	at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3614)
	at org.eclipse.ui.internal.WorkbenchPage.busySetPerspective(WorkbenchPage.java:1041)
	at org.eclipse.ui.internal.WorkbenchPage.access$16(WorkbenchPage.java:1025)
	at org.eclipse.ui.internal.WorkbenchPage$19.run(WorkbenchPage.java:3715)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3713)
	at org.eclipse.ui.internal.PerspectiveBarContributionItem.select(PerspectiveBarContributionItem.java:124)
	at org.eclipse.ui.internal.PerspectiveBarManager$1.widgetSelected(PerspectiveBarManager.java:129)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1407)


The "Error Log" gives the following details:
eclipse.buildId=M20100909-0800
java.version=1.6.0_22
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Framework arguments:  -product org.eclipse.epp.package.cpp.product
Command-line arguments:  -os win32 -ws win32 -arch x86 -product org.eclipse.epp.package.cpp.product


Error
Fri Nov 12 14:01:49 CET 2010
Unable to create view ID org.eclipse.jdt.ui.PackageExplorer: 4

And the exception trace as above.

Reproducible: Didn't try
Comment 1 Dani Megert CLA 2010-11-15 04:39:19 EST
What is selected before you switch (element type, full name)?
Comment 2 Olivier Thomann CLA 2010-11-15 08:41:32 EST
We need more details about what was done when the perspectives were switched.
Comment 3 Satyam Kandula CLA 2010-11-15 09:41:52 EST
I could reproduce this problem by trying to create a package with the name elnu.  
Code around internalScanIdentifierOrKeyword(Scanner.java:2984) doesn't look good. The preceding if is incrementing the index!
Comment 4 Olivier Thomann CLA 2010-11-15 09:53:34 EST
(In reply to comment #3)
> I could reproduce this problem by trying to create a package with the name
> elnu.  
> Code around internalScanIdentifierOrKeyword(Scanner.java:2984) doesn't look
> good. The preceding if is incrementing the index!
Thanks. Reproduced as well.
Investigating.
Comment 5 Olivier Thomann CLA 2010-11-15 10:54:50 EST
Created attachment 183127 [details]
Proposed fix + regression test
Comment 6 Olivier Thomann CLA 2010-11-15 10:56:37 EST
The decoding of "else" and "enum" was wrong.
If "el" matches, then if should not check "num".

Daniel, I think we should backport to 3.6.2 as there is no workaround for this issue and the fix is safe. I'll run all tests to make sure it works as expected.
Comment 7 Olivier Thomann CLA 2010-11-15 11:10:12 EST
Created attachment 183129 [details]
Proposed fix + regression tests

Also updated the PublicScanner.
Comment 8 Olivier Thomann CLA 2010-11-15 12:06:14 EST
Released for 3.7M4.
Daniel, I am requesting PMC approval for 3.6.2 backport.
Comment 9 Olivier Thomann CLA 2010-11-15 14:30:29 EST
Closing as FIXED.
Will reopen if backported to 3.6.2
Comment 10 Dani Megert CLA 2010-11-16 10:39:21 EST
I agree, that this needs to be backported to 3.6.2.
Comment 11 Olivier Thomann CLA 2010-11-16 10:50:36 EST
Reopen for release in 3.6.2.
Comment 12 Olivier Thomann CLA 2010-11-16 10:50:58 EST
Released for 3.6.2.
Comment 13 Jay Arthanareeswaran CLA 2010-12-07 03:31:33 EST
Verified for 3.7M4 using build I20101206-1800
Comment 14 Jay Arthanareeswaran CLA 2011-01-20 04:01:27 EST
Verified for 3.6.2 using build M20110119-0834