# HG changeset patch # User lana # Date 1411687290 25200 # Node ID 73a2b5540efc8cb54b47fdb9abfe2f4ae2bc9eef # Parent 1366778aa6f30386b490e8103d6b8c382a2af0ef# Parent 6c1bac8138d85da9ddfc4093bbac5945592b5edf Merge diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Attribute.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Attribute.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Attribute.java Thu Sep 25 16:21:30 2014 -0700 @@ -124,8 +124,7 @@ : types.erasure(type); return new Type.ClassType(types.syms.classType.getEnclosingType(), List.of(arg), - types.syms.classType.tsym, - Type.noAnnotations); + types.syms.classType.tsym); } @DefinedBy(Api.LANGUAGE_MODEL) public String toString() { diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Thu Sep 25 16:21:30 2014 -0700 @@ -970,7 +970,7 @@ this( flags, name, - new ClassType(Type.noType, null, null, Type.noAnnotations), + new ClassType(Type.noType, null, null), owner); this.type.tsym = this; } @@ -1007,7 +1007,7 @@ if (erasure_field == null) erasure_field = new ClassType(types.erasure(type.getEnclosingType()), List.nil(), this, - type.getAnnotationMirrors()); + type.getMetadata()); return erasure_field; } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java Thu Sep 25 16:21:30 2014 -0700 @@ -72,6 +72,24 @@ */ public abstract class Type extends AnnoConstruct implements TypeMirror { + /** + * Type metadata, Should be {@code null} for the default value. + * + * Note: it is an invariant that for any {@code TypeMetadata} + * class, a given {@code Type} may have at most one metadata array + * entry of that class. + */ + protected final TypeMetadata metadata; + + public TypeMetadata getMetadata() { + return metadata; + } + + public TypeMetadata.Element getMetadataOfKind(final TypeMetadata.Element.Kind kind) { + return metadata != null ? metadata.get(kind) : null; + } + + /** Constant type: no type at all. */ public static final JCNoType noType = new JCNoType() { @Override @DefinedBy(Api.LANGUAGE_MODEL) @@ -96,9 +114,6 @@ } }; - public static final List noAnnotations = - List.nil(); - /** If this switch is turned on, the names of type variables * and anonymous classes are printed with hashcodes appended. */ @@ -108,10 +123,6 @@ */ public TypeSymbol tsym; - /** The type annotations on this type. - */ - protected final List annos; - /** * Checks if the current type tag is equal to the given tag. * @return true if tag is equal to the current type tag. @@ -198,13 +209,11 @@ /** Define a type given its tag, type symbol, and type annotations */ - public Type(TypeSymbol tsym, List annos) { - if(annos == null) { - Assert.error("Attempting to create type " + tsym + " with null type annotations"); - } + public Type(TypeSymbol tsym, TypeMetadata metadata) { + Assert.checkNonNull(metadata); this.tsym = tsym; - this.annos = annos; + this.metadata = metadata; } /** An abstract class for mappings from types to types @@ -253,15 +262,39 @@ return this; } - public abstract Type annotatedType(List annos); + /** + * Create a new type with exactly the given metadata. The + * argument is guaranteed to always be non-empty, and should have + * already been copied/combined with the current type's metadata. + * This is used internally by other methods. + * + */ + public abstract Type clone(TypeMetadata md); + + public Type combineMetadata(final TypeMetadata.Element md) { + return clone(metadata.combine(md)); + } + + public Type annotatedType(final List annos) { + final TypeMetadata.Element annoMetadata = new TypeMetadata.Annotations(annos); + return combineMetadata(annoMetadata); + } public boolean isAnnotated() { - return !annos.isEmpty(); + final TypeMetadata.Annotations metadata = + (TypeMetadata.Annotations)getMetadataOfKind(TypeMetadata.Element.Kind.ANNOTATIONS); + + return null != metadata && !metadata.getAnnotations().isEmpty(); } + private static final List noAnnotations = List.nil(); + @Override @DefinedBy(Api.LANGUAGE_MODEL) public List getAnnotationMirrors() { - return annos; + final TypeMetadata.Annotations metadata = + (TypeMetadata.Annotations)getMetadataOfKind(TypeMetadata.Element.Kind.ANNOTATIONS); + + return metadata == null ? noAnnotations : metadata.getAnnotations(); } @@ -296,7 +329,7 @@ if (prefix) { sb.append(" "); } - sb.append(annos); + sb.append(getAnnotationMirrors()); sb.append(" "); } } @@ -524,19 +557,19 @@ TypeTag tag; public JCPrimitiveType(TypeTag tag, TypeSymbol tsym) { - this(tag, tsym, noAnnotations); + this(tag, tsym, TypeMetadata.empty); } - public JCPrimitiveType(TypeTag tag, TypeSymbol tsym, - List annos) { - super(tsym, annos); + private JCPrimitiveType(TypeTag tag, TypeSymbol tsym, + TypeMetadata metadata) { + super(tsym, metadata); this.tag = tag; Assert.check(tag.isPrimitive); } @Override - public Type annotatedType(List annos) { - return new JCPrimitiveType(tag, tsym, annos); + public JCPrimitiveType clone(TypeMetadata md) { + return new JCPrimitiveType(tag, tsym, md); } @Override @@ -565,7 +598,7 @@ @Override public Type constType(Object constValue) { final Object value = constValue; - return new JCPrimitiveType(tag, tsym, annos) { + return new JCPrimitiveType(tag, tsym, metadata) { @Override public Object constValue() { return value; @@ -649,35 +682,30 @@ } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym) { - this(type, kind, tsym, null, noAnnotations); + this(type, kind, tsym, null, TypeMetadata.empty); } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, - List annos) { - this(type, kind, tsym, null, annos); - } - - public WildcardType(WildcardType t, TypeVar bound, - List annos) { - this(t.type, t.kind, t.tsym, bound, annos); + TypeMetadata metadata) { + this(type, kind, tsym, null, metadata); } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, TypeVar bound) { - this(type, kind, tsym, noAnnotations); + this(type, kind, tsym, bound, TypeMetadata.empty); } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, - TypeVar bound, List annos) { - super(tsym, annos); + TypeVar bound, TypeMetadata metadata) { + super(tsym, metadata); this.type = Assert.checkNonNull(type); this.kind = kind; this.bound = bound; } @Override - public WildcardType annotatedType(List annos) { - return new WildcardType(type, kind, tsym, bound, annos); + public WildcardType clone(TypeMetadata md) { + return new WildcardType(type, kind, tsym, bound, md); } @Override @@ -747,7 +775,7 @@ if (t == type) return this; else - return new WildcardType(t, kind, tsym, bound, annos); + return new WildcardType(t, kind, tsym, bound, metadata); } @DefinedBy(Api.LANGUAGE_MODEL) @@ -808,31 +836,23 @@ public List all_interfaces_field; public ClassType(Type outer, List typarams, TypeSymbol tsym) { - this(outer, typarams, tsym, noAnnotations); + this(outer, typarams, tsym, TypeMetadata.empty); } public ClassType(Type outer, List typarams, TypeSymbol tsym, - List annos) { - super(tsym, annos); + TypeMetadata metadata) { + super(tsym, metadata); this.outer_field = outer; this.typarams_field = typarams; this.allparams_field = null; this.supertype_field = null; this.interfaces_field = null; - /* - // this can happen during error recovery - assert - outer.isParameterized() ? - typarams.length() == tsym.type.typarams().length() : - outer.isRaw() ? - typarams.length() == 0 : - true; - */ } @Override - public ClassType annotatedType(List annos) { - final ClassType out = new ClassType(outer_field, typarams_field, tsym, annos); + public ClassType clone(TypeMetadata md) { + final ClassType out = + new ClassType(outer_field, typarams_field, tsym, md); out.allparams_field = allparams_field; out.supertype_field = supertype_field; out.interfaces_field = interfaces_field; @@ -851,7 +871,7 @@ public Type constType(Object constValue) { final Object value = constValue; - return new ClassType(getEnclosingType(), typarams_field, tsym, annos) { + return new ClassType(getEnclosingType(), typarams_field, tsym, metadata) { @Override public Object constValue() { return value; @@ -987,7 +1007,7 @@ List typarams = getTypeArguments(); List typarams1 = map(typarams, f); if (outer1 == outer && typarams1 == typarams) return this; - else return new ClassType(outer1, typarams1, tsym, annos); + else return new ClassType(outer1, typarams1, tsym, metadata); } public boolean contains(Type elem) { @@ -1016,12 +1036,12 @@ public static class ErasedClassType extends ClassType { public ErasedClassType(Type outer, TypeSymbol tsym) { - this(outer, tsym, noAnnotations); + super(outer, List.nil(), tsym); } public ErasedClassType(Type outer, TypeSymbol tsym, - List annos) { - super(outer, List.nil(), tsym, annos); + TypeMetadata metadata) { + super(outer, List.nil(), tsym, metadata); } @Override @@ -1037,7 +1057,7 @@ public UnionClassType(ClassType ct, List alternatives) { // Presently no way to refer to this type directly, so we // cannot put annotations directly on it. - super(ct.outer_field, ct.typarams_field, ct.tsym, noAnnotations); + super(ct.outer_field, ct.typarams_field, ct.tsym); allparams_field = ct.allparams_field; supertype_field = ct.supertype_field; interfaces_field = ct.interfaces_field; @@ -1045,6 +1065,11 @@ alternatives_field = alternatives; } + @Override + public UnionClassType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a union type"); + } + public Type getLub() { return tsym.type; } @@ -1077,7 +1102,7 @@ public IntersectionClassType(List bounds, ClassSymbol csym, boolean allInterfaces) { // Presently no way to refer to this type directly, so we // cannot put annotations directly on it. - super(Type.noType, List.nil(), csym, noAnnotations); + super(Type.noType, List.nil(), csym); this.allInterfaces = allInterfaces; Assert.check((csym.flags() & COMPOUND) != 0); supertype_field = bounds.head; @@ -1086,6 +1111,11 @@ !supertype_field.isInterface(), supertype_field); } + @Override + public IntersectionClassType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to an intersection type"); + } + @DefinedBy(Api.LANGUAGE_MODEL) public java.util.List getBounds() { return Collections.unmodifiableList(getExplicitComponents()); @@ -1118,18 +1148,18 @@ public Type elemtype; public ArrayType(Type elemtype, TypeSymbol arrayClass) { - this(elemtype, arrayClass, noAnnotations); + this(elemtype, arrayClass, TypeMetadata.empty); } public ArrayType(Type elemtype, TypeSymbol arrayClass, - List annos) { - super(arrayClass, annos); + TypeMetadata metadata) { + super(arrayClass, metadata); this.elemtype = elemtype; } @Override - public ArrayType annotatedType(List annos) { - return new ArrayType(elemtype, tsym, annos); + public ArrayType clone(TypeMetadata md) { + return new ArrayType(elemtype, tsym, md); } @Override @@ -1192,7 +1222,7 @@ } public ArrayType makeVarargs() { - return new ArrayType(elemtype, tsym, annos) { + return new ArrayType(elemtype, tsym, metadata) { @Override public boolean isVarargs() { return true; @@ -1203,7 +1233,7 @@ public Type map(Mapping f) { Type elemtype1 = f.apply(elemtype); if (elemtype1 == elemtype) return this; - else return new ArrayType(elemtype1, tsym, annos); + else return new ArrayType(elemtype1, tsym, metadata); } public boolean contains(Type elem) { @@ -1246,15 +1276,15 @@ TypeSymbol methodClass) { // Presently no way to refer to a method type directly, so // we cannot put type annotations on it. - super(methodClass, noAnnotations); + super(methodClass, TypeMetadata.empty); this.argtypes = argtypes; this.restype = restype; this.thrown = thrown; } @Override - public MethodType annotatedType(List annos) { - throw new AssertionError("Cannot annotate a method type"); + public MethodType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a method type"); } @Override @@ -1346,12 +1376,12 @@ PackageType(TypeSymbol tsym) { // Package types cannot be annotated - super(tsym, noAnnotations); + super(tsym, TypeMetadata.empty); } @Override - public PackageType annotatedType(List annos) { - throw new AssertionError("Cannot annotate a package type"); + public PackageType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a package type"); } @Override @@ -1402,26 +1432,26 @@ public Type lower; public TypeVar(Name name, Symbol owner, Type lower) { - this(name, owner, lower, noAnnotations); - } - - public TypeVar(Name name, Symbol owner, Type lower, - List annos) { - super(null, annos); + super(null, TypeMetadata.empty); tsym = new TypeVariableSymbol(0, name, this, owner); + this.bound = bound; this.lower = lower; } + public TypeVar(TypeSymbol tsym, Type bound, Type lower) { + this(tsym, bound, lower, TypeMetadata.empty); + } + public TypeVar(TypeSymbol tsym, Type bound, Type lower, - List annos) { - super(tsym, annos); + TypeMetadata metadata) { + super(tsym, metadata); this.bound = bound; this.lower = lower; } @Override - public TypeVar annotatedType(List annos) { - return new TypeVar(tsym, bound, lower, annos); + public TypeVar clone(TypeMetadata md) { + return new TypeVar(tsym, bound, lower, md); } @Override @@ -1486,9 +1516,8 @@ Symbol owner, Type upper, Type lower, - WildcardType wildcard, - List annos) { - super(name, owner, lower, annos); + WildcardType wildcard) { + super(name, owner, lower); this.lower = Assert.checkNonNull(lower); this.bound = upper; this.wildcard = wildcard; @@ -1499,14 +1528,14 @@ Type upper, Type lower, WildcardType wildcard, - List annos) { - super(tsym, bound, lower, annos); + TypeMetadata metadata) { + super(tsym, bound, lower, metadata); this.wildcard = wildcard; } @Override - public CapturedType annotatedType(List annos) { - return new CapturedType(tsym, bound, bound, lower, wildcard, annos); + public CapturedType clone(TypeMetadata md) { + return new CapturedType(tsym, bound, bound, lower, wildcard, md); } @Override @@ -1534,12 +1563,18 @@ public static abstract class DelegatedType extends Type { public Type qtype; public TypeTag tag; + + public DelegatedType(TypeTag tag, Type qtype) { + this(tag, qtype, TypeMetadata.empty); + } + public DelegatedType(TypeTag tag, Type qtype, - List annos) { - super(qtype.tsym, annos); + TypeMetadata metadata) { + super(qtype.tsym, metadata); this.tag = tag; this.qtype = qtype; } + public TypeTag getTag() { return tag; } @DefinedBy(Api.LANGUAGE_MODEL) public String toString() { return qtype.toString(); } @@ -1563,13 +1598,13 @@ public List tvars; public ForAll(List tvars, Type qtype) { - super(FORALL, (MethodType)qtype, noAnnotations); + super(FORALL, (MethodType)qtype); this.tvars = tvars; } @Override - public ForAll annotatedType(List annos) { - throw new AssertionError("Cannot annotate forall type"); + public ForAll clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a forall type"); } @Override @@ -1685,7 +1720,7 @@ public UndetVar(TypeVar origin, Types types) { // This is a synthesized internal type, so we cannot annotate it. - super(UNDETVAR, origin, noAnnotations); + super(UNDETVAR, origin); bounds = new EnumMap<>(InferenceBound.class); List declaredBounds = types.getBounds(origin); declaredCount = declaredBounds.length(); @@ -1722,8 +1757,8 @@ } @Override - public UndetVar annotatedType(List annos) { - throw new AssertionError("Cannot annotate an UndetVar type"); + public UndetVar clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to an UndetVar type"); } @Override @@ -1882,12 +1917,12 @@ // Need to use List.nil(), because JCNoType constructor // gets called in static initializers in Type, where // noAnnotations is also defined. - super(null, List.nil()); + super(null, TypeMetadata.empty); } @Override - public JCNoType annotatedType(List annos) { - throw new AssertionError("Cannot annotate JCNoType"); + public JCNoType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a JCNoType"); } @Override @@ -1915,12 +1950,12 @@ public JCVoidType() { // Void cannot be annotated - super(null, noAnnotations); + super(null, TypeMetadata.empty); } @Override - public JCVoidType annotatedType(List annos) { - throw new AssertionError("Cannot annotate void type"); + public JCVoidType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a void type"); } @Override @@ -1950,12 +1985,12 @@ static class BottomType extends Type implements NullType { public BottomType() { // Bottom is a synthesized internal type, so it cannot be annotated - super(null, noAnnotations); + super(null, TypeMetadata.empty); } @Override - public BottomType annotatedType(List annos) { - throw new AssertionError("Cannot annotate bottom type"); + public BottomType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a bottom type"); } @Override @@ -1998,17 +2033,6 @@ private Type originalType = null; - public ErrorType(Type originalType, TypeSymbol tsym) { - this(originalType, tsym, noAnnotations); - } - - public ErrorType(Type originalType, TypeSymbol tsym, - List typeAnnotations) { - super(noType, List.nil(), null, typeAnnotations); - this.tsym = tsym; - this.originalType = (originalType == null ? noType : originalType); - } - public ErrorType(ClassSymbol c, Type originalType) { this(originalType, c); c.type = this; @@ -2016,9 +2040,22 @@ c.members_field = new Scope.ErrorScope(c); } + public ErrorType(Type originalType, TypeSymbol tsym) { + super(noType, List.nil(), null); + this.tsym = tsym; + this.originalType = (originalType == null ? noType : originalType); + } + + private ErrorType(Type originalType, TypeSymbol tsym, + TypeMetadata metadata) { + super(noType, List.nil(), null, metadata); + this.tsym = tsym; + this.originalType = (originalType == null ? noType : originalType); + } + @Override - public ErrorType annotatedType(List annos) { - return new ErrorType(originalType, tsym, annos); + public ErrorType clone(TypeMetadata md) { + return new ErrorType(originalType, tsym, md); } @Override @@ -2086,12 +2123,12 @@ public UnknownType() { // Unknown is a synthesized internal type, so it cannot be // annotated. - super(null, noAnnotations); + super(null, TypeMetadata.empty); } @Override - public UnknownType annotatedType(List annos) { - throw new AssertionError("Cannot annotate unknown type"); + public UnknownType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to an unknown type"); } @Override diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Thu Sep 25 16:21:30 2014 -0700 @@ -396,8 +396,7 @@ } if (type.hasTag(TypeTag.ARRAY)) { Type.ArrayType arType = (Type.ArrayType) type; - Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym, - Type.noAnnotations); + Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym); Type toreturn; if (type.isAnnotated()) { toreturn = tomodify.annotatedType(type.getAnnotationMirrors()); @@ -414,13 +413,11 @@ Type aelemtype = arType.elemtype; arType = (Type.ArrayType) aelemtype; ArrayType prevToMod = tomodify; - tomodify = new Type.ArrayType(null, arType.tsym, - Type.noAnnotations); + tomodify = new Type.ArrayType(null, arType.tsym); prevToMod.elemtype = tomodify.annotatedType(arType.elemtype.getAnnotationMirrors()); } else { arType = (Type.ArrayType) arType.elemtype; - tomodify.elemtype = new Type.ArrayType(null, arType.tsym, - Type.noAnnotations); + tomodify.elemtype = new Type.ArrayType(null, arType.tsym); tomodify = (Type.ArrayType) tomodify.elemtype; } arTree = arrayTypeTree(arTree.elemtype); @@ -582,7 +579,7 @@ } else { ClassType ret = new ClassType(t.getEnclosingType().accept(this, s), t.typarams_field, t.tsym, - t.getAnnotationMirrors()); + t.getMetadata()); ret.all_interfaces_field = t.all_interfaces_field; ret.allparams_field = t.allparams_field; ret.interfaces_field = t.interfaces_field; @@ -600,7 +597,7 @@ @Override public Type visitArrayType(ArrayType t, List s) { ArrayType ret = new ArrayType(t.elemtype.accept(this, s), t.tsym, - t.getAnnotationMirrors()); + t.getMetadata()); return ret; } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeMetadata.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/TypeMetadata.java Thu Sep 25 16:21:30 2014 -0700 @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2014, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javac.code; + +import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.util.List; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * A super-interface for all type metadata elements. Metadata classes + * can be created for any metadata on types with the following + * properties: + * + *
    + *
  • They have a default value (preferably empty)
  • + *
  • The field is usually the default value
  • + *
  • Different values of the field are visible, and denote distinct + * types
  • + *
+ */ +public class TypeMetadata { + + public static final TypeMetadata empty = new TypeMetadata(); + private final EnumMap contents; + + private TypeMetadata() { + contents = new EnumMap(Element.Kind.class); + } + + public TypeMetadata(final Element elem) { + this(); + contents.put(elem.kind(), elem); + } + + public TypeMetadata(final TypeMetadata other) { + contents = other.contents.clone(); + } + + public TypeMetadata copy() { + return new TypeMetadata(this); + } + + public TypeMetadata combine(final Element elem) { + final TypeMetadata out = new TypeMetadata(this); + final Element.Kind key = elem.kind(); + if (contents.containsKey(key)) { + out.add(key, this.contents.get(key).combine(elem)); + } else { + out.add(key, elem); + } + return out; + } + + public TypeMetadata combine(final TypeMetadata other) { + final TypeMetadata out = new TypeMetadata(); + final Set keys = new HashSet<>(this.contents.keySet()); + keys.addAll(other.contents.keySet()); + + for(final Element.Kind key : keys) { + if (this.contents.containsKey(key)) { + if (other.contents.containsKey(key)) { + out.add(key, this.contents.get(key).combine(other.contents.get(key))); + } else { + out.add(key, this.contents.get(key)); + } + } else if (other.contents.containsKey(key)) { + out.add(key, other.contents.get(key)); + } + } + return out; + } + + public Element get(final Element.Kind kind) { + return contents.get(kind); + } + + public boolean isEmpty() { + return contents.isEmpty(); + } + + private void add(final Element.Kind kind, final Element elem) { + contents.put(kind, elem); + } + + private void addAll(final Map m) { + contents.putAll(m); + } + + public interface Element { + + public enum Kind { + ANNOTATIONS; + } + + /** + * Get the kind of metadata this object represents + */ + public Kind kind(); + + /** + * Combine this type metadata with another metadata of the + * same kind. + * + * @param other The metadata with which to combine this one. + * @return The combined metadata. + */ + public Element combine(Element other); + } + + /** + * A type metadata object holding type annotations. + */ + public static class Annotations implements Element { + private final List annos; + + public Annotations(final List annos) { + this.annos = annos; + } + + /** + * Get the type annotations contained in this metadata. + * + * @return The annotations. + */ + public List getAnnotations() { + return annos; + } + + @Override + public Annotations combine(final Element other) { + // Temporary: we should append the lists, but that won't + // work with type annotations today. Instead, we replace + // the list. + return new Annotations(((Annotations) other).annos); + } + + @Override + public Kind kind() { return Kind.ANNOTATIONS; } + + @Override + public String toString() { return "ANNOTATIONS { " + annos + " }"; } + } + +} diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Thu Sep 25 16:21:30 2014 -0700 @@ -258,8 +258,7 @@ ListBuffer qs = new ListBuffer<>(); for (List iter = opens; iter.nonEmpty(); iter = iter.tail) { qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass, (TypeVar) iter.head, - Type.noAnnotations)); + syms.boundClass, (TypeVar) iter.head)); } res = subst(res, opens, qs.toList()); } @@ -631,8 +630,7 @@ csym.members_field = WriteableScope.create(csym); MethodSymbol instDescSym = new MethodSymbol(descSym.flags(), descSym.name, descType, csym); csym.members_field.enter(instDescSym); - Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym, - Type.noAnnotations); + Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym); ctype.supertype_field = syms.objectType; ctype.interfaces_field = targets; csym.type = ctype; @@ -881,13 +879,13 @@ s = new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - s.getAnnotationMirrors()); + s.getMetadata()); changed = true; } else if (s != orig) { s = new WildcardType(wildUpperBound(s), BoundKind.EXTENDS, syms.boundClass, - s.getAnnotationMirrors()); + s.getMetadata()); changed = true; } rewrite.append(s); @@ -1916,7 +1914,7 @@ if (t.hasTag(VOID) || t.hasTag(PACKAGE)) { Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString()); } - return new ArrayType(t, syms.arrayClass, Type.noAnnotations); + return new ArrayType(t, syms.arrayClass); } // @@ -2182,40 +2180,50 @@ } // where private SimpleVisitor erasure = new SimpleVisitor() { + private Type combineMetadata(final Type ty, + final TypeMetadata md) { + if (!md.isEmpty()) { + switch (ty.getKind()) { + default: return ty.clone(ty.metadata.combine(md)); + case OTHER: + case UNION: + case INTERSECTION: + case PACKAGE: + case EXECUTABLE: + case NONE: + case VOID: + case ERROR: + return ty; + } + } else { + return ty; + } + } + public Type visitType(Type t, Boolean recurse) { if (t.isPrimitive()) return t; /*fast special case*/ else { - final List annos = t.getAnnotationMirrors(); Type erased = t.map(recurse ? erasureRecFun : erasureFun); - if (!annos.isEmpty()) { - erased = erased.annotatedType(annos); - } - return erased; + return combineMetadata(erased, t.getMetadata()); } } @Override public Type visitClassType(ClassType t, Boolean recurse) { Type erased = t.tsym.erasure(Types.this); - List annos = t.getAnnotationMirrors(); if (recurse) { - erased = new ErasedClassType(erased.getEnclosingType(),erased.tsym); + erased = new ErasedClassType(erased.getEnclosingType(),erased.tsym, t.getMetadata()); + return erased; + } else { + return combineMetadata(erased, t.getMetadata()); } - if (!annos.isEmpty()) { - erased = erased.annotatedType(annos); - } - return erased; } @Override public Type visitTypeVar(TypeVar t, Boolean recurse) { - final List annos = t.getAnnotationMirrors(); Type erased = erasure(t.bound, recurse); - if (!annos.isEmpty()) { - erased = erased.annotatedType(annos); - } - return erased; + return combineMetadata(erased, t.getMetadata()); } @Override @@ -2547,7 +2555,7 @@ Type outer1 = classBound(t.getEnclosingType()); if (outer1 != t.getEnclosingType()) return new ClassType(outer1, t.getTypeArguments(), t.tsym, - t.getAnnotationMirrors()); + t.getMetadata()); else return t; } @@ -2967,7 +2975,7 @@ return t; else return new ClassType(outer1, typarams1, t.tsym, - t.getAnnotationMirrors()); + t.getMetadata()); } else { Type st = subst(supertype(t)); List is = subst(interfaces(t)); @@ -2989,7 +2997,7 @@ if (t.isExtendsBound() && bound.isExtendsBound()) bound = wildUpperBound(bound); return new WildcardType(bound, t.kind, syms.boundClass, - t.bound, t.getAnnotationMirrors()); + t.bound, t.getMetadata()); } } @@ -2999,7 +3007,7 @@ if (elemtype == t.elemtype) return t; else - return new ArrayType(elemtype, t.tsym, t.getAnnotationMirrors()); + return new ArrayType(elemtype, t.tsym, t.getMetadata()); } @Override @@ -3050,7 +3058,7 @@ // create new type variables without bounds for (Type t : tvars) { newTvars.append(new TypeVar(t.tsym, null, syms.botType, - t.getAnnotationMirrors())); + t.getMetadata())); } // the new bounds should use the new type variables in place // of the old @@ -3077,7 +3085,7 @@ else { // create new type variable without bounds TypeVar tv = new TypeVar(t.tsym, null, syms.botType, - t.getAnnotationMirrors()); + t.getMetadata()); // the new bound should use the new type variable in place // of the old tv.bound = subst(bound1, List.of(t), List.of(tv)); @@ -3118,7 +3126,7 @@ return tvars1; } private static final Mapping newInstanceFun = new Mapping("newInstanceFun") { - public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound(), t.getAnnotationMirrors()); } + public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound(), t.getMetadata()); } }; // @@ -3451,14 +3459,12 @@ m = new WildcardType(lub(wildUpperBound(act1.head), wildUpperBound(act2.head)), BoundKind.EXTENDS, - syms.boundClass, - Type.noAnnotations); + syms.boundClass); mergeCache.remove(pair); } else { m = new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass, - Type.noAnnotations); + syms.boundClass); } merged.append(m.withTypeVar(typarams.head)); } @@ -3470,7 +3476,7 @@ // There is no spec detailing how type annotations are to // be inherited. So set it to noAnnotations for now return new ClassType(class1.getEnclosingType(), merged.toList(), - class1.tsym, Type.noAnnotations); + class1.tsym); } /** @@ -3588,8 +3594,7 @@ } } // lub(A[], B[]) is lub(A, B)[] - return new ArrayType(lub(elements), syms.arrayClass, - Type.noAnnotations); + return new ArrayType(lub(elements), syms.arrayClass); case CLASS_BOUND: // calculate lub(A, B) @@ -3999,7 +4004,7 @@ if (captured) return new ClassType(cls.getEnclosingType(), S, cls.tsym, - cls.getAnnotationMirrors()); + cls.getMetadata()); else return t; } @@ -4015,8 +4020,7 @@ syms.noSymbol, bound, syms.botType, - (WildcardType)t, - Type.noAnnotations)); + (WildcardType)t)); } else { result.append(t); } @@ -4375,14 +4379,12 @@ return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal, - Type.noAnnotations); + formal); } else { return new WildcardType(bound, BoundKind.EXTENDS, syms.boundClass, - formal, - Type.noAnnotations); + formal); } } @@ -4399,14 +4401,12 @@ return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal, - Type.noAnnotations); + formal); } else { return new WildcardType(bound, BoundKind.SUPER, syms.boundClass, - formal, - Type.noAnnotations); + formal); } } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Sep 25 16:21:30 2014 -0700 @@ -1797,10 +1797,9 @@ return new ClassType(restype.getEnclosingType(), List.of(new WildcardType(types.erasure(qualifierType), BoundKind.EXTENDS, - syms.boundClass, - Type.noAnnotations)), + syms.boundClass)), restype.tsym, - restype.getAnnotationMirrors()); + restype.getMetadata()); } else { return restype; } @@ -1970,7 +1969,7 @@ ClassType site = new ClassType(clazztype.getEnclosingType(), clazztype.tsym.type.getTypeArguments(), clazztype.tsym, - clazztype.getAnnotationMirrors()); + clazztype.getMetadata()); Env diamondEnv = localEnv.dup(tree); diamondEnv.info.selectSuper = cdef != null; @@ -2189,8 +2188,7 @@ owntype = elemtype; for (List l = tree.dims; l.nonEmpty(); l = l.tail) { attribExpr(l.head, localEnv, syms.intType); - owntype = new ArrayType(owntype, syms.arrayClass, - Type.noAnnotations); + owntype = new ArrayType(owntype, syms.arrayClass); } } else { // we are seeing an untyped aggregate { ... } @@ -2207,8 +2205,7 @@ } if (tree.elems != null) { attribExprs(tree.elems, localEnv, elemtype); - owntype = new ArrayType(elemtype, syms.arrayClass, - Type.noAnnotations); + owntype = new ArrayType(elemtype, syms.arrayClass); } if (!types.isReifiable(elemtype)) log.error(tree.pos(), "generic.array.creation"); @@ -3195,8 +3192,9 @@ elt = ((ArrayType)elt).elemtype; if (elt.hasTag(TYPEVAR)) { log.error(tree.pos(), "type.var.cant.be.deref"); - result = types.createErrorType(tree.type); - return; + result = tree.type = types.createErrorType(tree.name, site.tsym, site); + tree.sym = tree.type.tsym; + return ; } } @@ -3508,7 +3506,7 @@ if (normOuter != ownOuter) owntype = new ClassType( normOuter, List.nil(), owntype.tsym, - owntype.getAnnotationMirrors()); + owntype.getMetadata()); } } break; @@ -3829,7 +3827,7 @@ public void visitTypeArray(JCArrayTypeTree tree) { Type etype = attribType(tree.elemtype, env); - Type type = new ArrayType(etype, syms.arrayClass, Type.noAnnotations); + Type type = new ArrayType(etype, syms.arrayClass); result = check(tree, type, TYP, resultInfo); } @@ -3878,7 +3876,7 @@ } } owntype = new ClassType(clazzOuter, actuals, clazztype.tsym, - clazztype.getAnnotationMirrors()); + clazztype.getMetadata()); } else { if (formals.length() != 0) { log.error(tree.pos(), "wrong.number.type.args", @@ -4029,8 +4027,7 @@ : attribType(tree.inner, env); result = check(tree, new WildcardType(chk.checkRefType(tree.pos(), type), tree.kind.kind, - syms.boundClass, - Type.noAnnotations), + syms.boundClass), TYP, resultInfo); } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Thu Sep 25 16:21:30 2014 -0700 @@ -137,15 +137,15 @@ SpeculativeCache speculativeCache; DeferredType(JCExpression tree, Env env) { - super(null, noAnnotations); + super(null, TypeMetadata.empty); this.tree = tree; this.env = attr.copyEnv(env); this.speculativeCache = new SpeculativeCache(); } @Override - public DeferredType annotatedType(List typeAnnotations) { - throw new AssertionError("Cannot annotate a deferred type"); + public DeferredType clone(TypeMetadata md) { + throw new AssertionError("Cannot add metadata to a deferred type"); } @Override diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Thu Sep 25 16:21:30 2014 -0700 @@ -418,7 +418,7 @@ List upperBounds = uv.getBounds(InferenceBound.UPPER); if (Type.containsAny(upperBounds, vars)) { TypeSymbol fresh_tvar = new TypeVariableSymbol(Flags.SYNTHETIC, uv.qtype.tsym.name, null, uv.qtype.tsym.owner); - fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null, Type.noAnnotations); + fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null); todo.append(uv); uv.inst = fresh_tvar.type; } else if (upperBounds.nonEmpty()) { @@ -1562,8 +1562,7 @@ infer.syms.botType; CapturedType prevCaptured = (CapturedType)uv.qtype; return new CapturedType(prevCaptured.tsym.name, prevCaptured.tsym.owner, - upper, lower, prevCaptured.wildcard, - Type.noAnnotations); + upper, lower, prevCaptured.wildcard); } }; diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java Thu Sep 25 16:21:30 2014 -0700 @@ -451,8 +451,7 @@ ClassSymbol outerCacheClass = outerCacheClass(); this.mapVar = new VarSymbol(STATIC | SYNTHETIC | FINAL, varName, - new ArrayType(syms.intType, syms.arrayClass, - Type.noAnnotations), + new ArrayType(syms.intType, syms.arrayClass), outerCacheClass); enterSynthetic(pos, mapVar, outerCacheClass.members()); } @@ -493,8 +492,7 @@ syms.lengthVar); JCExpression mapVarInit = make .NewArray(make.Type(syms.intType), List.of(size), null) - .setType(new ArrayType(syms.intType, syms.arrayClass, - Type.noAnnotations)); + .setType(new ArrayType(syms.intType, syms.arrayClass)); // try { $SwitchMap$Color[red.ordinal()] = 1; } catch (java.lang.NoSuchFieldError ex) {} ListBuffer stmts = new ListBuffer<>(); @@ -1966,7 +1964,7 @@ List.of(make.Literal(INT, 0).setType(syms.intType)), null); newcache.type = new ArrayType(types.erasure(outerCacheClass.type), - syms.arrayClass, Type.noAnnotations); + syms.arrayClass); // forNameSym := java.lang.Class.forName( // String s,boolean init,ClassLoader loader) @@ -2506,8 +2504,7 @@ Name valuesName = names.fromString(target.syntheticNameChar() + "VALUES"); while (tree.sym.members().findFirst(valuesName) != null) // avoid name clash valuesName = names.fromString(valuesName + "" + target.syntheticNameChar()); - Type arrayType = new ArrayType(types.erasure(tree.type), - syms.arrayClass, Type.noAnnotations); + Type arrayType = new ArrayType(types.erasure(tree.type), syms.arrayClass); VarSymbol valuesVar = new VarSymbol(PRIVATE|FINAL|STATIC|SYNTHETIC, valuesName, arrayType, @@ -3077,8 +3074,7 @@ JCNewArray boxedArgs = make.NewArray(make.Type(varargsElement), List.nil(), elems.toList()); - boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass, - Type.noAnnotations); + boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass); result.append(boxedArgs); } else { if (args.length() != 1) throw new AssertionError(args); diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java Thu Sep 25 16:21:30 2014 -0700 @@ -403,8 +403,7 @@ * to the symbol table. */ private void addEnumMembers(JCClassDecl tree, Env env) { - JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass, - Type.noAnnotations)); + JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass)); // public static T[] values() { return ???; } JCMethodDecl values = make. @@ -1234,13 +1233,12 @@ ClassType ct = (ClassType) sym.type; Assert.check(ct.typarams_field.isEmpty()); if (n == 1) { - TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType, - Type.noAnnotations); + TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType); ct.typarams_field = ct.typarams_field.prepend(v); } else { for (int i = n; i > 0; i--) { TypeVar v = new TypeVar(names.fromString("T" + i), sym, - syms.botType, Type.noAnnotations); + syms.botType); ct.typarams_field = ct.typarams_field.prepend(v); } } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Sep 25 16:21:30 2014 -0700 @@ -3225,7 +3225,7 @@ List typeargtypes, MethodResolutionPhase maxPhase) { super(referenceTree, names.init, site, argtypes, typeargtypes, maxPhase); if (site.isRaw()) { - this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym, site.getAnnotationMirrors()); + this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym, site.getMetadata()); needsInference = true; } } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Sep 25 16:21:30 2014 -0700 @@ -543,18 +543,16 @@ case '+': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.EXTENDS, syms.boundClass, - Type.noAnnotations); + return new WildcardType(t, BoundKind.EXTENDS, syms.boundClass); } case '*': sigp++; return new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass, Type.noAnnotations); + syms.boundClass); case '-': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.SUPER, syms.boundClass, - Type.noAnnotations); + return new WildcardType(t, BoundKind.SUPER, syms.boundClass); } case 'B': sigp++; @@ -599,8 +597,7 @@ return syms.booleanType; case '[': sigp++; - return new ArrayType(sigToType(), syms.arrayClass, - Type.noAnnotations); + return new ArrayType(sigToType(), syms.arrayClass); case '(': sigp++; List argtypes = sigToTypes(')'); @@ -655,8 +652,7 @@ try { return (outer == Type.noType) ? t.erasure(types) : - new ClassType(outer, List.nil(), t, - Type.noAnnotations); + new ClassType(outer, List.nil(), t); } finally { sbp = startSbp; } @@ -666,8 +662,7 @@ ClassSymbol t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, sigToTypes('>'), t, - Type.noAnnotations) { + outer = new ClassType(outer, sigToTypes('>'), t) { boolean completed = false; @Override @DefinedBy(Api.LANGUAGE_MODEL) public Type getEnclosingType() { @@ -730,8 +725,7 @@ t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, List.nil(), t, - Type.noAnnotations); + outer = new ClassType(outer, List.nil(), t); } signatureBuffer[sbp++] = (byte)'$'; continue; @@ -794,8 +788,7 @@ Name name = names.fromUtf(signature, start, sigp - start); TypeVar tvar; if (sigEnterPhase) { - tvar = new TypeVar(name, currentOwner, syms.botType, - Type.noAnnotations); + tvar = new TypeVar(name, currentOwner, syms.botType); typevars.enter(tvar.tsym); } else { tvar = (TypeVar)findTypeVar(name); @@ -834,8 +827,7 @@ // we don't know for sure if this owner is correct. It could // be a method and there is no way to tell before reading the // enclosing method attribute. - TypeVar t = new TypeVar(name, currentOwner, syms.botType, - Type.noAnnotations); + TypeVar t = new TypeVar(name, currentOwner, syms.botType); missingTypeVariables = missingTypeVariables.prepend(t); // System.err.println("Missing type var " + name); return t; diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/UninitializedType.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/UninitializedType.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/UninitializedType.java Thu Sep 25 16:21:30 2014 -0700 @@ -43,24 +43,24 @@ public static UninitializedType uninitializedThis(Type qtype) { return new UninitializedType(UNINITIALIZED_THIS, qtype, -1, - qtype.getAnnotationMirrors()); + qtype.getMetadata()); } public static UninitializedType uninitializedObject(Type qtype, int offset) { return new UninitializedType(UNINITIALIZED_OBJECT, qtype, offset, - qtype.getAnnotationMirrors()); + qtype.getMetadata()); } public final int offset; // PC where allocation took place private UninitializedType(TypeTag tag, Type qtype, int offset, - List typeAnnotations) { - super(tag, qtype, typeAnnotations); + TypeMetadata metadata) { + super(tag, qtype, metadata); this.offset = offset; } @Override - public UninitializedType annotatedType(List typeAnnotations) { - return new UninitializedType(tag, qtype, offset, typeAnnotations); + public UninitializedType clone(final TypeMetadata md) { + return new UninitializedType(tag, qtype, offset, md); } Type initializedType() { diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacTypes.java Thu Sep 25 16:21:30 2014 -0700 @@ -184,8 +184,7 @@ case PACKAGE: throw new IllegalArgumentException(componentType.toString()); } - return new Type.ArrayType((Type) componentType, syms.arrayClass, - Type.noAnnotations); + return new Type.ArrayType((Type) componentType, syms.arrayClass); } @DefinedBy(Api.LANGUAGE_MODEL) @@ -211,8 +210,7 @@ case DECLARED: case ERROR: case TYPEVAR: - return new Type.WildcardType(bound, bkind, syms.boundClass, - Type.noAnnotations); + return new Type.WildcardType(bound, bkind, syms.boundClass); default: throw new IllegalArgumentException(bound.toString()); } @@ -264,8 +262,7 @@ } // TODO: Would like a way to check that type args match formals. - return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym, - Type.noAnnotations); + return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym); } /** diff -r 1366778aa6f3 -r 73a2b5540efc langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Sep 25 16:21:30 2014 -0700 @@ -1089,8 +1089,7 @@ for (ClassSymbol cs : symtab.classes.values()) { if (cs.classfile != null || cs.kind == Kinds.ERR) { cs.reset(); - cs.type = new ClassType(cs.type.getEnclosingType(), - null, cs, Type.noAnnotations); + cs.type = new ClassType(cs.type.getEnclosingType(), null, cs); if (cs.completer == null) { cs.completer = initialCompleter; } diff -r 1366778aa6f3 -r 73a2b5540efc langtools/test/tools/javac/lambda/T8057794.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/T8057794.java Thu Sep 25 16:21:30 2014 -0700 @@ -0,0 +1,12 @@ +/** + * @test /nodynamiccopyright/ + * @bug 8057794 + * @summary The tree for TypeVar.class does not have a type set, which leads to an NPE when + * checking if deferred attribution is needed + * @compile/fail/ref=T8057794.out -XDrawDiagnostics T8057794.java + */ +class T8057794 { + void t() { + System.out.println(T.class.getSimpleName()); + } +} diff -r 1366778aa6f3 -r 73a2b5540efc langtools/test/tools/javac/lambda/T8057794.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/lambda/T8057794.out Thu Sep 25 16:21:30 2014 -0700 @@ -0,0 +1,2 @@ +T8057794.java:10:29: compiler.err.type.var.cant.be.deref +1 error diff -r 1366778aa6f3 -r 73a2b5540efc langtools/test/tools/javac/types/TypeHarness.java --- a/langtools/test/tools/javac/types/TypeHarness.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/test/tools/javac/types/TypeHarness.java Thu Sep 25 16:21:30 2014 -0700 @@ -255,8 +255,7 @@ public ClassType Class(long flags, Type... typeArgs) { ClassSymbol csym = new ClassSymbol(flags, syntheticName(), predef.noSymbol); - csym.type = new ClassType(Type.noType, List.from(typeArgs), csym, - Type.noAnnotations); + csym.type = new ClassType(Type.noType, List.from(typeArgs), csym); ((ClassType)csym.type).supertype_field = predef.objectType; return (ClassType)csym.type; } @@ -302,7 +301,7 @@ } public ArrayType Array(Type elemType) { - return new ArrayType(elemType, predef.arrayClass, Type.noAnnotations); + return new ArrayType(elemType, predef.arrayClass); } public TypeVar TypeVariable() { @@ -311,16 +310,16 @@ public TypeVar TypeVariable(Type bound) { TypeSymbol tvsym = new TypeVariableSymbol(0, syntheticName(), null, predef.noSymbol); - tvsym.type = new TypeVar(tvsym, bound, null, Type.noAnnotations); + tvsym.type = new TypeVar(tvsym, bound, null); return (TypeVar)tvsym.type; } public WildcardType Wildcard(BoundKind bk, Type bound) { - return new WildcardType(bound, bk, predef.boundClass, Type.noAnnotations); + return new WildcardType(bound, bk, predef.boundClass); } public CapturedType CapturedVariable(Type upper, Type lower) { - return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null, Type.noAnnotations); + return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null); } public ClassType Intersection(Type classBound, Type... intfBounds) { diff -r 1366778aa6f3 -r 73a2b5540efc langtools/test/tools/javac/versions/Versions.java --- a/langtools/test/tools/javac/versions/Versions.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/test/tools/javac/versions/Versions.java Thu Sep 25 16:21:30 2014 -0700 @@ -101,11 +101,16 @@ checksrc19("-target 1.9"); checksrc19("-target 9"); - fail("-source 7", "-target 1.6", "X.java"); - fail("-source 8", "-target 1.6", "X.java"); - fail("-source 8", "-target 1.7", "X.java"); - fail("-source 9", "-target 1.7", "X.java"); - fail("-source 9", "-target 1.8", "X.java"); + fail("-source 7", "-target 1.6", "Base.java"); + fail("-source 8", "-target 1.6", "Base.java"); + fail("-source 8", "-target 1.7", "Base.java"); + fail("-source 9", "-target 1.7", "Base.java"); + fail("-source 9", "-target 1.8", "Base.java"); + + fail("-source 1.5", "-target 1.5", "Base.java"); + fail("-source 1.4", "-target 1.4", "Base.java"); + fail("-source 1.3", "-target 1.3", "Base.java"); + fail("-source 1.2", "-target 1.2", "Base.java"); if (failedCases > 0) { System.err.println("failedCases = " + String.valueOf(failedCases)); @@ -114,8 +119,6 @@ } - - protected void printargs(String fname,String... args) { System.out.printf("test: %s", fname); for (String onearg : args) { @@ -148,7 +151,7 @@ } } - boolean creturn = compile("X.java", jcargs); + boolean creturn = compile("Base.java", jcargs); if (!creturn) { // compilation errors note and return.. assume no class file System.err.println("check: Compilation Failed"); @@ -156,7 +159,7 @@ System.err.println("\t arguments:\t" + jcargs); failedCases++; - } else if (!checkClassFileVersion("X.class", major)) { + } else if (!checkClassFileVersion("Base.class", major)) { failedCases++; } } @@ -166,9 +169,9 @@ int asize = args.length; String[] newargs = new String[asize + 1]; System.arraycopy(args, 0, newargs, 0, asize); - newargs[asize] = "X.java"; + newargs[asize] = "Base.java"; pass(newargs); - newargs[asize] = "Y.java"; + newargs[asize] = "New17.java"; fail(newargs); } @@ -177,20 +180,26 @@ int asize = args.length; String[] newargs = new String[asize+1]; System.arraycopy(args, 0, newargs,0 , asize); - newargs[asize] = "X.java"; + newargs[asize] = "New17.java"; pass(newargs); - newargs[asize] = "Y.java"; - pass(newargs); + newargs[asize] = "New18.java"; + fail(newargs); } protected void checksrc18(String... args) { printargs("checksrc18", args); - checksrc17(args); + int asize = args.length; + String[] newargs = new String[asize+1]; + System.arraycopy(args, 0, newargs,0 , asize); + newargs[asize] = "New17.java"; + pass(newargs); + newargs[asize] = "New18.java"; + pass(newargs); } protected void checksrc19(String... args) { printargs("checksrc19", args); - checksrc17(args); + checksrc18(args); } protected void pass(String... args) { @@ -288,25 +297,36 @@ } } + protected void writeSourceFile(String fileName, String body) throws IOException{ + try (Writer fw = new FileWriter(fileName)) { + fw.write(body); + } + } protected void genSourceFiles() throws IOException{ /* Create a file that executes with all supported versions. */ - File fsource = new File("X.java"); - try (Writer fw = new FileWriter(fsource)) { - fw.write("public class X { }\n"); - fw.flush(); - } + writeSourceFile("Base.java","public class Base { }\n"); + + /* + * Create a file with a new feature in 1.7, not in 1.6 : "<>" + */ + writeSourceFile("New17.java", + "import java.util.List;\n" + + "import java.util.ArrayList;\n" + + "class New17 { List s = new ArrayList<>(); }\n" + ); - /* Create a file with feature not supported in deprecated version. - * New feature for 1.7, does not exist in 1.6. + /* + * Create a file with a new feature in 1.8, not in 1.7 : lambda */ - fsource = new File("Y.java"); - try (Writer fw = new FileWriter(fsource)) { - fw.write("import java.util.List;\n"); - fw.write("import java.util.ArrayList;\n"); - fw.write("class Z { List s = new ArrayList<>(); }\n"); - fw.flush(); - } + writeSourceFile("New18.java", + "public class New18 { \n" + + " void m() { \n" + + " new Thread(() -> { }); \n" + + " } \n" + + "} \n" + ); + } protected boolean checkClassFileVersion diff -r 1366778aa6f3 -r 73a2b5540efc langtools/test/tools/javadoc/6227454/Test.java --- a/langtools/test/tools/javadoc/6227454/Test.java Thu Sep 25 12:40:30 2014 -0700 +++ b/langtools/test/tools/javadoc/6227454/Test.java Thu Sep 25 16:21:30 2014 -0700 @@ -38,28 +38,29 @@ } void run() throws Exception { - String docType = ""; - String headTag = "Title "; - test(docType+"ABC XYZ"); - test(docType+"ABC XYZ"); - test(docType+"ABC XYZ"); - test(docType+"ABC XYZ"); - test(docType+"ABC XYZ"); - test(docType+""+headTag+" ABC XYZ", "Body tag missing from HTML"); - test(docType+"ABC XYZ ", "Close body tag missing from HTML"); - test(docType+""+headTag+" ABC XYZ ", "Body tag missing from HTML"); - test(docType+"ABC" + bigText(8192, 40) + "XYZ"); + test("ABC XYZ"); + test("ABC XYZ"); + test("ABC XYZ"); + test("ABC XYZ"); + test("ABC XYZ"); + test(" ABC XYZ", "Body tag missing from HTML"); + test("ABC XYZ ", "Close body tag missing from HTML"); + test(" ABC XYZ ", "Body tag missing from HTML"); + test("ABC" + bigText(8192, 40) + "XYZ"); if (errors > 0) throw new Exception(errors + " errors occurred"); } - void test(String text) throws IOException { - test(text, null); + void test(String body) throws IOException { + test(body, null); } - void test(String text, String expectError) throws IOException { + void test(String body, String expectError) throws IOException { + String docType = ""; + String headTag = "Title "; + String text = docType + "" + headTag + body + ""; testNum++; System.err.println("test " + testNum); File file = writeFile("overview" + testNum + ".html", text);