Bug 106964 - [1.5][search] AIOBE in MethodLocator.matchOverriddenMethod
Summary: [1.5][search] AIOBE in MethodLocator.matchOverriddenMethod
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.1.1   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.1.1   Edit
Assignee: Frederic Fusier CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-08-14 11:12 EDT by Andrey Loskutov CLA
Modified: 2005-09-26 10:51 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrey Loskutov CLA 2005-08-14 11:12:33 EDT
I'm using maintenance build Version: 3.1.1 Build id: M20050811-0400, during 
refactoring (rename) of method in interface, I have some times such errors in 
the log, and refactoring fails:

java.lang.reflect.InvocationTargetException
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:327)
	at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.
run(RefactoringWizardDialog2.java:293)
	at org.eclipse.ltk.ui.refactoring.RefactoringWizard.
createChange(RefactoringWizard.java:573)
	at org.eclipse.ltk.ui.refactoring.RefactoringWizard.
computeUserInputSuccessorPage(RefactoringWizard.java:416)
	at org.eclipse.ltk.ui.refactoring.UserInputWizardPage.
computeSuccessorPage(UserInputWizardPage.java:74)
	at org.eclipse.ltk.ui.refactoring.UserInputWizardPage.
getNextPage(UserInputWizardPage.java:114)
	at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.
previewPressed(RefactoringWizardDialog2.java:447)
	at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2.
access$3(RefactoringWizardDialog2.java:445)
	at org.eclipse.ltk.internal.ui.refactoring.RefactoringWizardDialog2$1.
widgetSelected(RefactoringWizardDialog2.java:584)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:
90)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:809)
	at org.eclipse.jface.window.Window.open(Window.java:787)
	at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation$1.
run(RefactoringWizardOpenOperation.java:125)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.
run(RefactoringWizardOpenOperation.java:138)
	at org.eclipse.jdt.internal.ui.refactoring.actions.RefactoringStarter.
activate(RefactoringStarter.java:40)
	at org.eclipse.jdt.internal.ui.refactoring.UserInterfaceStarter.
activate(UserInterfaceStarter.java:56)
	at org.eclipse.jdt.internal.ui.refactoring.reorg.
RenameUserInterfaceStarter.activate(RenameUserInterfaceStarter.java:113)
	at org.eclipse.jdt.internal.ui.refactoring.reorg.
RenameMethodUserInterfaceStarter.activate(RenameMethodUserInterfaceStarter.java:
68)
	at org.eclipse.jdt.ui.refactoring.RenameSupport.openDialog(RenameSupport.
java:114)
	at org.eclipse.jdt.internal.corext.refactoring.
RefactoringExecutionStarter.startRenameRefactoring(RefactoringExecutionStarter.
java:327)
	at org.eclipse.jdt.internal.ui.refactoring.actions.
RenameJavaElementAction.run(RenameJavaElementAction.java:171)
	at org.eclipse.jdt.internal.ui.refactoring.actions.
RenameJavaElementAction.run(RenameJavaElementAction.java:131)
	at org.eclipse.jdt.ui.actions.RenameAction.run(RenameAction.java:117)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.
dispatchRun(SelectionDispatchAction.java:226)
	at org.eclipse.jdt.ui.actions.SelectionDispatchAction.
run(SelectionDispatchAction.java:198)
	at org.eclipse.jface.action.Action.runWithEvent(Action.java:996)
	at org.eclipse.jface.action.ActionContributionItem.
handleWidgetSelection(ActionContributionItem.java:538)
	at org.eclipse.jface.action.ActionContributionItem.
access$2(ActionContributionItem.java:488)
	at org.eclipse.jface.action.ActionContributionItem$5.
handleEvent(ActionContributionItem.java:400)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1699)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1663)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:
367)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
	at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:103)
	at org.eclipse.core.internal.runtime.PlatformActivator$1.
run(PlatformActivator.java:226)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.
java:376)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.
java:163)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.
invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
	at org.eclipse.core.launcher.Main.run(Main.java:973)
	at org.eclipse.core.launcher.Main.main(Main.java:948)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
	at org.eclipse.jdt.internal.core.search.matching.MethodLocator.
matchOverriddenMethod(MethodLocator.java:290)
	at org.eclipse.jdt.internal.core.search.matching.MethodLocator.
newDeclarationMatch(MethodLocator.java:471)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
reportMatching(MatchLocator.java:1820)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
reportMatching(MatchLocator.java:2209)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
reportMatching(MatchLocator.java:2010)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
process(MatchLocator.java:1458)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
locateMatches(MatchLocator.java:945)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
locateMatches(MatchLocator.java:986)
	at org.eclipse.jdt.internal.core.search.matching.MatchLocator.
locateMatches(MatchLocator.java:1088)
	at org.eclipse.jdt.internal.core.search.JavaSearchParticipant.
locateMatches(JavaSearchParticipant.java:94)
	at org.eclipse.jdt.internal.core.search.BasicSearchEngine.
findMatches(BasicSearchEngine.java:208)
	at org.eclipse.jdt.internal.core.search.BasicSearchEngine.
search(BasicSearchEngine.java:424)
	at org.eclipse.jdt.core.search.SearchEngine.search(SearchEngine.java:532)
	at org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine2.
searchPattern(RefactoringSearchEngine2.java:471)
	at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.
findAllDeclarations(RippleMethodFinder2.java:290)
	at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.
getAllRippleMethods(RippleMethodFinder2.java:139)
	at org.eclipse.jdt.internal.corext.refactoring.rename.RippleMethodFinder2.
getRelatedMethods(RippleMethodFinder2.java:130)
	at org.eclipse.jdt.internal.corext.refactoring.rename.
RenameMethodProcessor.initializeMethodsToRename(RenameMethodProcessor.java:157)
	at org.eclipse.jdt.internal.corext.refactoring.rename.
RenameMethodProcessor.checkFinalConditions(RenameMethodProcessor.java:252)
	at org.eclipse.jdt.internal.corext.refactoring.rename.
RenameVirtualMethodProcessor.checkFinalConditions(RenameVirtualMethodProcessor.
java:111)
	at org.eclipse.ltk.core.refactoring.participants.
ProcessorBasedRefactoring.checkFinalConditions(ProcessorBasedRefactoring.java:
169)
	at org.eclipse.ltk.core.refactoring.CheckConditionsOperation.
run(CheckConditionsOperation.java:84)
	at org.eclipse.ltk.core.refactoring.CreateChangeOperation.
run(CreateChangeOperation.java:114)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1719)
	at org.eclipse.ltk.internal.ui.refactoring.WorkbenchRunnableAdapter.
run(WorkbenchRunnableAdapter.java:86)
	at org.eclipse.jface.operation.ModalContext$ModalContextThread.
run(ModalContext.java:113)
----------------------------------------------------------------------

Please note:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
	at org.eclipse.jdt.internal.core.search.matching.MethodLocator.
matchOverriddenMethod(MethodLocator.java:290)

In this class, there is a bug on lines 290/292/294 (througth copy and paste of 
code - note the wrong usage of "i" counter instead of "j" in the second "for" 
loop): 

	for (int i = 0; i<iLength; i++) {
		if (interfaces[i].isParameterizedType()) {
			MethodBinding[] methods = interfaces[i].getMethods(this.
pattern.selector);
			int length = methods.length;
			for (int j = 0; j<length; j++) {
				if (methods[i].areParametersEqual(method)) {
					if (matchMethod == null) {
						if (methodParametersEqualsPattern(methods[i
].original())) return true;
					} else {
						if (methodsHaveSameParameters(methods[i].
original(), matchMethod)) return true;
					}
				}
			}
		}
		if (matchOverriddenMethod(interfaces[i], method, matchMethod)) {
			return true;
		}
	}
Comment 1 Frederic Fusier CLA 2005-08-15 10:32:20 EDT
Thanks for pointing on this nasty copy/paste error.
Comment 2 Frederic Fusier CLA 2005-08-15 10:35:03 EDT
Thanks for pointing on this nasty copy/paste error.
Philippe, may you set the target?
Thx
Comment 3 Frederic Fusier CLA 2005-08-15 15:05:55 EDT
Fixed and released in HEAD stream
Comment 4 Philipe Mulet CLA 2005-08-16 04:26:02 EDT
+1 for 3.1.1
Comment 5 Frederic Fusier CLA 2005-08-16 10:23:32 EDT
Fixed and released in R3_1_maintenance stream
Comment 6 Olivier Thomann CLA 2005-09-20 14:45:00 EDT
Verified using I20050920-0010 for 3.2M2.
Verified that the code is fixed.
Comment 7 Maxime Daniel CLA 2005-09-26 10:45:05 EDT
A test case that fails with 3.1 and works with 3.1.1:

I.java
interface I<U>  extends J<U>, K<U> {
	void put(U u);
}

interface J<V> {
	void put(V v);
	V get();
}

interface K<W> {
	void put(W w);
}

Rename I#put to I#reput via refactoring (exception in 3.1, works in 3.1.1).
Comment 8 Maxime Daniel CLA 2005-09-26 10:45:28 EDT
Verified for 3.1.1 using build M20050923-1430.