langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java
changeset 34750 36d62753f5da
parent 33362 65ec6de1d6b4
child 43134 006808ae5f6e
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java	Wed Jul 05 21:07:43 2017 +0200
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java	Fri Dec 11 11:20:10 2015 -0800
@@ -41,15 +41,15 @@
  * Print types in source form.
  */
 class TypePrinter extends Printer {
+    private static final String OBJECT = "Object";
 
     private final JavacMessages messages;
     private final BinaryOperator<String> fullClassNameAndPackageToClass;
-    private final Type typeToPrint;
+    private boolean useWildCard = false;
 
     TypePrinter(JavacMessages messages, BinaryOperator<String> fullClassNameAndPackageToClass, Type typeToPrint) {
         this.messages = messages;
         this.fullClassNameAndPackageToClass = fullClassNameAndPackageToClass;
-        this.typeToPrint = typeToPrint;
     }
 
     @Override
@@ -64,21 +64,40 @@
 
     @Override
     public String visitCapturedType(Type.CapturedType t, Locale locale) {
-        if (t == typeToPrint) {
-            return visit(t.getUpperBound(), locale);
-        } else {
-            return visit(t.wildcard, locale);
+        return visit(t.wildcard, locale);
+    }
+
+    @Override
+    public String visitWildcardType(Type.WildcardType wt, Locale locale) {
+        if (useWildCard) { // at TypeArgument(ex: List<? extends T>)
+            return super.visitWildcardType(wt, locale);
+        } else { // at TopLevelType(ex: ? extends List<T>, ? extends Number[][])
+            Type extendsBound = wt.getExtendsBound();
+            return extendsBound == null
+                    ? OBJECT
+                    : visit(extendsBound, locale);
         }
     }
 
     @Override
     public String visitType(Type t, Locale locale) {
         String s = (t.tsym == null || t.tsym.name == null)
-                ? "Object" // none
+                ? OBJECT // none
                 : t.tsym.name.toString();
         return s;
     }
 
+    @Override
+    public String visitClassType(ClassType ct, Locale locale) {
+        boolean prevUseWildCard = useWildCard;
+        try {
+            useWildCard = true;
+            return super.visitClassType(ct, locale);
+        } finally {
+            useWildCard = prevUseWildCard;
+        }
+    }
+
     /**
      * Converts a class name into a (possibly localized) string. Anonymous
      * inner classes get converted into a localized string.
@@ -101,7 +120,7 @@
             }
             return s.toString();
             ***/
-            return "Object";
+            return OBJECT;
         } else if (sym.name.length() == 0) {
             // Anonymous
             String s;