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. |