--- 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;
}