Mon, 28 Feb 2011 11:48:53 +0000
7015430: Incorrect thrown type determined for unchecked invocations
Summary: Thrown types do not get updated after 15.12.2.8, and do not get erased as per 15.12.2.6
Reviewed-by: jjg, dlsmith
mcimadamore@83 | 1 | /* |
ohair@798 | 2 | * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
mcimadamore@83 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
mcimadamore@83 | 4 | * |
mcimadamore@83 | 5 | * This code is free software; you can redistribute it and/or modify it |
mcimadamore@83 | 6 | * under the terms of the GNU General Public License version 2 only, as |
ohair@554 | 7 | * published by the Free Software Foundation. Oracle designates this |
mcimadamore@83 | 8 | * particular file as subject to the "Classpath" exception as provided |
ohair@554 | 9 | * by Oracle in the LICENSE file that accompanied this code. |
mcimadamore@83 | 10 | * |
mcimadamore@83 | 11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
mcimadamore@83 | 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
mcimadamore@83 | 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
mcimadamore@83 | 14 | * version 2 for more details (a copy is included in the LICENSE file that |
mcimadamore@83 | 15 | * accompanied this code). |
mcimadamore@83 | 16 | * |
mcimadamore@83 | 17 | * You should have received a copy of the GNU General Public License version |
mcimadamore@83 | 18 | * 2 along with this work; if not, write to the Free Software Foundation, |
mcimadamore@83 | 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
mcimadamore@83 | 20 | * |
ohair@554 | 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ohair@554 | 22 | * or visit www.oracle.com if you need additional information or have any |
ohair@554 | 23 | * questions. |
mcimadamore@83 | 24 | */ |
mcimadamore@83 | 25 | |
mcimadamore@83 | 26 | package com.sun.tools.javac.util; |
mcimadamore@83 | 27 | |
mcimadamore@221 | 28 | import java.util.Collection; |
mcimadamore@221 | 29 | import java.util.EnumSet; |
mcimadamore@83 | 30 | import java.util.HashMap; |
mcimadamore@83 | 31 | import java.util.Locale; |
mcimadamore@83 | 32 | import java.util.Map; |
mcimadamore@221 | 33 | import java.util.regex.Matcher; |
mcimadamore@83 | 34 | import javax.tools.JavaFileObject; |
mcimadamore@83 | 35 | |
mcimadamore@221 | 36 | import com.sun.tools.javac.util.AbstractDiagnosticFormatter.SimpleConfiguration; |
mcimadamore@221 | 37 | import com.sun.tools.javac.util.BasicDiagnosticFormatter.BasicConfiguration; |
mcimadamore@221 | 38 | |
mcimadamore@83 | 39 | import static com.sun.tools.javac.api.DiagnosticFormatter.PositionKind.*; |
mcimadamore@221 | 40 | import static com.sun.tools.javac.util.BasicDiagnosticFormatter.BasicConfiguration.*; |
mcimadamore@221 | 41 | import static com.sun.tools.javac.util.LayoutCharacters.*; |
mcimadamore@83 | 42 | |
mcimadamore@83 | 43 | /** |
mcimadamore@83 | 44 | * A basic formatter for diagnostic messages. |
mcimadamore@83 | 45 | * The basic formatter will format a diagnostic according to one of three format patterns, depending on whether |
mcimadamore@83 | 46 | * or not the source name and position are set. The formatter supports a printf-like string for patterns |
mcimadamore@83 | 47 | * with the following special characters: |
mcimadamore@83 | 48 | * <ul> |
mcimadamore@83 | 49 | * <li>%b: the base of the source name |
mcimadamore@83 | 50 | * <li>%f: the source name (full absolute path) |
mcimadamore@83 | 51 | * <li>%l: the line number of the diagnostic, derived from the character offset |
mcimadamore@83 | 52 | * <li>%c: the column number of the diagnostic, derived from the character offset |
mcimadamore@83 | 53 | * <li>%o: the character offset of the diagnostic if set |
mcimadamore@83 | 54 | * <li>%p: the prefix for the diagnostic, derived from the diagnostic type |
mcimadamore@83 | 55 | * <li>%t: the prefix as it normally appears in standard diagnostics. In this case, no prefix is |
mcimadamore@83 | 56 | * shown if the type is ERROR and if a source name is set |
mcimadamore@83 | 57 | * <li>%m: the text or the diagnostic, including any appropriate arguments |
mcimadamore@83 | 58 | * <li>%_: space delimiter, useful for formatting purposes |
mcimadamore@83 | 59 | * </ul> |
jjg@333 | 60 | * |
jjg@581 | 61 | * <p><b>This is NOT part of any supported API. |
jjg@333 | 62 | * If you write code that depends on this, you do so at your own risk. |
jjg@333 | 63 | * This code and its internal interfaces are subject to change or |
jjg@333 | 64 | * deletion without notice.</b> |
mcimadamore@83 | 65 | */ |
mcimadamore@83 | 66 | public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { |
mcimadamore@83 | 67 | |
mcimadamore@83 | 68 | /** |
mcimadamore@83 | 69 | * Create a basic formatter based on the supplied options. |
mcimadamore@83 | 70 | * |
mcimadamore@83 | 71 | * @param opts list of command-line options |
mcimadamore@136 | 72 | * @param msgs JavacMessages object used for i18n |
mcimadamore@83 | 73 | */ |
mcimadamore@221 | 74 | public BasicDiagnosticFormatter(Options options, JavacMessages msgs) { |
mcimadamore@221 | 75 | super(msgs, new BasicConfiguration(options)); |
mcimadamore@83 | 76 | } |
mcimadamore@83 | 77 | |
mcimadamore@83 | 78 | /** |
mcimadamore@83 | 79 | * Create a standard basic formatter |
mcimadamore@83 | 80 | * |
mcimadamore@136 | 81 | * @param msgs JavacMessages object used for i18n |
mcimadamore@83 | 82 | */ |
mcimadamore@136 | 83 | public BasicDiagnosticFormatter(JavacMessages msgs) { |
mcimadamore@221 | 84 | super(msgs, new BasicConfiguration()); |
mcimadamore@83 | 85 | } |
mcimadamore@83 | 86 | |
mcimadamore@238 | 87 | public String formatDiagnostic(JCDiagnostic d, Locale l) { |
mcimadamore@136 | 88 | if (l == null) |
mcimadamore@136 | 89 | l = messages.getCurrentLocale(); |
mcimadamore@83 | 90 | String format = selectFormat(d); |
mcimadamore@83 | 91 | StringBuilder buf = new StringBuilder(); |
mcimadamore@83 | 92 | for (int i = 0; i < format.length(); i++) { |
mcimadamore@83 | 93 | char c = format.charAt(i); |
mcimadamore@83 | 94 | boolean meta = false; |
mcimadamore@83 | 95 | if (c == '%' && i < format.length() - 1) { |
mcimadamore@83 | 96 | meta = true; |
mcimadamore@83 | 97 | c = format.charAt(++i); |
mcimadamore@83 | 98 | } |
mcimadamore@83 | 99 | buf.append(meta ? formatMeta(c, d, l) : String.valueOf(c)); |
mcimadamore@83 | 100 | } |
mcimadamore@221 | 101 | if (depth == 0) |
mcimadamore@221 | 102 | return addSourceLineIfNeeded(d, buf.toString()); |
mcimadamore@221 | 103 | else |
mcimadamore@221 | 104 | return buf.toString(); |
mcimadamore@221 | 105 | } |
mcimadamore@221 | 106 | |
mcimadamore@221 | 107 | public String formatMessage(JCDiagnostic d, Locale l) { |
mcimadamore@689 | 108 | int currentIndentation = 0; |
mcimadamore@689 | 109 | StringBuilder buf = new StringBuilder(); |
mcimadamore@689 | 110 | Collection<String> args = formatArguments(d, l); |
mcimadamore@689 | 111 | String msg = localize(l, d.getCode(), args.toArray()); |
mcimadamore@689 | 112 | String[] lines = msg.split("\n"); |
mcimadamore@689 | 113 | if (getConfiguration().getVisible().contains(DiagnosticPart.SUMMARY)) { |
mcimadamore@689 | 114 | currentIndentation += getConfiguration().getIndentation(DiagnosticPart.SUMMARY); |
mcimadamore@689 | 115 | buf.append(indent(lines[0], currentIndentation)); //summary |
mcimadamore@689 | 116 | } |
mcimadamore@689 | 117 | if (lines.length > 1 && getConfiguration().getVisible().contains(DiagnosticPart.DETAILS)) { |
mcimadamore@689 | 118 | currentIndentation += getConfiguration().getIndentation(DiagnosticPart.DETAILS); |
mcimadamore@689 | 119 | for (int i = 1;i < lines.length; i++) { |
mcimadamore@689 | 120 | buf.append("\n" + indent(lines[i], currentIndentation)); |
mcimadamore@221 | 121 | } |
mcimadamore@689 | 122 | } |
mcimadamore@689 | 123 | if (d.isMultiline() && getConfiguration().getVisible().contains(DiagnosticPart.SUBDIAGNOSTICS)) { |
mcimadamore@689 | 124 | currentIndentation += getConfiguration().getIndentation(DiagnosticPart.SUBDIAGNOSTICS); |
mcimadamore@689 | 125 | for (String sub : formatSubdiagnostics(d, l)) { |
mcimadamore@689 | 126 | buf.append("\n" + indent(sub, currentIndentation)); |
mcimadamore@221 | 127 | } |
mcimadamore@137 | 128 | } |
mcimadamore@689 | 129 | return buf.toString(); |
mcimadamore@221 | 130 | } |
mcimadamore@221 | 131 | |
mcimadamore@221 | 132 | protected String addSourceLineIfNeeded(JCDiagnostic d, String msg) { |
mcimadamore@221 | 133 | if (!displaySource(d)) |
mcimadamore@221 | 134 | return msg; |
mcimadamore@221 | 135 | else { |
mcimadamore@221 | 136 | BasicConfiguration conf = getConfiguration(); |
mcimadamore@221 | 137 | int indentSource = conf.getIndentation(DiagnosticPart.SOURCE); |
mcimadamore@221 | 138 | String sourceLine = "\n" + formatSourceLine(d, indentSource); |
mcimadamore@221 | 139 | boolean singleLine = msg.indexOf("\n") == -1; |
mcimadamore@221 | 140 | if (singleLine || getConfiguration().getSourcePosition() == SourcePosition.BOTTOM) |
mcimadamore@221 | 141 | return msg + sourceLine; |
mcimadamore@221 | 142 | else |
mcimadamore@221 | 143 | return msg.replaceFirst("\n", Matcher.quoteReplacement(sourceLine) + "\n"); |
mcimadamore@221 | 144 | } |
mcimadamore@83 | 145 | } |
mcimadamore@83 | 146 | |
mcimadamore@83 | 147 | protected String formatMeta(char c, JCDiagnostic d, Locale l) { |
mcimadamore@83 | 148 | switch (c) { |
mcimadamore@83 | 149 | case 'b': |
mcimadamore@100 | 150 | return formatSource(d, false, l); |
mcimadamore@83 | 151 | case 'e': |
mcimadamore@83 | 152 | return formatPosition(d, END, l); |
mcimadamore@83 | 153 | case 'f': |
mcimadamore@100 | 154 | return formatSource(d, true, l); |
mcimadamore@83 | 155 | case 'l': |
mcimadamore@83 | 156 | return formatPosition(d, LINE, l); |
mcimadamore@83 | 157 | case 'c': |
mcimadamore@83 | 158 | return formatPosition(d, COLUMN, l); |
mcimadamore@83 | 159 | case 'o': |
mcimadamore@83 | 160 | return formatPosition(d, OFFSET, l); |
mcimadamore@83 | 161 | case 'p': |
mcimadamore@83 | 162 | return formatKind(d, l); |
mcimadamore@83 | 163 | case 's': |
mcimadamore@83 | 164 | return formatPosition(d, START, l); |
mcimadamore@83 | 165 | case 't': { |
mcimadamore@83 | 166 | boolean usePrefix; |
mcimadamore@83 | 167 | switch (d.getType()) { |
mcimadamore@83 | 168 | case FRAGMENT: |
mcimadamore@83 | 169 | usePrefix = false; |
mcimadamore@83 | 170 | break; |
mcimadamore@83 | 171 | case ERROR: |
mcimadamore@83 | 172 | usePrefix = (d.getIntPosition() == Position.NOPOS); |
mcimadamore@83 | 173 | break; |
mcimadamore@83 | 174 | default: |
mcimadamore@83 | 175 | usePrefix = true; |
mcimadamore@83 | 176 | } |
mcimadamore@83 | 177 | if (usePrefix) |
mcimadamore@83 | 178 | return formatKind(d, l); |
mcimadamore@83 | 179 | else |
mcimadamore@83 | 180 | return ""; |
mcimadamore@83 | 181 | } |
mcimadamore@83 | 182 | case 'm': |
mcimadamore@83 | 183 | return formatMessage(d, l); |
jjg@612 | 184 | case 'L': |
jjg@612 | 185 | return formatLintCategory(d, l); |
mcimadamore@83 | 186 | case '_': |
mcimadamore@83 | 187 | return " "; |
mcimadamore@83 | 188 | case '%': |
mcimadamore@83 | 189 | return "%"; |
mcimadamore@83 | 190 | default: |
mcimadamore@83 | 191 | return String.valueOf(c); |
mcimadamore@83 | 192 | } |
mcimadamore@83 | 193 | } |
mcimadamore@83 | 194 | |
mcimadamore@83 | 195 | private String selectFormat(JCDiagnostic d) { |
mcimadamore@83 | 196 | DiagnosticSource source = d.getDiagnosticSource(); |
mcimadamore@221 | 197 | String format = getConfiguration().getFormat(BasicFormatKind.DEFAULT_NO_POS_FORMAT); |
jjg@519 | 198 | if (source != null && source != DiagnosticSource.NO_SOURCE) { |
mcimadamore@83 | 199 | if (d.getIntPosition() != Position.NOPOS) { |
mcimadamore@221 | 200 | format = getConfiguration().getFormat(BasicFormatKind.DEFAULT_POS_FORMAT); |
mcimadamore@83 | 201 | } else if (source.getFile() != null && |
mcimadamore@83 | 202 | source.getFile().getKind() == JavaFileObject.Kind.CLASS) { |
mcimadamore@221 | 203 | format = getConfiguration().getFormat(BasicFormatKind.DEFAULT_CLASS_FORMAT); |
mcimadamore@83 | 204 | } |
mcimadamore@83 | 205 | } |
mcimadamore@83 | 206 | return format; |
mcimadamore@83 | 207 | } |
mcimadamore@83 | 208 | |
mcimadamore@221 | 209 | @Override |
mcimadamore@221 | 210 | public BasicConfiguration getConfiguration() { |
mcimadamore@288 | 211 | //the following cast is always safe - see init |
mcimadamore@221 | 212 | return (BasicConfiguration)super.getConfiguration(); |
mcimadamore@221 | 213 | } |
mcimadamore@221 | 214 | |
mcimadamore@221 | 215 | static public class BasicConfiguration extends SimpleConfiguration { |
mcimadamore@221 | 216 | |
mcimadamore@221 | 217 | protected Map<DiagnosticPart, Integer> indentationLevels; |
mcimadamore@221 | 218 | protected Map<BasicFormatKind, String> availableFormats; |
mcimadamore@221 | 219 | protected SourcePosition sourcePosition; |
mcimadamore@221 | 220 | |
mcimadamore@221 | 221 | @SuppressWarnings("fallthrough") |
mcimadamore@221 | 222 | public BasicConfiguration(Options options) { |
mcimadamore@221 | 223 | super(options, EnumSet.of(DiagnosticPart.SUMMARY, |
mcimadamore@221 | 224 | DiagnosticPart.DETAILS, |
mcimadamore@221 | 225 | DiagnosticPart.SUBDIAGNOSTICS, |
mcimadamore@221 | 226 | DiagnosticPart.SOURCE)); |
mcimadamore@221 | 227 | initFormat(); |
mcimadamore@221 | 228 | initIndentation(); |
mcimadamore@221 | 229 | String fmt = options.get("diagsFormat"); |
mcimadamore@221 | 230 | if (fmt != null) { |
mcimadamore@221 | 231 | String[] formats = fmt.split("\\|"); |
mcimadamore@221 | 232 | switch (formats.length) { |
mcimadamore@221 | 233 | case 3: |
mcimadamore@221 | 234 | setFormat(BasicFormatKind.DEFAULT_CLASS_FORMAT, formats[2]); |
mcimadamore@221 | 235 | case 2: |
mcimadamore@221 | 236 | setFormat(BasicFormatKind.DEFAULT_NO_POS_FORMAT, formats[1]); |
mcimadamore@221 | 237 | default: |
mcimadamore@221 | 238 | setFormat(BasicFormatKind.DEFAULT_POS_FORMAT, formats[0]); |
mcimadamore@221 | 239 | } |
mcimadamore@221 | 240 | } |
jjg@612 | 241 | String srcPos = null; |
jjg@612 | 242 | if ((((srcPos = options.get("sourcePosition")) != null)) && |
jjg@612 | 243 | srcPos.equals("bottom")) |
mcimadamore@221 | 244 | setSourcePosition(SourcePosition.BOTTOM); |
mcimadamore@221 | 245 | else |
mcimadamore@221 | 246 | setSourcePosition(SourcePosition.AFTER_SUMMARY); |
mcimadamore@221 | 247 | String indent = options.get("diagsIndentation"); |
mcimadamore@221 | 248 | if (indent != null) { |
mcimadamore@221 | 249 | String[] levels = indent.split("\\|"); |
mcimadamore@221 | 250 | try { |
mcimadamore@221 | 251 | switch (levels.length) { |
mcimadamore@221 | 252 | case 5: |
mcimadamore@221 | 253 | setIndentation(DiagnosticPart.JLS, |
mcimadamore@221 | 254 | Integer.parseInt(levels[4])); |
mcimadamore@221 | 255 | case 4: |
mcimadamore@221 | 256 | setIndentation(DiagnosticPart.SUBDIAGNOSTICS, |
mcimadamore@221 | 257 | Integer.parseInt(levels[3])); |
mcimadamore@221 | 258 | case 3: |
mcimadamore@221 | 259 | setIndentation(DiagnosticPart.SOURCE, |
mcimadamore@221 | 260 | Integer.parseInt(levels[2])); |
mcimadamore@221 | 261 | case 2: |
mcimadamore@221 | 262 | setIndentation(DiagnosticPart.DETAILS, |
mcimadamore@221 | 263 | Integer.parseInt(levels[1])); |
mcimadamore@221 | 264 | default: |
mcimadamore@221 | 265 | setIndentation(DiagnosticPart.SUMMARY, |
mcimadamore@221 | 266 | Integer.parseInt(levels[0])); |
mcimadamore@221 | 267 | } |
mcimadamore@221 | 268 | } |
mcimadamore@221 | 269 | catch (NumberFormatException ex) { |
mcimadamore@221 | 270 | initIndentation(); |
mcimadamore@221 | 271 | } |
mcimadamore@221 | 272 | } |
mcimadamore@221 | 273 | } |
mcimadamore@221 | 274 | |
mcimadamore@221 | 275 | public BasicConfiguration() { |
mcimadamore@221 | 276 | super(EnumSet.of(DiagnosticPart.SUMMARY, |
mcimadamore@221 | 277 | DiagnosticPart.DETAILS, |
mcimadamore@221 | 278 | DiagnosticPart.SUBDIAGNOSTICS, |
mcimadamore@221 | 279 | DiagnosticPart.SOURCE)); |
mcimadamore@221 | 280 | initFormat(); |
mcimadamore@221 | 281 | initIndentation(); |
mcimadamore@221 | 282 | } |
mcimadamore@221 | 283 | //where |
mcimadamore@221 | 284 | private void initFormat() { |
mcimadamore@221 | 285 | availableFormats = new HashMap<BasicFormatKind, String>(); |
jjg@612 | 286 | setFormat(BasicFormatKind.DEFAULT_POS_FORMAT, "%f:%l:%_%t%L%m"); |
jjg@612 | 287 | setFormat(BasicFormatKind.DEFAULT_NO_POS_FORMAT, "%p%L%m"); |
jjg@612 | 288 | setFormat(BasicFormatKind.DEFAULT_CLASS_FORMAT, "%f:%_%t%L%m"); |
mcimadamore@221 | 289 | } |
mcimadamore@221 | 290 | //where |
mcimadamore@221 | 291 | private void initIndentation() { |
mcimadamore@221 | 292 | indentationLevels = new HashMap<DiagnosticPart, Integer>(); |
mcimadamore@221 | 293 | setIndentation(DiagnosticPart.SUMMARY, 0); |
mcimadamore@221 | 294 | setIndentation(DiagnosticPart.DETAILS, DetailsInc); |
mcimadamore@221 | 295 | setIndentation(DiagnosticPart.SUBDIAGNOSTICS, DiagInc); |
mcimadamore@221 | 296 | setIndentation(DiagnosticPart.SOURCE, 0); |
mcimadamore@221 | 297 | } |
mcimadamore@221 | 298 | |
mcimadamore@83 | 299 | /** |
mcimadamore@221 | 300 | * Get the amount of spaces for a given indentation kind |
mcimadamore@221 | 301 | * @param diagPart the diagnostic part for which the indentation is |
mcimadamore@221 | 302 | * to be retrieved |
mcimadamore@221 | 303 | * @return the amount of spaces used for the specified indentation kind |
mcimadamore@221 | 304 | */ |
mcimadamore@221 | 305 | public int getIndentation(DiagnosticPart diagPart) { |
mcimadamore@221 | 306 | return indentationLevels.get(diagPart); |
mcimadamore@221 | 307 | } |
mcimadamore@221 | 308 | |
mcimadamore@83 | 309 | /** |
mcimadamore@221 | 310 | * Set the indentation level for various element of a given diagnostic - |
mcimadamore@221 | 311 | * this might lead to more readable diagnostics |
mcimadamore@221 | 312 | * |
mcimadamore@221 | 313 | * @param indentationKind kind of indentation to be set |
mcimadamore@221 | 314 | * @param nSpaces amount of spaces for the specified diagnostic part |
mcimadamore@221 | 315 | */ |
mcimadamore@221 | 316 | public void setIndentation(DiagnosticPart diagPart, int nSpaces) { |
mcimadamore@221 | 317 | indentationLevels.put(diagPart, nSpaces); |
mcimadamore@221 | 318 | } |
mcimadamore@221 | 319 | |
mcimadamore@83 | 320 | /** |
mcimadamore@221 | 321 | * Set the source line positioning used by this formatter |
mcimadamore@221 | 322 | * |
mcimadamore@221 | 323 | * @param sourcePos a positioning value for source line |
mcimadamore@221 | 324 | */ |
mcimadamore@221 | 325 | public void setSourcePosition(SourcePosition sourcePos) { |
mcimadamore@221 | 326 | sourcePosition = sourcePos; |
mcimadamore@221 | 327 | } |
mcimadamore@221 | 328 | |
mcimadamore@221 | 329 | /** |
mcimadamore@221 | 330 | * Get the source line positioning used by this formatter |
mcimadamore@221 | 331 | * |
mcimadamore@221 | 332 | * @return the positioning value used by this formatter |
mcimadamore@221 | 333 | */ |
mcimadamore@221 | 334 | public SourcePosition getSourcePosition() { |
mcimadamore@221 | 335 | return sourcePosition; |
mcimadamore@221 | 336 | } |
mcimadamore@221 | 337 | //where |
mcimadamore@221 | 338 | /** |
mcimadamore@221 | 339 | * A source positioning value controls the position (within a given |
mcimadamore@221 | 340 | * diagnostic message) in which the source line the diagnostic refers to |
mcimadamore@221 | 341 | * should be displayed (if applicable) |
mcimadamore@221 | 342 | */ |
mcimadamore@221 | 343 | public enum SourcePosition { |
mcimadamore@221 | 344 | /** |
mcimadamore@221 | 345 | * Source line is displayed after the diagnostic message |
mcimadamore@221 | 346 | */ |
mcimadamore@221 | 347 | BOTTOM, |
mcimadamore@221 | 348 | /** |
mcimadamore@221 | 349 | * Source line is displayed after the first line of the diagnostic |
mcimadamore@221 | 350 | * message |
mcimadamore@221 | 351 | */ |
mcimadamore@221 | 352 | AFTER_SUMMARY; |
mcimadamore@221 | 353 | } |
mcimadamore@221 | 354 | |
mcimadamore@221 | 355 | /** |
mcimadamore@221 | 356 | * Set a metachar string for a specific format |
mcimadamore@221 | 357 | * |
mcimadamore@221 | 358 | * @param kind the format kind to be set |
mcimadamore@221 | 359 | * @param s the metachar string specifying the format |
mcimadamore@221 | 360 | */ |
mcimadamore@221 | 361 | public void setFormat(BasicFormatKind kind, String s) { |
mcimadamore@221 | 362 | availableFormats.put(kind, s); |
mcimadamore@221 | 363 | } |
mcimadamore@221 | 364 | |
mcimadamore@221 | 365 | /** |
mcimadamore@221 | 366 | * Get a metachar string for a specific format |
mcimadamore@221 | 367 | * |
mcimadamore@221 | 368 | * @param sourcePos a positioning value for source line |
mcimadamore@221 | 369 | */ |
mcimadamore@221 | 370 | public String getFormat(BasicFormatKind kind) { |
mcimadamore@221 | 371 | return availableFormats.get(kind); |
mcimadamore@221 | 372 | } |
mcimadamore@221 | 373 | //where |
mcimadamore@221 | 374 | /** |
mcimadamore@221 | 375 | * This enum contains all the kinds of formatting patterns supported |
mcimadamore@221 | 376 | * by a basic diagnostic formatter. |
mcimadamore@221 | 377 | */ |
mcimadamore@221 | 378 | public enum BasicFormatKind { |
mcimadamore@221 | 379 | /** |
mcimadamore@221 | 380 | * A format string to be used for diagnostics with a given position. |
mcimadamore@221 | 381 | */ |
mcimadamore@221 | 382 | DEFAULT_POS_FORMAT, |
mcimadamore@221 | 383 | /** |
mcimadamore@221 | 384 | * A format string to be used for diagnostics without a given position. |
mcimadamore@221 | 385 | */ |
mcimadamore@221 | 386 | DEFAULT_NO_POS_FORMAT, |
mcimadamore@221 | 387 | /** |
mcimadamore@221 | 388 | * A format string to be used for diagnostics regarding classfiles |
mcimadamore@221 | 389 | */ |
mcimadamore@221 | 390 | DEFAULT_CLASS_FORMAT; |
mcimadamore@221 | 391 | } |
mcimadamore@83 | 392 | } |
mcimadamore@83 | 393 | } |