author | asaha |
Tue, 14 Jan 2014 08:08:32 -0800 | |
changeset 22449 | 1fd6d4bec7dd |
parent 22165 | ec53c8946fc2 |
parent 22448 | a85fbad9d687 |
child 25287 | d2440361b323 |
permissions | -rw-r--r-- |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
1 |
/* |
22448
a85fbad9d687
8029230: Update copyright year to match last edit in jdk8 langtools repository for 2013
ksrini
parents:
18900
diff
changeset
|
2 |
* Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
4 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
5520 | 7 |
* published by the Free Software Foundation. Oracle designates this |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
5520 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
10 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
15 |
* accompanied this code). |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
16 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
20 |
* |
5520 | 21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
24 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
25 |
package com.sun.tools.javac.util; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
26 |
|
15724 | 27 |
import java.util.EnumMap; |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
28 |
import java.util.EnumSet; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
29 |
import java.util.HashMap; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
30 |
import java.util.LinkedHashMap; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
31 |
import java.util.Locale; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
32 |
import java.util.Map; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
33 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
34 |
import com.sun.tools.javac.code.Kinds; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
35 |
import com.sun.tools.javac.code.Printer; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
36 |
import com.sun.tools.javac.code.Symbol; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
37 |
import com.sun.tools.javac.code.Symbol.*; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
38 |
import com.sun.tools.javac.code.Symtab; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
39 |
import com.sun.tools.javac.code.Type; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
40 |
import com.sun.tools.javac.code.Type.*; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
41 |
import com.sun.tools.javac.code.Types; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
42 |
|
14359
d4099818ab70
7200915: convert TypeTags from a series of small ints to an enum
jjg
parents:
14058
diff
changeset
|
43 |
import static com.sun.tools.javac.code.TypeTag.*; |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
44 |
import static com.sun.tools.javac.code.Flags.*; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
45 |
import static com.sun.tools.javac.util.LayoutCharacters.*; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
46 |
import static com.sun.tools.javac.util.RichDiagnosticFormatter.RichConfiguration.*; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
47 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
48 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
49 |
* A rich diagnostic formatter is a formatter that provides better integration |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
50 |
* with javac's type system. A diagostic is first preprocessed in order to keep |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
51 |
* track of each types/symbols in it; after these informations are collected, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
52 |
* the diagnostic is rendered using a standard formatter, whose type/symbol printer |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
53 |
* has been replaced by a more refined version provided by this rich formatter. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
54 |
* The rich formatter currently enables three different features: (i) simple class |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
55 |
* names - that is class names are displayed used a non qualified name (thus |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
56 |
* omitting package info) whenever possible - (ii) where clause list - a list of |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
57 |
* additional subdiagnostics that provide specific info about type-variables, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
58 |
* captured types, intersection types that occur in the diagnostic that is to be |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
59 |
* formatted and (iii) type-variable disambiguation - when the diagnostic refers |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
60 |
* to two different type-variables with the same name, their representation is |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
61 |
* disambiguated by appending an index to the type variable name. |
3380
a6c2bcab0fec
6865399: some javac files are missing Sun internal API comment
jjg
parents:
3373
diff
changeset
|
62 |
* |
5847
1908176fd6e3
6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents:
5520
diff
changeset
|
63 |
* <p><b>This is NOT part of any supported API. |
3380
a6c2bcab0fec
6865399: some javac files are missing Sun internal API comment
jjg
parents:
3373
diff
changeset
|
64 |
* If you write code that depends on this, you do so at your own risk. |
a6c2bcab0fec
6865399: some javac files are missing Sun internal API comment
jjg
parents:
3373
diff
changeset
|
65 |
* This code and its internal interfaces are subject to change or |
a6c2bcab0fec
6865399: some javac files are missing Sun internal API comment
jjg
parents:
3373
diff
changeset
|
66 |
* deletion without notice.</b> |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
67 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
68 |
public class RichDiagnosticFormatter extends |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
69 |
ForwardingDiagnosticFormatter<JCDiagnostic, AbstractDiagnosticFormatter> { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
70 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
71 |
final Symtab syms; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
72 |
final Types types; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
73 |
final JCDiagnostic.Factory diags; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
74 |
final JavacMessages messages; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
75 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
76 |
/* name simplifier used by this formatter */ |
3145
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
77 |
protected ClassNameSimplifier nameSimplifier; |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
78 |
|
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
79 |
/* type/symbol printer used by this formatter */ |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
80 |
private RichPrinter printer; |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
81 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
82 |
/* map for keeping track of a where clause associated to a given type */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
83 |
Map<WhereClauseKind, Map<Type, JCDiagnostic>> whereClauses; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
84 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
85 |
/** Get the DiagnosticFormatter instance for this context. */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
86 |
public static RichDiagnosticFormatter instance(Context context) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
87 |
RichDiagnosticFormatter instance = context.get(RichDiagnosticFormatter.class); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
88 |
if (instance == null) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
89 |
instance = new RichDiagnosticFormatter(context); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
90 |
return instance; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
91 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
92 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
93 |
protected RichDiagnosticFormatter(Context context) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
94 |
super((AbstractDiagnosticFormatter)Log.instance(context).getDiagnosticFormatter()); |
3145
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
95 |
setRichPrinter(new RichPrinter()); |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
96 |
this.syms = Symtab.instance(context); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
97 |
this.diags = JCDiagnostic.Factory.instance(context); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
98 |
this.types = Types.instance(context); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
99 |
this.messages = JavacMessages.instance(context); |
22163 | 100 |
whereClauses = new EnumMap<>(WhereClauseKind.class); |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
101 |
configuration = new RichConfiguration(Options.instance(context), formatter); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
102 |
for (WhereClauseKind kind : WhereClauseKind.values()) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
103 |
whereClauses.put(kind, new LinkedHashMap<Type, JCDiagnostic>()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
104 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
105 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
106 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
107 |
public String format(JCDiagnostic diag, Locale l) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
108 |
StringBuilder sb = new StringBuilder(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
109 |
nameSimplifier = new ClassNameSimplifier(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
110 |
for (WhereClauseKind kind : WhereClauseKind.values()) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
111 |
whereClauses.get(kind).clear(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
112 |
preprocessDiagnostic(diag); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
113 |
sb.append(formatter.format(diag, l)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
114 |
if (getConfiguration().isEnabled(RichFormatterFeature.WHERE_CLAUSES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
115 |
List<JCDiagnostic> clauses = getWhereClauses(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
116 |
String indent = formatter.isRaw() ? "" : |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
117 |
formatter.indentString(DetailsInc); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
118 |
for (JCDiagnostic d : clauses) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
119 |
String whereClause = formatter.format(d, l); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
120 |
if (whereClause.length() > 0) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
121 |
sb.append('\n' + indent + whereClause); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
122 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
123 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
124 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
125 |
return sb.toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
126 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
127 |
|
18006
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
128 |
@Override |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
129 |
public String formatMessage(JCDiagnostic diag, Locale l) { |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
130 |
nameSimplifier = new ClassNameSimplifier(); |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
131 |
preprocessDiagnostic(diag); |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
132 |
return super.formatMessage(diag, l); |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
133 |
} |
c1b8a1815c54
7116676: RichDiagnosticFormatter throws NPE when formatMessage is called directly
mcimadamore
parents:
16809
diff
changeset
|
134 |
|
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
135 |
/** |
3145
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
136 |
* Sets the type/symbol printer used by this formatter. |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
137 |
* @param printer the rich printer to be set |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
138 |
*/ |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
139 |
protected void setRichPrinter(RichPrinter printer) { |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
140 |
this.printer = printer; |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
141 |
formatter.setPrinter(printer); |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
142 |
} |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
143 |
|
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
144 |
/** |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
145 |
* Gets the type/symbol printer used by this formatter. |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
146 |
* @return type/symbol rich printer |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
147 |
*/ |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
148 |
protected RichPrinter getRichPrinter() { |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
149 |
return printer; |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
150 |
} |
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
151 |
|
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
152 |
/** |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
153 |
* Preprocess a given diagnostic by looking both into its arguments and into |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
154 |
* its subdiagnostics (if any). This preprocessing is responsible for |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
155 |
* generating info corresponding to features like where clauses, name |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
156 |
* simplification, etc. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
157 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
158 |
* @param diag the diagnostic to be preprocessed |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
159 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
160 |
protected void preprocessDiagnostic(JCDiagnostic diag) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
161 |
for (Object o : diag.getArgs()) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
162 |
if (o != null) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
163 |
preprocessArgument(o); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
164 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
165 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
166 |
if (diag.isMultiline()) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
167 |
for (JCDiagnostic d : diag.getSubdiagnostics()) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
168 |
preprocessDiagnostic(d); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
169 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
170 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
171 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
172 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
173 |
* Preprocess a diagnostic argument. A type/symbol argument is |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
174 |
* preprocessed by specialized type/symbol preprocessors. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
175 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
176 |
* @param arg the argument to be translated |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
177 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
178 |
protected void preprocessArgument(Object arg) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
179 |
if (arg instanceof Type) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
180 |
preprocessType((Type)arg); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
181 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
182 |
else if (arg instanceof Symbol) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
183 |
preprocessSymbol((Symbol)arg); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
184 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
185 |
else if (arg instanceof JCDiagnostic) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
186 |
preprocessDiagnostic((JCDiagnostic)arg); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
187 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
188 |
else if (arg instanceof Iterable<?>) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
189 |
for (Object o : (Iterable<?>)arg) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
190 |
preprocessArgument(o); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
191 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
192 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
193 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
194 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
195 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
196 |
* Build a list of multiline diagnostics containing detailed info about |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
197 |
* type-variables, captured types, and intersection types |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
198 |
* |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
199 |
* @return where clause list |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
200 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
201 |
protected List<JCDiagnostic> getWhereClauses() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
202 |
List<JCDiagnostic> clauses = List.nil(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
203 |
for (WhereClauseKind kind : WhereClauseKind.values()) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
204 |
List<JCDiagnostic> lines = List.nil(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
205 |
for (Map.Entry<Type, JCDiagnostic> entry : whereClauses.get(kind).entrySet()) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
206 |
lines = lines.prepend(entry.getValue()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
207 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
208 |
if (!lines.isEmpty()) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
209 |
String key = kind.key(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
210 |
if (lines.size() > 1) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
211 |
key += ".1"; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
212 |
JCDiagnostic d = diags.fragment(key, whereClauses.get(kind).keySet()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
213 |
d = new JCDiagnostic.MultilineDiagnostic(d, lines.reverse()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
214 |
clauses = clauses.prepend(d); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
215 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
216 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
217 |
return clauses.reverse(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
218 |
} |
3540
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
219 |
|
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
220 |
private int indexOf(Type type, WhereClauseKind kind) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
221 |
int index = 1; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
222 |
for (Type t : whereClauses.get(kind).keySet()) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
223 |
if (t.tsym == type.tsym) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
224 |
return index; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
225 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
226 |
if (kind != WhereClauseKind.TYPEVAR || |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
227 |
t.toString().equals(type.toString())) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
228 |
index++; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
229 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
230 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
231 |
return -1; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
232 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
233 |
|
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
234 |
private boolean unique(TypeVar typevar) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
235 |
int found = 0; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
236 |
for (Type t : whereClauses.get(WhereClauseKind.TYPEVAR).keySet()) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
237 |
if (t.toString().equals(typevar.toString())) { |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
238 |
found++; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
239 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
240 |
} |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
241 |
if (found < 1) |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
242 |
throw new AssertionError("Missing type variable in where clause " + typevar); |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
243 |
return found == 1; |
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
244 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
245 |
//where |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
246 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
247 |
* This enum defines all posssible kinds of where clauses that can be |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
248 |
* attached by a rich diagnostic formatter to a given diagnostic |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
249 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
250 |
enum WhereClauseKind { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
251 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
252 |
/** where clause regarding a type variable */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
253 |
TYPEVAR("where.description.typevar"), |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
254 |
/** where clause regarding a captured type */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
255 |
CAPTURED("where.description.captured"), |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
256 |
/** where clause regarding an intersection type */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
257 |
INTERSECTION("where.description.intersection"); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
258 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
259 |
/** resource key for this where clause kind */ |
14801
d66cab4ef397
8003967: detect and remove all mutable implicit static enum fields in langtools
vromero
parents:
14547
diff
changeset
|
260 |
private final String key; |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
261 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
262 |
WhereClauseKind(String key) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
263 |
this.key = key; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
264 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
265 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
266 |
String key() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
267 |
return key; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
268 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
269 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
270 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
271 |
// <editor-fold defaultstate="collapsed" desc="name simplifier"> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
272 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
273 |
* A name simplifier keeps track of class names usages in order to determine |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
274 |
* whether a class name can be compacted or not. Short names are not used |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
275 |
* if a conflict is detected, e.g. when two classes with the same simple |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
276 |
* name belong to different packages - in this case the formatter reverts |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
277 |
* to fullnames as compact names might lead to a confusing diagnostic. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
278 |
*/ |
3145
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
279 |
protected class ClassNameSimplifier { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
280 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
281 |
/* table for keeping track of all short name usages */ |
22163 | 282 |
Map<Name, List<Symbol>> nameClashes = new HashMap<>(); |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
283 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
284 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
285 |
* Add a name usage to the simplifier's internal cache |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
286 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
287 |
protected void addUsage(Symbol sym) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
288 |
Name n = sym.getSimpleName(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
289 |
List<Symbol> conflicts = nameClashes.get(n); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
290 |
if (conflicts == null) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
291 |
conflicts = List.nil(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
292 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
293 |
if (!conflicts.contains(sym)) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
294 |
nameClashes.put(n, conflicts.append(sym)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
295 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
296 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
297 |
public String simplify(Symbol s) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
298 |
String name = s.getQualifiedName().toString(); |
15361
01f1828683e6
8005299: Add FunctionalInterface checking to javac
mcimadamore
parents:
14801
diff
changeset
|
299 |
if (!s.type.isCompound() && !s.type.isPrimitive()) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
300 |
List<Symbol> conflicts = nameClashes.get(s.getSimpleName()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
301 |
if (conflicts == null || |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
302 |
(conflicts.size() == 1 && |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
303 |
conflicts.contains(s))) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
304 |
List<Name> l = List.nil(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
305 |
Symbol s2 = s; |
18900
5ed5dd2ee5fe
8017618: NullPointerException in RichDiagnosticFormatter for bad input program
mcimadamore
parents:
18006
diff
changeset
|
306 |
while (s2.type.hasTag(CLASS) && |
5ed5dd2ee5fe
8017618: NullPointerException in RichDiagnosticFormatter for bad input program
mcimadamore
parents:
18006
diff
changeset
|
307 |
s2.type.getEnclosingType().hasTag(CLASS) && |
5ed5dd2ee5fe
8017618: NullPointerException in RichDiagnosticFormatter for bad input program
mcimadamore
parents:
18006
diff
changeset
|
308 |
s2.owner.kind == Kinds.TYP) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
309 |
l = l.prepend(s2.getSimpleName()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
310 |
s2 = s2.owner; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
311 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
312 |
l = l.prepend(s2.getSimpleName()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
313 |
StringBuilder buf = new StringBuilder(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
314 |
String sep = ""; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
315 |
for (Name n2 : l) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
316 |
buf.append(sep); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
317 |
buf.append(n2); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
318 |
sep = "."; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
319 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
320 |
name = buf.toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
321 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
322 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
323 |
return name; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
324 |
} |
22163 | 325 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
326 |
// </editor-fold> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
327 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
328 |
// <editor-fold defaultstate="collapsed" desc="rich printer"> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
329 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
330 |
* Enhanced type/symbol printer that provides support for features like simple names |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
331 |
* and type variable disambiguation. This enriched printer exploits the info |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
332 |
* discovered during type/symbol preprocessing. This printer is set on the delegate |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
333 |
* formatter so that rich type/symbol info can be properly rendered. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
334 |
*/ |
3145
5300990c95bd
6852649: The Rich formatter printer should be an explicit class to facilitate overriding
mcimadamore
parents:
2984
diff
changeset
|
335 |
protected class RichPrinter extends Printer { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
336 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
337 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
338 |
public String localize(Locale locale, String key, Object... args) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
339 |
return formatter.localize(locale, key, args); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
340 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
341 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
342 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
343 |
public String capturedVarId(CapturedType t, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
344 |
return indexOf(t, WhereClauseKind.CAPTURED) + ""; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
345 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
346 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
347 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
348 |
public String visitType(Type t, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
349 |
String s = super.visitType(t, locale); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
350 |
if (t == syms.botType) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
351 |
s = localize(locale, "compiler.misc.type.null"); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
352 |
return s; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
353 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
354 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
355 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
356 |
public String visitCapturedType(CapturedType t, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
357 |
if (getConfiguration().isEnabled(RichFormatterFeature.WHERE_CLAUSES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
358 |
return localize(locale, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
359 |
"compiler.misc.captured.type", |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
360 |
indexOf(t, WhereClauseKind.CAPTURED)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
361 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
362 |
else |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
363 |
return super.visitCapturedType(t, locale); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
364 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
365 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
366 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
367 |
public String visitClassType(ClassType t, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
368 |
if (t.isCompound() && |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
369 |
getConfiguration().isEnabled(RichFormatterFeature.WHERE_CLAUSES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
370 |
return localize(locale, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
371 |
"compiler.misc.intersection.type", |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
372 |
indexOf(t, WhereClauseKind.INTERSECTION)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
373 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
374 |
else |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
375 |
return super.visitClassType(t, locale); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
376 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
377 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
378 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
379 |
protected String className(ClassType t, boolean longform, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
380 |
Symbol sym = t.tsym; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
381 |
if (sym.name.length() == 0 || |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
382 |
!getConfiguration().isEnabled(RichFormatterFeature.SIMPLE_NAMES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
383 |
return super.className(t, longform, locale); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
384 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
385 |
else if (longform) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
386 |
return nameSimplifier.simplify(sym).toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
387 |
else |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
388 |
return sym.name.toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
389 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
390 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
391 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
392 |
public String visitTypeVar(TypeVar t, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
393 |
if (unique(t) || |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
394 |
!getConfiguration().isEnabled(RichFormatterFeature.UNIQUE_TYPEVAR_NAMES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
395 |
return t.toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
396 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
397 |
else { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
398 |
return localize(locale, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
399 |
"compiler.misc.type.var", |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
400 |
t.toString(), indexOf(t, WhereClauseKind.TYPEVAR)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
401 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
402 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
403 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
404 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
405 |
public String visitClassSymbol(ClassSymbol s, Locale locale) { |
16809
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
406 |
if (s.type.isCompound()) { |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
407 |
return visit(s.type, locale); |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
408 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
409 |
String name = nameSimplifier.simplify(s); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
410 |
if (name.length() == 0 || |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
411 |
!getConfiguration().isEnabled(RichFormatterFeature.SIMPLE_NAMES)) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
412 |
return super.visitClassSymbol(s, locale); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
413 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
414 |
else { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
415 |
return name; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
416 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
417 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
418 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
419 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
420 |
public String visitMethodSymbol(MethodSymbol s, Locale locale) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
421 |
String ownerName = visit(s.owner, locale); |
10626
83f0c2860f5b
7086595: Error message bug: name of initializer is 'null'
mcimadamore
parents:
5847
diff
changeset
|
422 |
if (s.isStaticOrInstanceInit()) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
423 |
return ownerName; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
424 |
} else { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
425 |
String ms = (s.name == s.name.table.names.init) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
426 |
? ownerName |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
427 |
: s.name.toString(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
428 |
if (s.type != null) { |
14359
d4099818ab70
7200915: convert TypeTags from a series of small ints to an enum
jjg
parents:
14058
diff
changeset
|
429 |
if (s.type.hasTag(FORALL)) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
430 |
ms = "<" + visitTypes(s.type.getTypeArguments(), locale) + ">" + ms; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
431 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
432 |
ms += "(" + printMethodArgs( |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
433 |
s.type.getParameterTypes(), |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
434 |
(s.flags() & VARARGS) != 0, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
435 |
locale) + ")"; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
436 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
437 |
return ms; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
438 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
439 |
} |
22163 | 440 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
441 |
// </editor-fold> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
442 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
443 |
// <editor-fold defaultstate="collapsed" desc="type scanner"> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
444 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
445 |
* Preprocess a given type looking for (i) additional info (where clauses) to be |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
446 |
* added to the main diagnostic (ii) names to be compacted. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
447 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
448 |
protected void preprocessType(Type t) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
449 |
typePreprocessor.visit(t); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
450 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
451 |
//where |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
452 |
protected Types.UnaryVisitor<Void> typePreprocessor = |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
453 |
new Types.UnaryVisitor<Void>() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
454 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
455 |
public Void visit(List<Type> ts) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
456 |
for (Type t : ts) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
457 |
visit(t); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
458 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
459 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
460 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
461 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
462 |
public Void visitForAll(ForAll t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
463 |
visit(t.tvars); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
464 |
visit(t.qtype); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
465 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
466 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
467 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
468 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
469 |
public Void visitMethodType(MethodType t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
470 |
visit(t.argtypes); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
471 |
visit(t.restype); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
472 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
473 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
474 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
475 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
476 |
public Void visitErrorType(ErrorType t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
477 |
Type ot = t.getOriginalType(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
478 |
if (ot != null) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
479 |
visit(ot); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
480 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
481 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
482 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
483 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
484 |
public Void visitArrayType(ArrayType t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
485 |
visit(t.elemtype); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
486 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
487 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
488 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
489 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
490 |
public Void visitWildcardType(WildcardType t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
491 |
visit(t.type); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
492 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
493 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
494 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
495 |
public Void visitType(Type t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
496 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
497 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
498 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
499 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
500 |
public Void visitCapturedType(CapturedType t, Void ignored) { |
3540
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
501 |
if (indexOf(t, WhereClauseKind.CAPTURED) == -1) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
502 |
String suffix = t.lower == syms.botType ? ".1" : ""; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
503 |
JCDiagnostic d = diags.fragment("where.captured"+ suffix, t, t.bound, t.lower, t.wildcard); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
504 |
whereClauses.get(WhereClauseKind.CAPTURED).put(t, d); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
505 |
visit(t.wildcard); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
506 |
visit(t.lower); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
507 |
visit(t.bound); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
508 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
509 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
510 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
511 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
512 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
513 |
public Void visitClassType(ClassType t, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
514 |
if (t.isCompound()) { |
3540
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
515 |
if (indexOf(t, WhereClauseKind.INTERSECTION) == -1) { |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
516 |
Type supertype = types.supertype(t); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
517 |
List<Type> interfaces = types.interfaces(t); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
518 |
JCDiagnostic d = diags.fragment("where.intersection", t, interfaces.prepend(supertype)); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
519 |
whereClauses.get(WhereClauseKind.INTERSECTION).put(t, d); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
520 |
visit(supertype); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
521 |
visit(interfaces); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
522 |
} |
16568
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
523 |
} else if (t.tsym.name.isEmpty()) { |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
524 |
//anon class |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
525 |
ClassType norm = (ClassType) t.tsym.type; |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
526 |
if (norm != null) { |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
527 |
if (norm.interfaces_field != null && norm.interfaces_field.nonEmpty()) { |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
528 |
visit(norm.interfaces_field.head); |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
529 |
} else { |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
530 |
visit(norm.supertype_field); |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
531 |
} |
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
532 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
533 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
534 |
nameSimplifier.addUsage(t.tsym); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
535 |
visit(t.getTypeArguments()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
536 |
if (t.getEnclosingType() != Type.noType) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
537 |
visit(t.getEnclosingType()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
538 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
539 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
540 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
541 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
542 |
public Void visitTypeVar(TypeVar t, Void ignored) { |
3540
dceac8629a56
6862608: rich diagnostic sometimes contain wrong type variable numbering
mcimadamore
parents:
3380
diff
changeset
|
543 |
if (indexOf(t, WhereClauseKind.TYPEVAR) == -1) { |
3541
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
544 |
//access the bound type and skip error types |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
545 |
Type bound = t.bound; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
546 |
while ((bound instanceof ErrorType)) |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
547 |
bound = ((ErrorType)bound).getOriginalType(); |
3541
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
548 |
//retrieve the bound list - if the type variable |
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
549 |
//has not been attributed the bound is not set |
14547 | 550 |
List<Type> bounds = (bound != null) && |
551 |
(bound.hasTag(CLASS) || bound.hasTag(TYPEVAR)) ? |
|
3541
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
552 |
types.getBounds(t) : |
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
553 |
List.<Type>nil(); |
46fcb9a809a6
6864382: NPE in the rich formatter when processing an unattributed type-variable
mcimadamore
parents:
3540
diff
changeset
|
554 |
|
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
555 |
nameSimplifier.addUsage(t.tsym); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
556 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
557 |
boolean boundErroneous = bounds.head == null || |
14359
d4099818ab70
7200915: convert TypeTags from a series of small ints to an enum
jjg
parents:
14058
diff
changeset
|
558 |
bounds.head.hasTag(NONE) || |
d4099818ab70
7200915: convert TypeTags from a series of small ints to an enum
jjg
parents:
14058
diff
changeset
|
559 |
bounds.head.hasTag(ERROR); |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
560 |
|
12468
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
561 |
if ((t.tsym.flags() & SYNTHETIC) == 0) { |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
562 |
//this is a true typevar |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
563 |
JCDiagnostic d = diags.fragment("where.typevar" + |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
564 |
(boundErroneous ? ".1" : ""), t, bounds, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
565 |
Kinds.kindName(t.tsym.location()), t.tsym.location()); |
12468
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
566 |
whereClauses.get(WhereClauseKind.TYPEVAR).put(t, d); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
567 |
symbolPreprocessor.visit(t.tsym.location(), null); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
568 |
visit(bounds); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
569 |
} else { |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
570 |
Assert.check(!boundErroneous); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
571 |
//this is a fresh (synthetic) tvar |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
572 |
JCDiagnostic d = diags.fragment("where.fresh.typevar", t, bounds); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
573 |
whereClauses.get(WhereClauseKind.TYPEVAR).put(t, d); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
574 |
visit(bounds); |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
575 |
} |
1100643c0209
7154127: Inference cleanup: remove bound check analysis from visitors in Types.java
mcimadamore
parents:
10626
diff
changeset
|
576 |
|
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
577 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
578 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
579 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
580 |
}; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
581 |
// </editor-fold> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
582 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
583 |
// <editor-fold defaultstate="collapsed" desc="symbol scanner"> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
584 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
585 |
* Preprocess a given symbol looking for (i) additional info (where clauses) to be |
16568
695eacfe0f41
8010387: Javac crashes when diagnostic mentions anonymous inner class' type variables
mcimadamore
parents:
15725
diff
changeset
|
586 |
* added to the main diagnostic (ii) names to be compacted |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
587 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
588 |
protected void preprocessSymbol(Symbol s) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
589 |
symbolPreprocessor.visit(s, null); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
590 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
591 |
//where |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
592 |
protected Types.DefaultSymbolVisitor<Void, Void> symbolPreprocessor = |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
593 |
new Types.DefaultSymbolVisitor<Void, Void>() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
594 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
595 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
596 |
public Void visitClassSymbol(ClassSymbol s, Void ignored) { |
16809
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
597 |
if (s.type.isCompound()) { |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
598 |
typePreprocessor.visit(s.type); |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
599 |
} else { |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
600 |
nameSimplifier.addUsage(s); |
5acfcb821d65
8010822: Intersection type cast for functional expressions does not follow spec EDR
mcimadamore
parents:
16568
diff
changeset
|
601 |
} |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
602 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
603 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
604 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
605 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
606 |
public Void visitSymbol(Symbol s, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
607 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
608 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
609 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
610 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
611 |
public Void visitMethodSymbol(MethodSymbol s, Void ignored) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
612 |
visit(s.owner, null); |
3373
d62556aed18c
6860795: NullPointerException when compiling a negative java source
mcimadamore
parents:
3145
diff
changeset
|
613 |
if (s.type != null) |
d62556aed18c
6860795: NullPointerException when compiling a negative java source
mcimadamore
parents:
3145
diff
changeset
|
614 |
typePreprocessor.visit(s.type); |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
615 |
return null; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
616 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
617 |
}; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
618 |
// </editor-fold> |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
619 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
620 |
@Override |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
621 |
public RichConfiguration getConfiguration() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
622 |
//the following cast is always safe - see init |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
623 |
return (RichConfiguration)configuration; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
624 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
625 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
626 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
627 |
* Configuration object provided by the rich formatter. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
628 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
629 |
public static class RichConfiguration extends ForwardingDiagnosticFormatter.ForwardingConfiguration { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
630 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
631 |
/** set of enabled rich formatter's features */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
632 |
protected java.util.EnumSet<RichFormatterFeature> features; |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
633 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
634 |
@SuppressWarnings("fallthrough") |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
635 |
public RichConfiguration(Options options, AbstractDiagnosticFormatter formatter) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
636 |
super(formatter.getConfiguration()); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
637 |
features = formatter.isRaw() ? EnumSet.noneOf(RichFormatterFeature.class) : |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
638 |
EnumSet.of(RichFormatterFeature.SIMPLE_NAMES, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
639 |
RichFormatterFeature.WHERE_CLAUSES, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
640 |
RichFormatterFeature.UNIQUE_TYPEVAR_NAMES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
641 |
String diagOpts = options.get("diags"); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
642 |
if (diagOpts != null) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
643 |
for (String args: diagOpts.split(",")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
644 |
if (args.equals("-where")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
645 |
features.remove(RichFormatterFeature.WHERE_CLAUSES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
646 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
647 |
else if (args.equals("where")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
648 |
features.add(RichFormatterFeature.WHERE_CLAUSES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
649 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
650 |
if (args.equals("-simpleNames")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
651 |
features.remove(RichFormatterFeature.SIMPLE_NAMES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
652 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
653 |
else if (args.equals("simpleNames")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
654 |
features.add(RichFormatterFeature.SIMPLE_NAMES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
655 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
656 |
if (args.equals("-disambiguateTvars")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
657 |
features.remove(RichFormatterFeature.UNIQUE_TYPEVAR_NAMES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
658 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
659 |
else if (args.equals("disambiguateTvars")) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
660 |
features.add(RichFormatterFeature.UNIQUE_TYPEVAR_NAMES); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
661 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
662 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
663 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
664 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
665 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
666 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
667 |
* Returns a list of all the features supported by the rich formatter. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
668 |
* @return list of supported features |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
669 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
670 |
public RichFormatterFeature[] getAvailableFeatures() { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
671 |
return RichFormatterFeature.values(); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
672 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
673 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
674 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
675 |
* Enable a specific feature on this rich formatter. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
676 |
* @param feature feature to be enabled |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
677 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
678 |
public void enable(RichFormatterFeature feature) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
679 |
features.add(feature); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
680 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
681 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
682 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
683 |
* Disable a specific feature on this rich formatter. |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
684 |
* @param feature feature to be disabled |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
685 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
686 |
public void disable(RichFormatterFeature feature) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
687 |
features.remove(feature); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
688 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
689 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
690 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
691 |
* Is a given feature enabled on this formatter? |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
692 |
* @param feature feature to be tested |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
693 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
694 |
public boolean isEnabled(RichFormatterFeature feature) { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
695 |
return features.contains(feature); |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
696 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
697 |
|
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
698 |
/** |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
699 |
* The advanced formatting features provided by the rich formatter |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
700 |
*/ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
701 |
public enum RichFormatterFeature { |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
702 |
/** a list of additional info regarding a given type/symbol */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
703 |
WHERE_CLAUSES, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
704 |
/** full class names simplification (where possible) */ |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
705 |
SIMPLE_NAMES, |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
706 |
/** type-variable names disambiguation */ |
22163 | 707 |
UNIQUE_TYPEVAR_NAMES |
2984
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
708 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
709 |
} |
e15ff3a34054
6722234: javac diagnostics need better integration with the type-system
mcimadamore
parents:
diff
changeset
|
710 |
} |