# HG changeset patch # User jlahoda # Date 1518621022 -3600 # Wed Feb 14 16:10:22 2018 +0100 # Node ID ecf46057e6396af8b7d8e89351330555baac2fdf # Parent bbe58214537b55f4e93faf0077338f382b116af5 imported patch 8187950-ext diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -30,6 +30,8 @@ import java.text.BreakIterator; import java.util.Collections; import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -180,6 +182,8 @@ private ParserFactory parser; private Symtab syms; + private final Map extraType2OriginalMap = new IdentityHashMap<>(); + // called reflectively from Trees.instance(CompilationTask task) public static JavacTrees instance(JavaCompiler.CompilationTask task) { if (!(task instanceof BasicJavacTask)) @@ -1083,6 +1087,18 @@ if (errorType instanceof com.sun.tools.javac.code.Type.ErrorType) { return ((com.sun.tools.javac.code.Type.ErrorType)errorType).getOriginalType(); } + if (errorType instanceof com.sun.tools.javac.code.Type.ClassType && + errorType.getKind() == TypeKind.ERROR) { + ClassType ct = (ClassType) errorType; + return extraType2OriginalMap.computeIfAbsent(ct, tt -> new ClassType(ct.getEnclosingType(), ct.typarams_field, ct.tsym, ct.getMetadata()) { + @Override + public Type baseType() { return ct; } + @Override + public TypeKind getKind() { + return TypeKind.DECLARED; + } + }); + } return com.sun.tools.javac.code.Type.noType; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java @@ -930,7 +930,8 @@ } } - public static class ClassType extends Type implements DeclaredType { + public static class ClassType extends Type implements DeclaredType, + javax.lang.model.type.ErrorType { /** The enclosing type of this type. If this is the type of an inner * class, outer_field refers to the type of its enclosing @@ -1141,7 +1142,8 @@ @DefinedBy(Api.LANGUAGE_MODEL) public TypeKind getKind() { - return TypeKind.DECLARED; + tsym.apiComplete(); + return tsym.kind == TYP ? TypeKind.DECLARED : TypeKind.ERROR; } @DefinedBy(Api.LANGUAGE_MODEL) diff --git a/test/langtools/tools/javac/processing/model/completionfailure/MissingClassFile.java b/test/langtools/tools/javac/processing/model/completionfailure/MissingClassFile.java --- a/test/langtools/tools/javac/processing/model/completionfailure/MissingClassFile.java +++ b/test/langtools/tools/javac/processing/model/completionfailure/MissingClassFile.java @@ -44,6 +44,7 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.*; import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.ErrorType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.tools.JavaCompiler; @@ -56,6 +57,7 @@ import com.sun.source.util.TaskEvent; import com.sun.source.util.TaskListener; +import com.sun.tools.javac.api.JavacTrees; @SupportedAnnotationTypes("*") public class MissingClassFile { @@ -157,10 +159,13 @@ "pkg.A"); TypeMirror superclass = a.getSuperclass(); verifyTypeMirror(t, superclass); - assertEquals(TypeKind.DECLARED, superclass.getKind()); + assertEquals(TypeKind.ERROR, superclass.getKind()); Element superclassEl = ((DeclaredType) superclass).asElement(); assertEquals(ElementKind.CLASS, superclassEl.getKind()); assertEquals(TypeKind.ERROR, superclassEl.asType().getKind()); + TypeMirror originalType = JavacTrees.instance(t).getOriginalType((ErrorType) superclass); + assertEquals(TypeKind.DECLARED, originalType.getKind()); + assertEquals(superclassEl, ((DeclaredType) originalType).asElement()); }); doTestCombo("interface Test {" + "}", @@ -173,10 +178,13 @@ TypeElement a = t.getElements().getTypeElement("pkg.A"); TypeMirror superintf = a.getInterfaces().get(0); verifyTypeMirror(t, superintf); - assertEquals(TypeKind.DECLARED, superintf.getKind()); + assertEquals(TypeKind.ERROR, superintf.getKind()); Element superintfEl = ((DeclaredType) superintf).asElement(); //superintfEl.getKind() may be either CLASS or INTERFACE, depending on which class is missing assertEquals(TypeKind.ERROR, superintfEl.asType().getKind()); + TypeMirror originalType = JavacTrees.instance(t).getOriginalType((ErrorType) superintf); + assertEquals(TypeKind.DECLARED, originalType.getKind()); + assertEquals(superintfEl, ((DeclaredType) originalType).asElement()); }); doTestCombo("class Test {" + "}",