Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 50002 Details for
Bug 149751
Enum-valued annotation element handles non-enum constant badly
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Patch for 3.2 maintenance
patch_149751.txt (text/plain), 8.63 KB, created by
Olivier Thomann
on 2006-09-12 22:46:48 EDT
(
hide
)
Description:
Patch for 3.2 maintenance
Filename:
MIME Type:
Creator:
Olivier Thomann
Created:
2006-09-12 22:46:48 EDT
Size:
8.63 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.core >Index: compiler/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java,v >retrieving revision 1.22 >diff -u -r1.22 MemberValuePair.java >--- compiler/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java 31 Mar 2006 22:13:25 -0000 1.22 >+++ compiler/org/eclipse/jdt/internal/compiler/ast/MemberValuePair.java 13 Sep 2006 02:45:48 -0000 >@@ -13,9 +13,11 @@ > import org.eclipse.jdt.internal.compiler.ASTVisitor; > import org.eclipse.jdt.internal.compiler.impl.Constant; > import org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding; >+import org.eclipse.jdt.internal.compiler.lookup.Binding; > import org.eclipse.jdt.internal.compiler.lookup.BlockScope; > import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope; > import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; >+import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; > import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; > import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; > >@@ -76,7 +78,7 @@ > ArrayInitializer initializer = (ArrayInitializer) this.value; > valueType = initializer.resolveTypeExpecting(scope, this.binding.returnType); > } else if (this.value instanceof ArrayAllocationExpression) { >- scope.problemReporter().annotationValueMustBeArrayInitializer(this.value); >+ scope.problemReporter().annotationValueMustBeArrayInitializer(this.binding.declaringClass, this.name, this.value); > this.value.resolveType(scope); > valueType = null; // no need to pursue > } else { >@@ -127,12 +129,16 @@ > if (expressions != null) { > for (int i =0, max = expressions.length; i < max; i++) { > if (expressions[i].constant == Constant.NotAConstant) { >- scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, expressions[i]); >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, expressions[i], false); > } > } > } > } else if (this.value.constant == Constant.NotAConstant) { >- scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value); >+ if (valueType.isArrayType()) { >+ scope.problemReporter().annotationValueMustBeArrayInitializer(this.binding.declaringClass, this.name, this.value); >+ } else { >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value, false); >+ } > } > break checkAnnotationMethodType; > case T_JavaLangClass : >@@ -141,8 +147,9 @@ > final Expression[] expressions = initializer.expressions; > if (expressions != null) { > for (int i =0, max = expressions.length; i < max; i++) { >- if (!(expressions[i] instanceof ClassLiteralAccess)) { >- scope.problemReporter().annotationValueMustBeClassLiteral(this.binding.declaringClass, this.name, expressions[i]); >+ Expression currentExpression = expressions[i]; >+ if (!(currentExpression instanceof ClassLiteralAccess)) { >+ scope.problemReporter().annotationValueMustBeClassLiteral(this.binding.declaringClass, this.name, currentExpression); > } > } > } >@@ -153,8 +160,40 @@ > } > if (leafType.isEnum()) { > if (this.value instanceof NullLiteral) { >- // TODO (olivier) change message for annotation value must be an *enum* constant >- scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value); >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value, true); >+ } else if (this.value instanceof ArrayInitializer) { >+ ArrayInitializer initializer = (ArrayInitializer) this.value; >+ final Expression[] expressions = initializer.expressions; >+ if (expressions != null) { >+ for (int i =0, max = expressions.length; i < max; i++) { >+ Expression currentExpression = expressions[i]; >+ if (currentExpression instanceof NullLiteral) { >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, currentExpression, true); >+ } else if (currentExpression instanceof NameReference) { >+ NameReference nameReference = (NameReference) currentExpression; >+ final Binding nameReferenceBinding = nameReference.binding; >+ if (nameReferenceBinding.kind() == Binding.FIELD) { >+ FieldBinding fieldBinding = (FieldBinding) nameReferenceBinding; >+ if (!fieldBinding.declaringClass.isEnum()) { >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, currentExpression, true); >+ } >+ } >+ } >+ } >+ } >+ } else if (this.value instanceof NameReference) { >+ NameReference nameReference = (NameReference) this.value; >+ final Binding nameReferenceBinding = nameReference.binding; >+ if (nameReferenceBinding.kind() == Binding.FIELD) { >+ FieldBinding fieldBinding = (FieldBinding) nameReferenceBinding; >+ if (!fieldBinding.declaringClass.isEnum()) { >+ if (!fieldBinding.type.isArrayType()) { >+ scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value, true); >+ } else { >+ scope.problemReporter().annotationValueMustBeArrayInitializer(this.binding.declaringClass, this.name, this.value); >+ } >+ } >+ } > } > break checkAnnotationMethodType; > } >Index: compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties,v >retrieving revision 1.203 >diff -u -r1.203 messages.properties >--- compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties 16 May 2006 15:25:47 -0000 1.203 >+++ compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties 13 Sep 2006 02:45:52 -0000 >@@ -521,7 +521,8 @@ > 629 = The deprecated method {0}({1}) of type {2} should be annotated with @Deprecated > 630 = The deprecated type {0} should be annotated with @Deprecated > 631 = Unhandled warning token {0} >-632 = The array creation is unnecessary in an annotation value; only an array initializer is allowed >+632 = The value for annotation attribute {0}.{1} must be an array initializer >+633 = The value for annotation attribute {0}.{1} must be an enum constant expression > > ### CORRUPTED BINARIES > 700 = The class file {0} contains a signature ''{1}'' ill-formed at position {2} >Index: compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java,v >retrieving revision 1.311 >diff -u -r1.311 ProblemReporter.java >--- compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 10 Apr 2006 19:04:00 -0000 1.311 >+++ compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 13 Sep 2006 02:45:51 -0000 >@@ -583,13 +583,14 @@ > value.sourceStart, > value.sourceEnd); > } >-public void annotationValueMustBeArrayInitializer(Expression value) { >+public void annotationValueMustBeArrayInitializer(TypeBinding annotationType, char[] name, Expression value) { >+ String str = new String(name); > this.handle( >- IProblem.AnnotationValueMustBeArrayInitializer, >- NoArgument, >- NoArgument, >- value.sourceStart, >- value.sourceEnd); >+ IProblem.AnnotationValueMustBeArrayInitializer, >+ new String[] { new String(annotationType.readableName()), str }, >+ new String[] { new String(annotationType.shortReadableName()), str}, >+ value.sourceStart, >+ value.sourceEnd); > } > public void annotationValueMustBeClassLiteral(TypeBinding annotationType, char[] name, Expression value) { > String str = new String(name); >@@ -600,8 +601,8 @@ > value.sourceStart, > value.sourceEnd); > } >-public void annotationValueMustBeConstant(TypeBinding annotationType, char[] name, Expression value) { >- String str = new String(name); >+public void annotationValueMustBeConstant(TypeBinding annotationType, char[] name, Expression value, boolean isEnum) { >+ String str = new String(name); > this.handle( > IProblem.AnnotationValueMustBeConstant, > new String[] { new String(annotationType.readableName()), str },
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 149751
:
45920
|
45921
|
49948
|
49974
|
49975
|
50002
|
50003
|
50036
|
51098
|
51099