# HG changeset patch # User lana # Date 1355519739 28800 # Node ID ec5621e367290e4b6f8dc510001b358b8a3507b9 # Parent ec9c9ff8ed2dc6b9e80d02ae82e2e80e14fad29a# Parent f93a8d60b9a4bfa22704dd4bca5fc0e8ce1a5491 Merge diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/classfile/Opcode.java --- a/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/Opcode.java Fri Dec 14 13:15:39 2012 -0800 @@ -448,10 +448,10 @@ } - private static Opcode[] stdOpcodes = new Opcode[256]; - private static Opcode[] wideOpcodes = new Opcode[256]; - private static Opcode[] nonPrivOpcodes = new Opcode[256]; - private static Opcode[] privOpcodes = new Opcode[256]; + private static final Opcode[] stdOpcodes = new Opcode[256]; + private static final Opcode[] wideOpcodes = new Opcode[256]; + private static final Opcode[] nonPrivOpcodes = new Opcode[256]; + private static final Opcode[] privOpcodes = new Opcode[256]; static { for (Opcode o: values()) getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFileFactory.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFileFactory.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFileFactory.java Fri Dec 14 13:15:39 2012 -0800 @@ -46,7 +46,7 @@ * @since 1.8 */ abstract class DocFileFactory { - private static Map factories = + private static final Map factories = new WeakHashMap(); /** diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/Server.java --- a/langtools/src/share/classes/com/sun/tools/javac/Server.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/Server.java Fri Dec 14 13:15:39 2012 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ private final OutputStream out; private final boolean isSocket; private static final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); - private static Logger logger = Logger.getLogger("com.sun.tools.javac"); + private static final Logger logger = Logger.getLogger("com.sun.tools.javac"); static class CwdFileManager extends ForwardingJavaFileManager { String cwd; CwdFileManager(JavaFileManager fileManager) { @@ -69,7 +69,7 @@ // } } // static CwdFileManager fm = new CwdFileManager(tool.getStandardFileManager()); - static StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); + static final StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); static { // Use the same file manager for all compilations. This will // cache jar files in the standard file manager. Use diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java Fri Dec 14 13:15:39 2012 -0800 @@ -74,12 +74,12 @@ */ private List attributes = NOT_STARTED; /* - * The Symbol this Annotatios belong to + * The Symbol this Annotations belong to */ - private final Symbol s; + private final Symbol sym; - public Annotations(Symbol s) { - this.s = s; + public Annotations(Symbol sym) { + this.sym = sym; } public List getAttributes() { @@ -102,7 +102,7 @@ } public void setAttributesWithCompletion(final Annotate.AnnotateRepeatedContext ctx) { - Assert.check(pendingCompletion() || (!isStarted() && s.kind == PCK)); + Assert.check(pendingCompletion() || (!isStarted() && sym.kind == PCK)); Map> annotated = ctx.annotated; boolean atLeastOneRepeated = false; @@ -111,7 +111,7 @@ if (lb.size() == 1) { buf = buf.prepend(lb.first()); } else { // repeated - buf = buf.prepend(new Placeholder(lb.toList(), s)); + buf = buf.prepend(new Placeholder(lb.toList(), sym)); atLeastOneRepeated = true; } } @@ -141,7 +141,7 @@ @Override public String toString() { - return "repeated annotation pass of: " + s + " in: " + s.owner; + return "repeated annotation pass of: " + sym + " in: " + sym.owner; } @Override @@ -253,7 +253,7 @@ // Process repeated annotations Attribute.Compound validRepeated = - ctx.processRepeatedAnnotations(placeholder.getPlaceholderFor()); + ctx.processRepeatedAnnotations(placeholder.getPlaceholderFor(), sym); if (validRepeated != null) { // Check that the container isn't manually diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Flags.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Fri Dec 14 13:15:39 2012 -0800 @@ -307,7 +307,7 @@ } // Cache of modifier sets. - private static Map> modifierSets = + private static final Map> modifierSets = new java.util.concurrent.ConcurrentHashMap>(64); public static boolean isStatic(Symbol symbol) { @@ -356,7 +356,7 @@ VARARGS("varargs"), PACKAGE("package"); - String name; + private final String name; Flag(String name) { this.name = name; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java Fri Dec 14 13:15:39 2012 -0800 @@ -110,7 +110,7 @@ INSTANCE_INIT("kindname.instance.init"), PACKAGE("kindname.package"); - private String name; + private final String name; KindName(String name) { this.name = name; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Lint.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Fri Dec 14 13:15:39 2012 -0800 @@ -28,11 +28,14 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; +import java.util.Set; +import javax.lang.model.element.Modifier; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.Pair; + import static com.sun.tools.javac.code.Flags.*; @@ -95,7 +98,8 @@ private final EnumSet values; private final EnumSet suppressedValues; - private static Map map = new HashMap(); + private static final Map map = + new java.util.concurrent.ConcurrentHashMap(20); protected Lint(Context context) { diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Source.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Fri Dec 14 13:15:39 2012 -0800 @@ -87,7 +87,7 @@ public final String name; - private static Map tab = new HashMap(); + private static final Map tab = new HashMap(); static { for (Source s : values()) { tab.put(s.name, s); diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java Fri Dec 14 13:15:39 2012 -0800 @@ -166,7 +166,7 @@ static final int MAXIMUM_TARGET_TYPE_VALUE = 0x22; private final int targetTypeValue; - private Set flags; + private final Set flags; TargetType(int targetTypeValue, TargetAttribute... attributes) { if (targetTypeValue < Byte.MIN_VALUE @@ -233,10 +233,10 @@ return this.targetTypeValue; } - private static TargetType[] targets = null; + private static final TargetType[] targets; - private static TargetType[] buildTargets() { - TargetType[] targets = new TargetType[MAXIMUM_TARGET_TYPE_VALUE + 1]; + static { + targets = new TargetType[MAXIMUM_TARGET_TYPE_VALUE + 1]; TargetType[] alltargets = values(); for (TargetType target : alltargets) { if (target.targetTypeValue >= 0) @@ -246,13 +246,9 @@ if (targets[i] == null) targets[i] = UNKNOWN; } - return targets; } public static boolean isValidTargetTypeValue(int tag) { - if (targets == null) - targets = buildTargets(); - if (((byte)tag) == ((byte)UNKNOWN.targetTypeValue)) return true; @@ -260,9 +256,6 @@ } public static TargetType fromTargetTypeValue(int tag) { - if (targets == null) - targets = buildTargets(); - if (((byte)tag) == ((byte)UNKNOWN.targetTypeValue)) return UNKNOWN; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java Fri Dec 14 13:15:39 2012 -0800 @@ -135,9 +135,11 @@ /** This field will only be used for tags related with numeric types for * optimization reasons. */ - private int order = 0; + private final int order; - private TypeTag() {} + private TypeTag() { + this(0); + } private TypeTag(int order) { this.order = order; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri Dec 14 13:15:39 2012 -0800 @@ -2849,7 +2849,7 @@ } return tvars1; } - static private Mapping newInstanceFun = new Mapping("newInstanceFun") { + private static final Mapping newInstanceFun = new Mapping("newInstanceFun") { public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound()); } }; // diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java Fri Dec 14 13:15:39 2012 -0800 @@ -26,7 +26,6 @@ package com.sun.tools.javac.comp; import java.util.Map; - import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.code.*; @@ -171,8 +170,8 @@ * @param repeatingAnnotations a List of repeating annotations * @return a new Attribute.Compound that is the container for the repeatingAnnotations */ - public Attribute.Compound processRepeatedAnnotations(List repeatingAnnotations) { - return Annotate.this.processRepeatedAnnotations(repeatingAnnotations, this); + public Attribute.Compound processRepeatedAnnotations(List repeatingAnnotations, Symbol sym) { + return Annotate.this.processRepeatedAnnotations(repeatingAnnotations, this, sym); } /** @@ -339,10 +338,11 @@ * annotation are invalid. This method reports errors/warnings. */ private Attribute.Compound processRepeatedAnnotations(List annotations, - AnnotateRepeatedContext ctx) { + AnnotateRepeatedContext ctx, + Symbol on) { Attribute.Compound firstOccurrence = annotations.head; List repeated = List.nil(); - Type origAnnoType; + Type origAnnoType = null; Type arrayOfOrigAnnoType = null; Type targetContainerType = null; MethodSymbol containerValueSymbol = null; @@ -390,6 +390,13 @@ new Attribute.Array(arrayOfOrigAnnoType, repeated)); annoTree = m.Annotation(new Attribute.Compound(targetContainerType, List.of(p))); + + if (!chk.annotationApplicable(annoTree, on)) + log.error(annoTree.pos(), "invalid.containedby.annotation.incompatible.target", targetContainerType, origAnnoType); + + if (!chk.validateAnnotationDeferErrors(annoTree)) + log.error(annoTree.pos(), "duplicate.annotation.invalid.repeated", origAnnoType); + Attribute.Compound c = enterAnnotation(annoTree, targetContainerType, ctx.env); @@ -410,7 +417,7 @@ // annotation's declaration, or null if it has none Attribute.Compound ca = origAnnoDecl.attribute(syms.containedByType.tsym); if (ca == null) { // has no ContainedBy annotation - log.error(pos, "duplicate.annotation.missing.container", origAnnoType); + log.error(pos, "duplicate.annotation.missing.container", origAnnoType, syms.containedByType); return null; } diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/comp/Check.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Dec 14 13:15:39 2012 -0800 @@ -1833,13 +1833,15 @@ for (Scope.Entry e1 = t1.tsym.members().elems; e1 != null; e1 = e1.sibling) { Symbol s1 = e1.sym; Type st1 = null; - if (s1.kind != MTH || !s1.isInheritedIn(site.tsym, types)) continue; + if (s1.kind != MTH || !s1.isInheritedIn(site.tsym, types) || + (s1.flags() & SYNTHETIC) != 0) continue; Symbol impl = ((MethodSymbol)s1).implementation(site.tsym, types, false); if (impl != null && (impl.flags() & ABSTRACT) == 0) continue; for (Scope.Entry e2 = t2.tsym.members().lookup(s1.name); e2.scope != null; e2 = e2.next()) { Symbol s2 = e2.sym; if (s1 == s2) continue; - if (s2.kind != MTH || !s2.isInheritedIn(site.tsym, types)) continue; + if (s2.kind != MTH || !s2.isInheritedIn(site.tsym, types) || + (s2.flags() & SYNTHETIC) != 0) continue; if (st1 == null) st1 = types.memberType(t1, s1); Type st2 = types.memberType(t2, s2); if (types.overrideEquivalent(st1, st2)) { @@ -2890,39 +2892,54 @@ } /** Check an annotation value. + * + * @param a The annotation tree to check + * @return true if this annotation tree is valid, otherwise false */ - public void validateAnnotation(JCAnnotation a) { - // collect an inventory of the members (sorted alphabetically) - Set members = new TreeSet(new Comparator() { - public int compare(Symbol t, Symbol t1) { - return t.name.compareTo(t1.name); - } - }); + public boolean validateAnnotationDeferErrors(JCAnnotation a) { + boolean res = false; + final Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); + try { + res = validateAnnotation(a); + } finally { + log.popDiagnosticHandler(diagHandler); + } + return res; + } + + private boolean validateAnnotation(JCAnnotation a) { + boolean isValid = true; + // collect an inventory of the annotation elements + Set members = new LinkedHashSet(); for (Scope.Entry e = a.annotationType.type.tsym.members().elems; e != null; e = e.sibling) if (e.sym.kind == MTH) members.add((MethodSymbol) e.sym); - // count them off as they're annotated + // remove the ones that are assigned values for (JCTree arg : a.args) { if (!arg.hasTag(ASSIGN)) continue; // recovery JCAssign assign = (JCAssign) arg; Symbol m = TreeInfo.symbol(assign.lhs); if (m == null || m.type.isErroneous()) continue; - if (!members.remove(m)) + if (!members.remove(m)) { + isValid = false; log.error(assign.lhs.pos(), "duplicate.annotation.member.value", m.name, a.type); + } } // all the remaining ones better have default values - ListBuffer missingDefaults = ListBuffer.lb(); + List missingDefaults = List.nil(); for (MethodSymbol m : members) { if (m.defaultValue == null && !m.type.isErroneous()) { - missingDefaults.append(m.name); + missingDefaults = missingDefaults.append(m.name); } } + missingDefaults = missingDefaults.reverse(); if (missingDefaults.nonEmpty()) { + isValid = false; String key = (missingDefaults.size() > 1) ? "annotation.missing.default.value.1" : "annotation.missing.default.value"; @@ -2933,21 +2950,23 @@ // repeated values in its value member if (a.annotationType.type.tsym != syms.annotationTargetType.tsym || a.args.tail == null) - return; + return isValid; - if (!a.args.head.hasTag(ASSIGN)) return; // error recovery + if (!a.args.head.hasTag(ASSIGN)) return false; // error recovery JCAssign assign = (JCAssign) a.args.head; Symbol m = TreeInfo.symbol(assign.lhs); - if (m.name != names.value) return; + if (m.name != names.value) return false; JCTree rhs = assign.rhs; - if (!rhs.hasTag(NEWARRAY)) return; + if (!rhs.hasTag(NEWARRAY)) return false; JCNewArray na = (JCNewArray) rhs; Set targets = new HashSet(); for (JCTree elem : na.elems) { if (!targets.add(TreeInfo.symbol(elem))) { + isValid = false; log.error(elem.pos(), "repeated.annotation.target"); } } + return isValid; } void checkDeprecatedAnnotation(DiagnosticPosition pos, Symbol s) { diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java Fri Dec 14 13:15:39 2012 -0800 @@ -62,9 +62,9 @@ syms = Symtab.instance(context); } - static Integer minusOne = -1; - static Integer zero = 0; - static Integer one = 1; + static final Integer minusOne = -1; + static final Integer zero = 0; + static final Integer one = 1; /** Convert boolean to integer (true = 1, false = 0). */ diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Fri Dec 14 13:15:39 2012 -0800 @@ -246,8 +246,8 @@ */ SPECULATIVE_LOOP("var.might.be.assigned.in.loop", true); - String errKey; - boolean isFinal; + final String errKey; + final boolean isFinal; FlowKind(String errKey, boolean isFinal) { this.errKey = errKey; @@ -295,7 +295,7 @@ } }; - JCTree.Tag treeTag; + final JCTree.Tag treeTag; private JumpKind(Tag treeTag) { this.treeTag = treeTag; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Fri Dec 14 13:15:39 2012 -0800 @@ -156,7 +156,7 @@ OBJECT_INIT("object-init"), INTERNAL("internal"); - String opt; + final String opt; private VerboseResolutionMode(String opt) { this.opt = opt; @@ -3381,8 +3381,8 @@ } }; - boolean isBoxingRequired; - boolean isVarargsRequired; + final boolean isBoxingRequired; + final boolean isVarargsRequired; MethodResolutionPhase(boolean isBoxingRequired, boolean isVarargsRequired) { this.isBoxingRequired = isBoxingRequired; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java --- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java Fri Dec 14 13:15:39 2012 -0800 @@ -83,7 +83,7 @@ public final static long NOT_MODIFIED = Long.MIN_VALUE; - private static boolean NON_BATCH_MODE = System.getProperty("nonBatchMode") != null;// TODO: Use -XD compiler switch for this. + private static final boolean NON_BATCH_MODE = System.getProperty("nonBatchMode") != null;// TODO: Use -XD compiler switch for this. private Map directories = Collections.emptyMap(); diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Dec 14 13:15:39 2012 -0800 @@ -1360,6 +1360,16 @@ void attachAnnotationDefault(final Symbol sym) { final MethodSymbol meth = (MethodSymbol)sym; // only on methods final Attribute value = readAttributeValue(); + + // The default value is set later during annotation. It might + // be the case that the Symbol sym is annotated _after_ the + // repeating instances that depend on this default value, + // because of this we set an interim value that tells us this + // element (most likely) has a default. + // + // Set interim value for now, reset just before we do this + // properly at annotate time. + meth.defaultValue = value; annotate.normal(new AnnotationDefaultCompleter(meth, value)); } @@ -1680,6 +1690,9 @@ public void enterAnnotation() { JavaFileObject previousClassFile = currentClassFile; try { + // Reset the interim value set earlier in + // attachAnnotationDefault(). + sym.defaultValue = null; currentClassFile = classFile; sym.defaultValue = deproxy(sym.type.getReturnType(), value); } finally { diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Fri Dec 14 13:15:39 2012 -0800 @@ -1545,10 +1545,10 @@ public void compressCatchTable() { ListBuffer compressedCatchInfo = ListBuffer.lb(); List handlerPcs = List.nil(); - for (char[] catchEntry : catchInfo.elems) { + for (char[] catchEntry : catchInfo) { handlerPcs = handlerPcs.prepend((int)catchEntry[2]); } - for (char[] catchEntry : catchInfo.elems) { + for (char[] catchEntry : catchInfo) { int startpc = catchEntry[0]; int endpc = catchEntry[1]; if (startpc == endpc || @@ -1825,7 +1825,7 @@ } } - static Type jsrReturnValue = new Type(INT, null); + static final Type jsrReturnValue = new Type(INT, null); /* ************************************************************************** diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/jvm/Target.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Target.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Target.java Fri Dec 14 13:15:39 2012 -0800 @@ -86,17 +86,15 @@ return instance; } - private static Target MIN; + private static final Target MIN = values()[0]; public static Target MIN() { return MIN; } - private static Target MAX; + private static final Target MAX = values()[values().length - 1]; public static Target MAX() { return MAX; } - private static Map tab = new HashMap(); + private static final Map tab = new HashMap(); static { for (Target t : values()) { - if (MIN == null) MIN = t; - MAX = t; tab.put(t.name, t); } tab.put("5", JDK1_5); diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Fri Dec 14 13:15:39 2012 -0800 @@ -189,7 +189,7 @@ } } - private static CompilePolicy DEFAULT_COMPILE_POLICY = CompilePolicy.BY_TODO; + private static final CompilePolicy DEFAULT_COMPILE_POLICY = CompilePolicy.BY_TODO; protected static enum ImplicitSourcePolicy { /** Don't generate or process implicitly read source files. */ @@ -543,7 +543,7 @@ public static CompileState max(CompileState a, CompileState b) { return a.value > b.value ? a : b; } - private int value; + private final int value; }; /** Partial map to record which compiler phases have been executed * for each compilation unit. Used for ATTR and FLOW phases. diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/main/Option.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/Option.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/Option.java Fri Dec 14 13:15:39 2012 -0800 @@ -167,7 +167,6 @@ ENCODING("-encoding", "opt.arg.encoding", "opt.encoding", STANDARD, FILEMANAGER) { @Override public boolean process(OptionHelper helper, String option, String operand) { -// System.err.println("process encoding " + operand); return super.process(helper, option, operand); } @@ -246,9 +245,7 @@ } }, - A("-A", "opt.arg.key.equals.value", "opt.A", STANDARD, BASIC) { - { hasSuffix = true; } - + A("-A", "opt.arg.key.equals.value", "opt.A", STANDARD, BASIC, true) { @Override public boolean matches(String arg) { return arg.startsWith("-A"); @@ -293,8 +290,6 @@ // This option exists only for the purpose of documenting itself. // It's actually implemented by the launcher. J("-J", "opt.arg.flag", "opt.J", STANDARD, INFO) { - { hasSuffix = true; } - @Override public boolean process(OptionHelper helper, String option) { throw new AssertionError @@ -302,10 +297,6 @@ } }, - // stop after parsing and attributing. - // new HiddenOption("-attrparseonly"), - - // new Option("-moreinfo", "opt.moreinfo") { MOREINFO("-moreinfo", null, HIDDEN, BASIC) { @Override public boolean process(OptionHelper helper, String option) { @@ -317,23 +308,6 @@ // treat warnings as errors WERROR("-Werror", "opt.Werror", STANDARD, BASIC), -// // use complex inference from context in the position of a method call argument -// COMPLEXINFERENCE("-complexinference", null, HIDDEN, BASIC), - - // generare source stubs - // new HiddenOption("-stubs"), - - // relax some constraints to allow compiling from stubs - // new HiddenOption("-relax"), - - // output source after translating away inner classes - // new Option("-printflat", "opt.printflat"), - // new HiddenOption("-printflat"), - - // display scope search details - // new Option("-printsearch", "opt.printsearch"), - // new HiddenOption("-printsearch"), - // prompt after each error // new Option("-prompt", "opt.prompt"), PROMPT("-prompt", null, HIDDEN, BASIC), @@ -342,13 +316,8 @@ DOE("-doe", null, HIDDEN, BASIC), // output source after type erasure - // new Option("-s", "opt.s"), PRINTSOURCE("-printsource", null, HIDDEN, BASIC), - // output shrouded class files - // new Option("-scramble", "opt.scramble"), - // new Option("-scrambleall", "opt.scrambleall"), - // display warnings for generic unchecked operations WARNUNCHECKED("-warnunchecked", null, HIDDEN, BASIC) { @Override @@ -408,18 +377,16 @@ * -XDx sets the option x to the value x. */ XD("-XD", null, HIDDEN, BASIC) { - String s; @Override public boolean matches(String s) { - this.s = s; return s.startsWith(text); } @Override public boolean process(OptionHelper helper, String option) { - s = s.substring(text.length()); - int eq = s.indexOf('='); - String key = (eq < 0) ? s : s.substring(0, eq); - String value = (eq < 0) ? s : s.substring(eq+1); + option = option.substring(text.length()); + int eq = option.indexOf('='); + String key = (eq < 0) ? option : option.substring(0, eq); + String value = (eq < 0) ? option : option.substring(eq+1); helper.put(key, value); return false; } @@ -428,8 +395,6 @@ // This option exists only for the purpose of documenting itself. // It's actually implemented by the CommandLine class. AT("@", "opt.arg.file", "opt.AT", STANDARD, INFO) { - { hasSuffix = true; } - @Override public boolean process(OptionHelper helper, String option) { throw new AssertionError("the @ flag should be caught by CommandLine."); @@ -445,17 +410,15 @@ * name to a separate list. */ SOURCEFILE("sourcefile", null, HIDDEN, INFO) { - String s; @Override public boolean matches(String s) { - this.s = s; return s.endsWith(".java") // Java source file || SourceVersion.isName(s); // Legal type name } @Override public boolean process(OptionHelper helper, String option) { - if (s.endsWith(".java") ) { - File f = new File(s); + if (option.endsWith(".java") ) { + File f = new File(option); if (!f.exists()) { helper.error("err.file.not.found", f); return true; @@ -465,9 +428,9 @@ return true; } helper.addFile(f); + } else { + helper.addClassName(option); } - else - helper.addClassName(s); return false; } }; @@ -521,7 +484,7 @@ /** Suffix option (-foo=bar or -foo:bar) */ - boolean hasSuffix; + final boolean hasSuffix; /** The kind of choices for this option, if any. */ @@ -535,24 +498,30 @@ Option(String text, String descrKey, OptionKind kind, OptionGroup group) { - this(text, null, descrKey, kind, group, null, null); + this(text, null, descrKey, kind, group, null, null, false); } Option(String text, String argsNameKey, String descrKey, OptionKind kind, OptionGroup group) { - this(text, argsNameKey, descrKey, kind, group, null, null); + this(text, argsNameKey, descrKey, kind, group, null, null, false); + } + + Option(String text, String argsNameKey, String descrKey, + OptionKind kind, OptionGroup group, boolean doHasSuffix) { + this(text, argsNameKey, descrKey, kind, group, null, null, doHasSuffix); } Option(String text, String descrKey, OptionKind kind, OptionGroup group, ChoiceKind choiceKind, Map choices) { - this(text, null, descrKey, kind, group, choiceKind, choices); + this(text, null, descrKey, kind, group, choiceKind, choices, false); } Option(String text, String descrKey, OptionKind kind, OptionGroup group, ChoiceKind choiceKind, String... choices) { - this(text, null, descrKey, kind, group, choiceKind, createChoices(choices)); + this(text, null, descrKey, kind, group, choiceKind, + createChoices(choices), false); } // where private static Map createChoices(String... choices) { @@ -564,7 +533,8 @@ private Option(String text, String argsNameKey, String descrKey, OptionKind kind, OptionGroup group, - ChoiceKind choiceKind, Map choices) { + ChoiceKind choiceKind, Map choices, + boolean doHasSuffix) { this.text = text; this.argsNameKey = argsNameKey; this.descrKey = descrKey; @@ -573,7 +543,7 @@ this.choiceKind = choiceKind; this.choices = choices; char lastChar = text.charAt(text.length()-1); - hasSuffix = lastChar == ':' || lastChar == '='; + this.hasSuffix = doHasSuffix || lastChar == ':' || lastChar == '='; } public String getText() { diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Fri Dec 14 13:15:39 2012 -0800 @@ -44,7 +44,7 @@ */ public class JavaTokenizer { - private static boolean scannerDebug = false; + private static final boolean scannerDebug = false; /** Allow hex floating-point literals. */ diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Dec 14 13:15:39 2012 -0800 @@ -818,9 +818,7 @@ * | "*" | "/" | "%" */ JCExpression term2Rest(JCExpression t, int minprec) { - List savedOd = odStackSupply.elems; JCExpression[] odStack = newOdStack(); - List savedOp = opStackSupply.elems; Token[] opStack = newOpStack(); // optimization, was odStack = new Tree[...]; opStack = new Tree[...]; @@ -851,8 +849,8 @@ } } - odStackSupply.elems = savedOd; // optimization - opStackSupply.elems = savedOp; // optimization + odStackSupply.add(odStack); + opStackSupply.add(opStack); return t; } //where @@ -906,23 +904,19 @@ /** optimization: To save allocating a new operand/operator stack * for every binary operation, we use supplys. */ - ListBuffer odStackSupply = new ListBuffer(); - ListBuffer opStackSupply = new ListBuffer(); + ArrayList odStackSupply = new ArrayList(); + ArrayList opStackSupply = new ArrayList(); private JCExpression[] newOdStack() { - if (odStackSupply.elems == odStackSupply.last) - odStackSupply.append(new JCExpression[infixPrecedenceLevels + 1]); - JCExpression[] odStack = odStackSupply.elems.head; - odStackSupply.elems = odStackSupply.elems.tail; - return odStack; + if (odStackSupply.isEmpty()) + return new JCExpression[infixPrecedenceLevels + 1]; + return odStackSupply.remove(odStackSupply.size() - 1); } private Token[] newOpStack() { - if (opStackSupply.elems == opStackSupply.last) - opStackSupply.append(new Token[infixPrecedenceLevels + 1]); - Token[] opStack = opStackSupply.elems.head; - opStackSupply.elems = opStackSupply.elems.tail; - return opStack; + if (opStackSupply.isEmpty()) + return new Token[infixPrecedenceLevels + 1]; + return opStackSupply.remove(opStackSupply.size() - 1); } /** @@ -2001,7 +1995,7 @@ ListBuffer stats = variableDeclarators(mods, t, new ListBuffer()); // A "LocalVariableDeclarationStatement" subsumes the terminating semicolon - storeEnd(stats.elems.last(), token.endPos); + storeEnd(stats.last(), token.endPos); accept(SEMI); return stats.toList(); } @@ -2042,7 +2036,7 @@ ListBuffer stats = variableDeclarators(mods, t, new ListBuffer()); // A "LocalVariableDeclarationStatement" subsumes the terminating semicolon - storeEnd(stats.elems.last(), token.endPos); + storeEnd(stats.last(), token.endPos); accept(SEMI); return stats.toList(); } else { @@ -2577,7 +2571,7 @@ vdefs.append(variableDeclaratorRest(pos, mods, type, name, reqInit, dc)); while (token.kind == COMMA) { // All but last of multiple declarators subsume a comma - storeEnd((JCTree)vdefs.elems.last(), token.endPos); + storeEnd((JCTree)vdefs.last(), token.endPos); nextToken(); vdefs.append(variableDeclarator(mods, type, reqInit, dc)); } @@ -2632,7 +2626,7 @@ defs.append(resource()); while (token.kind == SEMI) { // All but last of multiple declarators must subsume a semicolon - storeEnd(defs.elems.last(), token.endPos); + storeEnd(defs.last(), token.endPos); int semiColonPos = token.pos; nextToken(); if (token.kind == RPAREN) { // Optional trailing semicolon @@ -2710,7 +2704,7 @@ JCTree.JCCompilationUnit toplevel = F.at(firstToken.pos).TopLevel(packageAnnotations, pid, defs.toList()); if (!consumedToplevelDoc) attach(toplevel, firstToken.comment(CommentStyle.JAVADOC)); - if (defs.elems.isEmpty()) + if (defs.isEmpty()) storeEnd(toplevel, S.prevToken().endPos); if (keepDocComments) toplevel.docComments = docComments; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Dec 14 13:15:39 2012 -0800 @@ -1336,7 +1336,7 @@ return nodes; } - private static TreeScanner treeCleaner = new TreeScanner() { + private static final TreeScanner treeCleaner = new TreeScanner() { public void scan(JCTree node) { super.scan(node); if (node != null) diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Dec 14 13:15:39 2012 -0800 @@ -307,13 +307,17 @@ compiler.err.duplicate.annotation=\ duplicate annotation +# 0: type +compiler.err.duplicate.annotation.invalid.repeated=\ + annotation {0} cannot be repeated\nIt does not define a valid containing annotation. + # 0: name, 1: type compiler.err.duplicate.annotation.member.value=\ duplicate annotation member value {0} in {1} -# 0: type +# 0: type, 1: type compiler.err.duplicate.annotation.missing.container=\ - duplicate annotation, the declaration of {0} does not have a ContainedBy annotation + duplicate annotation, the declaration of {0} does not have a valid {1} annotation # 0: type, 1: type compiler.err.invalid.container.no.containedby=\ diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Fri Dec 14 13:15:39 2012 -0800 @@ -340,15 +340,17 @@ */ LETEXPR; // ala scheme - private Tag noAssignTag; + private final Tag noAssignTag; - private static int numberOfOperators = MOD.ordinal() - POS.ordinal() + 1; + private static final int numberOfOperators = MOD.ordinal() - POS.ordinal() + 1; private Tag(Tag noAssignTag) { this.noAssignTag = noAssignTag; } - private Tag() { } + private Tag() { + this(null); + } public static int getNumberOfOperators() { return numberOfOperators; @@ -1838,8 +1840,8 @@ /** Toplevel # new */ TOPLEVEL(ReferenceMode.NEW, false); - ReferenceMode mode; - boolean unbound; + final ReferenceMode mode; + final boolean unbound; private ReferenceKind(ReferenceMode mode, boolean unbound) { this.mode = mode; diff -r ec9c9ff8ed2d -r ec5621e36729 langtools/src/share/classes/com/sun/tools/javac/util/BaseFileManager.java --- a/langtools/src/share/classes/com/sun/tools/javac/util/BaseFileManager.java Thu Dec 13 09:05:43 2012 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BaseFileManager.java Fri Dec 14 13:15:39 2012 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -181,7 +181,7 @@ return false; } // where - private static Set