Bug 251690 - [compiler] NPE if type collides with a package
Summary: [compiler] NPE if type collides with a package
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.5   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.5 M4   Edit
Assignee: Kent Johnson CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-10-22 07:15 EDT by David Audel CLA
Modified: 2009-05-07 03:33 EDT (History)
2 users (show)

See Also:


Attachments
Proposed patch with testcase (3.56 KB, patch)
2008-11-20 15:25 EST, Kent Johnson CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description David Audel CLA 2008-10-22 07:15:43 EDT
From bug 249027

With this test case the builder, ast parser and reconciler thrown an NPE

p1/C1.java:
package p1;
public class C1 {}

p1/C1/C2.java:
public class C2 {
  C1 f; // <- select here
}


NPE in builder:
java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.packageCollidesWithType(ProblemReporter.java:5435)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.buildTypeBindings(CompilationUnitScope.java:87)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.buildTypeBindings(LookupEnvironment.java:149)
	at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:701)
	at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:376)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:420)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:363)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:178)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:300)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:60)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:254)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:173)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:633)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:170)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:201)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:253)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:256)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:309)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:341)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:140)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:238)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)


NPE in reconciler:
java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.packageCollidesWithType(ProblemReporter.java:5435)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.buildTypeBindings(CompilationUnitScope.java:87)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.buildTypeBindings(LookupEnvironment.java:149)
	at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:701)
	at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:376)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:838)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:904)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:182)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:243)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:190)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:89)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:721)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:781)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1242)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:124)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.access$0(JavaReconcilingStrategy.java:108)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:89)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:87)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:149)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:102)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:77)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:206)


NPE in ast parser:
java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.packageCollidesWithType(ProblemReporter.java:5435)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.buildTypeBindings(CompilationUnitScope.java:87)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.buildTypeBindings(LookupEnvironment.java:149)
	at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:701)
	at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:376)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:808)
	at org.eclipse.jdt.core.dom.CompilationUnitResolver.resolve(CompilationUnitResolver.java:518)
	at org.eclipse.jdt.core.dom.ASTParser.internalCreateAST(ASTParser.java:908)
	at org.eclipse.jdt.core.dom.ASTParser.createAST(ASTParser.java:657)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider$1.run(ASTProvider.java:544)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.createAST(ASTProvider.java:537)
	at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:478)
	at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:126)
	at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:169)
	at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$3.run(SelectionListenerWithASTManager.java:154)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Comment 1 Stephan Herrmann CLA 2008-10-22 13:11:31 EDT
I gave it a quick try, so here's a proposed implementation
(not a patch because I had no pristine JDT/Core at hand):

public void packageCollidesWithType(CompilationUnitDeclaration compUnitDecl) {
	String packageName = "";
	int start = 0, end = 0;
	if (compUnitDecl.currentPackage != null) {
		packageName = CharOperation.toString(compUnitDecl.currentPackage.tokens);
		start = compUnitDecl.currentPackage.sourceStart;
		end   = compUnitDecl.currentPackage.sourceEnd;
	} else if (compUnitDecl.scope != null && compUnitDecl.scope.currentPackageName != null) {
		packageName = CharOperation.toString(compUnitDecl.scope.currentPackageName);
		// no useful source position available
	}
	String[] arguments = new String[] {packageName};
	this.handle(
		IProblem.PackageCollidesWithType,
		arguments,
		arguments,
		start,
		end);
}
Comment 2 Kent Johnson CLA 2008-11-20 13:28:37 EST
Reproduced with this case :

p1/C1.java:
package p1;
public class C1 {}

p1/C1/C2.java:
public class C2 {} // NOTE: no package statement
Comment 3 Kent Johnson CLA 2008-11-20 15:25:09 EST
Created attachment 118397 [details]
Proposed patch with testcase
Comment 4 Kent Johnson CLA 2008-11-20 16:29:32 EST
Fix and test released for 3.5M4
Comment 5 Olivier Thomann CLA 2008-12-09 11:26:12 EST
Verified for 3.5M4 using I20081208-1800