### 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 28 Sep 2006 16:07:55 -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; @@ -132,7 +134,11 @@ } } } else if (this.value.constant == Constant.NotAConstant) { - scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value); + if (valueType.isArrayType()) { + scope.problemReporter().annotationValueMustBeArrayInitializer(this.value); + } else { + scope.problemReporter().annotationValueMustBeConstant(this.binding.declaringClass, this.name, this.value); + } } 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); + } 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); + } 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); + } + } + } + } + } + } 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); + } else { + scope.problemReporter().annotationValueMustBeArrayInitializer(this.value); + } + } + } } break checkAnnotationMethodType; } 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 28 Sep 2006 16:07:56 -0000 @@ -601,7 +601,7 @@ value.sourceEnd); } public void annotationValueMustBeConstant(TypeBinding annotationType, char[] name, Expression value) { - String str = new String(name); + String str = new String(name); this.handle( IProblem.AnnotationValueMustBeConstant, new String[] { new String(annotationType.readableName()), str },