Bug 211609 - [compiler][1.5] Unable to resolve annotations defined with a Class attribute
Summary: [compiler][1.5] Unable to resolve annotations defined with a Class attribute
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.4   Edit
Hardware: PC Windows XP
: P3 major (vote)
Target Milestone: 3.4 M4   Edit
Assignee: Olivier Thomann CLA
QA Contact:
URL:
Whiteboard:
Keywords:
: 213527 (view as bug list)
Depends on: 187430
Blocks: 211598
  Show dependency tree
 
Reported: 2007-11-30 11:50 EST by Neil Hauge CLA
Modified: 2007-12-19 15:36 EST (History)
5 users (show)

See Also:
philippe_mulet: pmc_approved+


Attachments
annotation jar (483 bytes, application/octet-stream)
2007-11-30 11:50 EST, Neil Hauge CLA
no flags Details
Proposed fix + regression tests (3.52 KB, patch)
2007-11-30 13:21 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 Neil Hauge CLA 2007-11-30 11:50:43 EST
Created attachment 84199 [details]
annotation jar

The following code will not resolve with the given annotation:

public class Test {
	
	@TestAnnotation
	private String foo;

}

public @interface TestAnnotation {
	
	Class targetItem() default void.class;
}


NOTE:  The annotation must be in a referenced jar file (in binary form).  One is attached for convenience.

Many exceptions occur as a result.  Below is one of them.

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

public class Test {
	
	@TestAnnotation
	private String foo;

}

----------------------------------- SOURCE END -------------------------------------


java.lang.ClassCastException: org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.convertMemberValue(BinaryTypeBinding.java:54)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.createMethod(BinaryTypeBinding.java:511)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.createMethods(BinaryTypeBinding.java:560)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.cachePartsFrom(BinaryTypeBinding.java:329)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createBinaryTypeFrom(LookupEnvironment.java:731)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createBinaryTypeFrom(LookupEnvironment.java:710)
	at org.eclipse.jdt.internal.compiler.Compiler.accept(Compiler.java:276)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:130)
	at org.eclipse.jdt.internal.compiler.lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:178)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getTypeOrPackage(Scope.java:2416)
	at org.eclipse.jdt.internal.compiler.lookup.Scope.getType(Scope.java:2144)
	at org.eclipse.jdt.internal.compiler.ast.SingleTypeReference.getTypeBinding(SingleTypeReference.java:44)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:134)
	at org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:125)
	at org.eclipse.jdt.internal.compiler.ast.Annotation.resolveType(Annotation.java:231)
	at org.eclipse.jdt.internal.compiler.ast.ASTNode.resolveAnnotations(ASTNode.java:590)
	at org.eclipse.jdt.internal.compiler.lookup.FieldBinding.getAnnotationTagBits(FieldBinding.java:252)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.resolveTypeFor(SourceTypeBinding.java:1256)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.fields(SourceTypeBinding.java:608)
	at org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.faultInTypesForFieldsAndMethods(SourceTypeBinding.java:586)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:431)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:724)
	at org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:187)
	at org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:183)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:252)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:510)
	at org.eclipse.jdt.internal.core.CompilationUnit.makeConsistent(CompilationUnit.java:1001)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:170)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:89)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:780)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1151)
	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:75)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:206)
Comment 1 Olivier Thomann CLA 2007-11-30 12:16:31 EST
I'll investigate.
Comment 2 Olivier Thomann CLA 2007-11-30 13:18:03 EST
Reproduced.
The problem only exists if the class default value is from a base type.
void.class, int.class, ...
Comment 3 Olivier Thomann CLA 2007-11-30 13:21:28 EST
Created attachment 84209 [details]
Proposed fix + regression tests
Comment 4 Olivier Thomann CLA 2007-11-30 14:15:40 EST
Released for 3.4M4.
Regression tests added in org.eclipse.jdt.core.tests.compiler.regression.AnnotationTest#test247
org.eclipse.jdt.core.tests.compiler.regression.AnnotationTest#test248
Comment 5 Olivier Thomann CLA 2007-11-30 14:16:33 EST
Verifier, in order to reproduce the storage of annotations must be enabled.
The reconciling is one way to do that.
Comment 6 Olivier Thomann CLA 2007-11-30 14:19:18 EST
Philippe, we might want to backport to 3.3.2.
Comment 7 Philipe Mulet CLA 2007-12-03 05:04:59 EST
+1 for 3.3.2
Comment 8 Olivier Thomann CLA 2007-12-03 09:53:52 EST
Since in 3.3.x doesn't do a cast to ReferenceBinding, there is no need to backport.
Comment 9 David Audel CLA 2007-12-12 04:37:39 EST
Verified for 3.4M4 using build I20071210-1800.
Comment 10 Olivier Thomann CLA 2007-12-19 15:36:23 EST
*** Bug 213527 has been marked as a duplicate of this bug. ***