Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 330081

Summary: [compiler] ArrayIndexOutOfBoundsException when Switched from C/C++ Perspective to Java Perspective
Product: [Eclipse Project] JDT Reporter: Thomas . <spam-receiver>
Component: CoreAssignee: Olivier Thomann <Olivier_Thomann>
Status: VERIFIED FIXED QA Contact:
Severity: major    
Priority: P3 CC: daniel_megert, jarthana, Olivier_Thomann, satyam.kandula
Version: 3.7Flags: daniel_megert: pmc_approved+
Target Milestone: 3.6.2   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
Proposed fix + regression test
none
Proposed fix + regression tests none

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