2118 /** Check an annotation value. |
2118 /** Check an annotation value. |
2119 */ |
2119 */ |
2120 public void validateAnnotation(JCAnnotation a) { |
2120 public void validateAnnotation(JCAnnotation a) { |
2121 if (a.type.isErroneous()) return; |
2121 if (a.type.isErroneous()) return; |
2122 |
2122 |
2123 // collect an inventory of the members |
2123 // collect an inventory of the members (sorted alphabetically) |
2124 Set<MethodSymbol> members = new HashSet<MethodSymbol>(); |
2124 Set<MethodSymbol> members = new TreeSet<MethodSymbol>(new Comparator<Symbol>() { |
|
2125 public int compare(Symbol t, Symbol t1) { |
|
2126 return t.name.compareTo(t1.name); |
|
2127 } |
|
2128 }); |
2125 for (Scope.Entry e = a.annotationType.type.tsym.members().elems; |
2129 for (Scope.Entry e = a.annotationType.type.tsym.members().elems; |
2126 e != null; |
2130 e != null; |
2127 e = e.sibling) |
2131 e = e.sibling) |
2128 if (e.sym.kind == MTH) |
2132 if (e.sym.kind == MTH) |
2129 members.add((MethodSymbol) e.sym); |
2133 members.add((MethodSymbol) e.sym); |
2140 if (assign.rhs.getTag() == ANNOTATION) |
2144 if (assign.rhs.getTag() == ANNOTATION) |
2141 validateAnnotation((JCAnnotation)assign.rhs); |
2145 validateAnnotation((JCAnnotation)assign.rhs); |
2142 } |
2146 } |
2143 |
2147 |
2144 // all the remaining ones better have default values |
2148 // all the remaining ones better have default values |
2145 for (MethodSymbol m : members) |
2149 ListBuffer<Name> missingDefaults = ListBuffer.lb(); |
2146 if (m.defaultValue == null && !m.type.isErroneous()) |
2150 for (MethodSymbol m : members) { |
2147 log.error(a.pos(), "annotation.missing.default.value", |
2151 if (m.defaultValue == null && !m.type.isErroneous()) { |
2148 a.type, m.name); |
2152 missingDefaults.append(m.name); |
|
2153 } |
|
2154 } |
|
2155 if (missingDefaults.nonEmpty()) { |
|
2156 String key = (missingDefaults.size() > 1) |
|
2157 ? "annotation.missing.default.value.1" |
|
2158 : "annotation.missing.default.value"; |
|
2159 log.error(a.pos(), key, a.type, missingDefaults); |
|
2160 } |
2149 |
2161 |
2150 // special case: java.lang.annotation.Target must not have |
2162 // special case: java.lang.annotation.Target must not have |
2151 // repeated values in its value member |
2163 // repeated values in its value member |
2152 if (a.annotationType.type.tsym != syms.annotationTargetType.tsym || |
2164 if (a.annotationType.type.tsym != syms.annotationTargetType.tsym || |
2153 a.args.tail == null) |
2165 a.args.tail == null) |