src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java
changeset 49197 cc2673fa8c20
parent 48028 9e022f580a9d
child 50287 64c880300d9b
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java	Fri Mar 09 11:36:12 2018 +0800
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java	Fri Mar 09 09:42:10 2018 +0100
@@ -30,7 +30,9 @@
 import java.text.BreakIterator;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
+import java.util.WeakHashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -180,6 +182,8 @@
     private ParserFactory parser;
     private Symtab syms;
 
+    private final Map<Type, Type> extraType2OriginalMap = new WeakHashMap<>();
+
     // called reflectively from Trees.instance(CompilationTask task)
     public static JavacTrees instance(JavaCompiler.CompilationTask task) {
         if (!(task instanceof BasicJavacTask))
@@ -1083,6 +1087,20 @@
         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;
     }