Bug 142087 - [1.5][compiler] NPE in computeCompatibleMethod
Summary: [1.5][compiler] NPE in computeCompatibleMethod
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.2   Edit
Hardware: PC Windows XP
: P3 major (vote)
Target Milestone: 3.2 RC5   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-05-16 16:53 EDT by Ed Willink CLA
Modified: 2006-05-19 11:24 EDT (History)
6 users (show)

See Also:


Attachments
Proposed patch (2.22 KB, patch)
2006-05-18 07:47 EDT, Philipe Mulet CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Ed Willink CLA 2006-05-16 16:53:22 EDT
3.2RC2 (was ok in 3.2M6)

After rebuilding with 3.2RC2 I have one file that fails to compile with a variety of JDT errors.

Attempting to locate it, I created a CopyOf...; Error did not appear in copy.
I refactored CopyOf... to ...2; Error moved from ... to ...2. Deleted ...2
and error returned to ...

Looks like it will be hard to do a small repro.

The stack traces are:

Error in JDT Core during AST creation

or

Exception occurred during problem detection:
----------------------------------- SOURCE BEGIN -------------------------------------

or

Problems occurred when invoking code from plug-in: "org.eclipse.jdt.ui".

java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.Scope.computeCompatibleMethod(Scope.java:402)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.mostSpecificMethodBinding(Scope.java:3247)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1125)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getMethod(Scope.java:2020)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:384)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:344)
	at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:202)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:432)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:179)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:403)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1054)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1101)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:353)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:882)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:508)
	at org.eclipse.jdt.core.dom.ASTParser.internalCreateAST(ASTParser.java:833)
	at org.eclipse.jdt.core.dom.ASTParser.createAST(ASTParser.java:631)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider$1.run(ASTProvider.java:605)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.createAST(ASTProvider.java:600)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:514)
	at org.eclipse.jdt.internal.ui.text.java.hover.NLSStringHover.getHoverInfo(NLSStringHover.java:86)
	at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo(BestMatchHover.java:102)
	at org.eclipse.jdt.internal.ui.text.java.hover.JavaEditorTextHoverProxy.getHoverInfo(JavaEditorTextHoverProxy.java:69)
	at org.eclipse.jface.text.TextViewerHoverManager$4.run(TextViewerHoverManager.java:160)

Error in JDT Core during reconcile
Java Model Exception: java.lang.NullPointerException
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:226)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:248)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:152)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:71)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1123)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1095)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:103)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:145)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:94)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:342)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)
org.eclipse.jdt.core.JavaModelException[1005]: java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.Scope.computeCompatibleMethod(Scope.java:402)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.mostSpecificMethodBinding(Scope.java:3247)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1125)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getMethod(Scope.java:2020)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:384)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:344)
	at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:202)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:432)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:179)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:403)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1054)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1101)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:353)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:650)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:689)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:176)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:248)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:152)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:71)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1123)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1095)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:103)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:145)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:94)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:342)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)
Caused by: java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.Scope.computeCompatibleMethod(Scope.java:402)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.mostSpecificMethodBinding(Scope.java:3247)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.findMethod(Scope.java:1125)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getMethod(Scope.java:2020)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:384)
	at org.eclipse.jdt.internal.compiler.ast.MessageSend.resolveType(MessageSend.java:344)
	at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.resolve(LocalDeclaration.java:202)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:432)
	at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:179)
	at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:403)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1054)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1101)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:353)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:650)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:689)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:176)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:248)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:152)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:71)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1123)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1095)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:103)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:145)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:94)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:342)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)
Comment 1 Jerome Lanneluc CLA 2006-05-16 17:10:59 EDT
Could you please try with 3.2 RC4 ?
Comment 2 Philipe Mulet CLA 2006-05-17 05:39:49 EDT
This would indicate a method with null return type:

protected final MethodBinding computeCompatibleMethod(MethodBinding method, TypeBinding[] arguments, InvocationSite invocationSite) {

	TypeBinding[] genericTypeArguments = invocationSite.genericTypeArguments();
	TypeBinding[] parameters = method.parameters;
	TypeVariableBinding[] typeVariables = method.typeVariables;
	if (parameters == arguments
>>>>>>>>	&& (method.returnType.tagBits & TagBits.HasTypeVariable) == 0 
Comment 3 Philipe Mulet CLA 2006-05-17 05:46:54 EDT
Please provide steps to reproduce, then reopen.
Comment 4 Ed Willink CLA 2006-05-18 02:13:03 EDT
Reproduced using RC4.

A workspace that reproduces the bug may be found at

/download.eclipse.org/technology/gmt/umlx/temp/UMLX.Workspace3.2RC4.zip

it uses

Windows XP SP2 latest updates
Java 1.5.0_06
EMF 2.2.0RC2a
GEF 3.2RC2a
EMFT 1.0RC2 (at most ocl needed)

Load workspace and let auto-build fail.
Comment 5 Philipe Mulet CLA 2006-05-18 05:09:04 EDT
Reproduced issue at: NodeElementGraphicalNodeEditPolicy.java

Took the workspace
Imported draw2d and gef plugins
Auto recompilation found it.
Comment 6 Philipe Mulet CLA 2006-05-18 05:14:21 EDT
Looks bad. We are trying to tiebreak between a method and a problem method... (ambiguous)
Comment 7 Philipe Mulet CLA 2006-05-18 06:12:53 EDT
Problem occurs at msg send:
   linkEditPart.getViewer()

where receiver type is:
   GLinkElementView<capture-of ?,capture-of ?>


Problems come from interface lookups, which aren't checking that the found method is a valid one, before attempting to tiebreak.
There are 3 instances of this issue.
Comment 8 Philipe Mulet CLA 2006-05-18 06:24:46 EDT
Given this is a regression introduced in RC2, and it was found in about 2 weeks; I would be enclined to address it into RC5.

The fix is simple enough, simply an omission when rewriting #findMethod(...), and doesn't change the logic.

I will attach a patch, and ask Kent to review it, since he owns this code.

+1 for 3.2RC5
Comment 9 Philipe Mulet CLA 2006-05-18 06:45:14 EDT
Tim - pls cast your vote for addressing it in 3.2RC5
Comment 10 Philipe Mulet CLA 2006-05-18 06:45:38 EDT
Kent - pls review the patch
Comment 11 Philipe Mulet CLA 2006-05-18 06:46:07 EDT
Martin - pls vote
Comment 12 Philipe Mulet CLA 2006-05-18 07:47:39 EDT
Created attachment 41871 [details]
Proposed patch

Patch adding 'method.isValidBinding()' in 3 places, where interface methods are being considered for merging.
Comment 13 Philipe Mulet CLA 2006-05-18 09:34:55 EDT
Testcase inferred from provided workspace:

public class X {
	void bar(GLinkElementView<?,?> g) {
		g.getViewer();
	}
}

abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}

abstract class AbstractLinkView<M> extends AbstractConnectionEditPart implements ILinkViewElement, IModelChangeListener {
	@Override
	public SheetViewer getViewer() { return null; }	
}

abstract class AbstractConnectionEditPart extends AbstractGraphicalEditPart implements ConnectionEditPart {}

abstract class AbstractGraphicalEditPart extends AbstractEditPart implements GraphicalEditPart {}

abstract class AbstractEditPart implements EditPart/*, RequestConstants*/ {
	public EditPartViewer getViewer() { return null; }
}

interface ILinkViewElement extends INodeViewElement {
	public ISheetViewer getViewer();
}

class SheetViewer implements ISheetViewer {}

interface ISheetViewer {}

interface EditPart {
	EditPartViewer getViewer();
}

interface ConnectionEditPart extends GraphicalEditPart {}
interface GraphicalEditPart extends EditPart {}
interface EditPartViewer {}
interface IModelChangeListener {}

interface INodeViewElement {
	public ISheetViewer getViewer();
}
Comment 14 Philipe Mulet CLA 2006-05-18 09:50:13 EDT
Added GenericTypeTest#test0987&0988 + LookupTest#test072
Comment 15 Kent Johnson CLA 2006-05-18 09:57:49 EDT
Patch looks good.
Comment 16 Philipe Mulet CLA 2006-05-18 10:14:42 EDT
Mike - pls vote for this one. 
Comment 17 Martin Aeschlimann CLA 2006-05-18 10:39:30 EDT
+1
Comment 18 Philipe Mulet CLA 2006-05-18 10:44:46 EDT
Darin - will you vote for this one ?
Comment 19 Darin Wright CLA 2006-05-18 10:48:44 EDT
+1, regression should be addressed
Comment 20 Philipe Mulet CLA 2006-05-18 11:05:25 EDT
John - pls cast your vote
Comment 21 John Arthorne CLA 2006-05-18 11:16:07 EDT
+1
Comment 22 Philipe Mulet CLA 2006-05-18 11:25:49 EDT
Excellent, got enough votes now.
Released for 3.2RC5
Comment 23 Olivier Thomann CLA 2006-05-19 11:24:22 EDT
Verified with I20060519-0010 for 3.2RC5