langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java
changeset 34750 36d62753f5da
parent 33362 65ec6de1d6b4
child 43134 006808ae5f6e
equal deleted inserted replaced
34572:4edcff1b9a88 34750:36d62753f5da
    39 
    39 
    40 /**
    40 /**
    41  * Print types in source form.
    41  * Print types in source form.
    42  */
    42  */
    43 class TypePrinter extends Printer {
    43 class TypePrinter extends Printer {
       
    44     private static final String OBJECT = "Object";
    44 
    45 
    45     private final JavacMessages messages;
    46     private final JavacMessages messages;
    46     private final BinaryOperator<String> fullClassNameAndPackageToClass;
    47     private final BinaryOperator<String> fullClassNameAndPackageToClass;
    47     private final Type typeToPrint;
    48     private boolean useWildCard = false;
    48 
    49 
    49     TypePrinter(JavacMessages messages, BinaryOperator<String> fullClassNameAndPackageToClass, Type typeToPrint) {
    50     TypePrinter(JavacMessages messages, BinaryOperator<String> fullClassNameAndPackageToClass, Type typeToPrint) {
    50         this.messages = messages;
    51         this.messages = messages;
    51         this.fullClassNameAndPackageToClass = fullClassNameAndPackageToClass;
    52         this.fullClassNameAndPackageToClass = fullClassNameAndPackageToClass;
    52         this.typeToPrint = typeToPrint;
       
    53     }
    53     }
    54 
    54 
    55     @Override
    55     @Override
    56     protected String localize(Locale locale, String key, Object... args) {
    56     protected String localize(Locale locale, String key, Object... args) {
    57         return messages.getLocalizedString(locale, key, args);
    57         return messages.getLocalizedString(locale, key, args);
    62         throw new InternalError("should never call this");
    62         throw new InternalError("should never call this");
    63     }
    63     }
    64 
    64 
    65     @Override
    65     @Override
    66     public String visitCapturedType(Type.CapturedType t, Locale locale) {
    66     public String visitCapturedType(Type.CapturedType t, Locale locale) {
    67         if (t == typeToPrint) {
    67         return visit(t.wildcard, locale);
    68             return visit(t.getUpperBound(), locale);
    68     }
    69         } else {
    69 
    70             return visit(t.wildcard, locale);
    70     @Override
       
    71     public String visitWildcardType(Type.WildcardType wt, Locale locale) {
       
    72         if (useWildCard) { // at TypeArgument(ex: List<? extends T>)
       
    73             return super.visitWildcardType(wt, locale);
       
    74         } else { // at TopLevelType(ex: ? extends List<T>, ? extends Number[][])
       
    75             Type extendsBound = wt.getExtendsBound();
       
    76             return extendsBound == null
       
    77                     ? OBJECT
       
    78                     : visit(extendsBound, locale);
    71         }
    79         }
    72     }
    80     }
    73 
    81 
    74     @Override
    82     @Override
    75     public String visitType(Type t, Locale locale) {
    83     public String visitType(Type t, Locale locale) {
    76         String s = (t.tsym == null || t.tsym.name == null)
    84         String s = (t.tsym == null || t.tsym.name == null)
    77                 ? "Object" // none
    85                 ? OBJECT // none
    78                 : t.tsym.name.toString();
    86                 : t.tsym.name.toString();
    79         return s;
    87         return s;
       
    88     }
       
    89 
       
    90     @Override
       
    91     public String visitClassType(ClassType ct, Locale locale) {
       
    92         boolean prevUseWildCard = useWildCard;
       
    93         try {
       
    94             useWildCard = true;
       
    95             return super.visitClassType(ct, locale);
       
    96         } finally {
       
    97             useWildCard = prevUseWildCard;
       
    98         }
    80     }
    99     }
    81 
   100 
    82     /**
   101     /**
    83      * Converts a class name into a (possibly localized) string. Anonymous
   102      * Converts a class name into a (possibly localized) string. Anonymous
    84      * inner classes get converted into a localized string.
   103      * inner classes get converted into a localized string.
    99                 s.append('&');
   118                 s.append('&');
   100                 s.append(visit(is.head, locale));
   119                 s.append(visit(is.head, locale));
   101             }
   120             }
   102             return s.toString();
   121             return s.toString();
   103             ***/
   122             ***/
   104             return "Object";
   123             return OBJECT;
   105         } else if (sym.name.length() == 0) {
   124         } else if (sym.name.length() == 0) {
   106             // Anonymous
   125             // Anonymous
   107             String s;
   126             String s;
   108             ClassType norm = (ClassType) t.tsym.type;
   127             ClassType norm = (ClassType) t.tsym.type;
   109             if (norm == null) {
   128             if (norm == null) {