mcimadamore@221: /* jjg@929: * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. mcimadamore@221: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. mcimadamore@221: * mcimadamore@221: * This code is free software; you can redistribute it and/or modify it mcimadamore@221: * under the terms of the GNU General Public License version 2 only, as mcimadamore@221: * published by the Free Software Foundation. mcimadamore@221: * mcimadamore@221: * This code is distributed in the hope that it will be useful, but WITHOUT mcimadamore@221: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or mcimadamore@221: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License mcimadamore@221: * version 2 for more details (a copy is included in the LICENSE file that mcimadamore@221: * accompanied this code). mcimadamore@221: * mcimadamore@221: * You should have received a copy of the GNU General Public License version mcimadamore@221: * 2 along with this work; if not, write to the Free Software Foundation, mcimadamore@221: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. mcimadamore@221: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. mcimadamore@221: */ mcimadamore@221: mcimadamore@221: /** mcimadamore@221: * @test mcimadamore@221: * @bug 6769027 mcimadamore@221: * @summary Source line should be displayed immediately after the first diagnostic line mcimadamore@221: * @author Maurizio Cimadamore mcimadamore@221: * @run main/othervm T6769027 mcimadamore@221: */ mcimadamore@221: import java.net.URI; mcimadamore@221: import java.util.regex.Matcher; mcimadamore@221: import javax.tools.*; mcimadamore@221: import com.sun.tools.javac.util.*; mcimadamore@221: mcimadamore@221: public class T6769027 { mcimadamore@221: mcimadamore@221: enum OutputKind { mcimadamore@221: RAW("rawDiagnostics","rawDiagnostics"), mcimadamore@221: BASIC("",""); mcimadamore@221: mcimadamore@221: String key; mcimadamore@221: String value; mcimadamore@221: mcimadamore@221: void init(Options opts) { mcimadamore@221: opts.put(key, value); mcimadamore@221: } mcimadamore@221: mcimadamore@221: OutputKind(String key, String value) { mcimadamore@221: this.key = key; mcimadamore@221: this.value = value; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum CaretKind { mcimadamore@221: DEFAULT("", ""), mcimadamore@221: SHOW("showCaret","true"), mcimadamore@221: HIDE("showCaret","false"); mcimadamore@221: mcimadamore@221: String key; mcimadamore@221: String value; mcimadamore@221: mcimadamore@221: void init(Options opts) { mcimadamore@221: opts.put(key, value); mcimadamore@221: } mcimadamore@221: mcimadamore@221: CaretKind(String key, String value) { mcimadamore@221: this.key = key; mcimadamore@221: this.value = value; mcimadamore@221: } mcimadamore@221: mcimadamore@221: boolean isEnabled() { mcimadamore@221: return this == DEFAULT || this == SHOW; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum SourceLineKind { mcimadamore@221: DEFAULT("", ""), mcimadamore@221: AFTER_SUMMARY("sourcePosition", "top"), mcimadamore@221: BOTTOM("sourcePosition", "bottom"); mcimadamore@221: mcimadamore@221: String key; mcimadamore@221: String value; mcimadamore@221: mcimadamore@221: void init(Options opts) { mcimadamore@221: opts.put(key, value); mcimadamore@221: } mcimadamore@221: mcimadamore@221: SourceLineKind(String key, String value) { mcimadamore@221: this.key = key; mcimadamore@221: this.value = value; mcimadamore@221: } mcimadamore@221: mcimadamore@221: boolean isAfterSummary() { mcimadamore@221: return this == DEFAULT || this == AFTER_SUMMARY; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum XDiagsSource { mcimadamore@221: DEFAULT(""), mcimadamore@221: SOURCE("source"), mcimadamore@221: NO_SOURCE("-source"); mcimadamore@221: mcimadamore@221: String flag; mcimadamore@221: mcimadamore@221: void init(Options opts) { mcimadamore@221: if (this != DEFAULT) { mcimadamore@221: String flags = opts.get("diags"); mcimadamore@221: flags = flags == null ? flag : flags + "," + flag; mcimadamore@221: opts.put("diags", flags); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: XDiagsSource(String flag) { mcimadamore@221: this.flag = flag; mcimadamore@221: } mcimadamore@221: mcimadamore@221: String getOutput(CaretKind caretKind, IndentKind indent, OutputKind outKind) { mcimadamore@221: String spaces = (outKind == OutputKind.BASIC) ? indent.string : ""; mcimadamore@221: return "\n" + spaces + "This is a source line" + mcimadamore@221: (caretKind.isEnabled() ? "\n" + spaces + " ^" : ""); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum XDiagsCompact { mcimadamore@221: DEFAULT(""), mcimadamore@221: COMPACT("short"), mcimadamore@221: NO_COMPACT("-short"); mcimadamore@221: mcimadamore@221: String flag; mcimadamore@221: mcimadamore@221: void init(Options opts) { mcimadamore@221: if (this != DEFAULT) { mcimadamore@221: String flags = opts.get("diags"); mcimadamore@221: flags = flags == null ? flag : flags + "," + flag; mcimadamore@221: opts.put("diags", flags); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: XDiagsCompact(String flag) { mcimadamore@221: this.flag = flag; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum ErrorKind { mcimadamore@221: SINGLE("single", mcimadamore@221: "compiler.err.single: Hello!", mcimadamore@221: "KXThis is a test error message Hello!"), mcimadamore@221: DOUBLE("double", mcimadamore@221: "compiler.err.double: Hello!", mcimadamore@221: "KXThis is a test error message.\n" + mcimadamore@221: "KXYThis is another line of the above error message Hello!"); mcimadamore@221: mcimadamore@221: String key; mcimadamore@221: String rawOutput; mcimadamore@221: String nonRawOutput; mcimadamore@221: mcimadamore@221: String key() { mcimadamore@221: return key; mcimadamore@221: } mcimadamore@221: mcimadamore@221: ErrorKind(String key, String rawOutput, String nonRawOutput) { mcimadamore@221: this.key = key; mcimadamore@221: this.rawOutput = rawOutput; mcimadamore@221: this.nonRawOutput = nonRawOutput; mcimadamore@221: } mcimadamore@221: mcimadamore@221: String getOutput(OutputKind outKind, IndentKind summaryIndent, IndentKind detailsIndent) { mcimadamore@221: return outKind == OutputKind.RAW ? mcimadamore@221: rawOutput : mcimadamore@221: nonRawOutput.replace("X", summaryIndent.string).replace("Y", detailsIndent.string).replace("K", ""); mcimadamore@221: } mcimadamore@221: mcimadamore@221: String getOutput(OutputKind outKind, IndentKind summaryIndent, IndentKind detailsIndent, String indent) { mcimadamore@221: return outKind == OutputKind.RAW ? mcimadamore@221: rawOutput : mcimadamore@221: nonRawOutput.replace("X", summaryIndent.string).replace("Y", detailsIndent.string).replace("K", indent); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum MultilineKind { mcimadamore@221: NONE(0), mcimadamore@221: DOUBLE(1), mcimadamore@221: NESTED(2), mcimadamore@221: DOUBLE_NESTED(3); mcimadamore@221: mcimadamore@221: static String[][] rawTemplates = { mcimadamore@221: {"", ",{(E),(E)}", ",{(E,{(E)})}", ",{(E,{(E)}),(E,{(E)})}"}, //ENABLED mcimadamore@221: {"", "", "", "",""}, //DISABLED mcimadamore@221: {"", ",{(E)}", ",{(E,{(E)})}", ",{(E,{(E)})}"}, //LIMIT_LENGTH mcimadamore@221: {"", ",{(E),(E)}", ",{(E)}", ",{(E),(E)}"}, //LIMIT_DEPTH mcimadamore@221: {"", ",{(E)}", ",{(E)}", ",{(E)}"}}; //LIMIT_BOTH mcimadamore@221: mcimadamore@221: static String[][] basicTemplates = { mcimadamore@221: {"", "\nE\nE", "\nE\nQ", "\nE\nQ\nE\nQ"}, //ENABLED mcimadamore@221: {"", "", "", "",""}, //DISABLED mcimadamore@221: {"", "\nE", "\nE\nQ", "\nE\nQ"}, //LIMIT_LENGTH mcimadamore@221: {"", "\nE\nE", "\nE", "\nE\nE"}, //LIMIT_DEPTH mcimadamore@221: {"", "\nE", "\nE", "\nE"}}; //LIMIT_BOTH mcimadamore@221: mcimadamore@221: mcimadamore@221: int index; mcimadamore@221: mcimadamore@221: MultilineKind (int index) { mcimadamore@221: this.index = index; mcimadamore@221: } mcimadamore@221: mcimadamore@221: boolean isDouble() { mcimadamore@221: return this == DOUBLE || this == DOUBLE_NESTED; mcimadamore@221: } mcimadamore@221: mcimadamore@221: boolean isNested() { mcimadamore@221: return this == NESTED || this == DOUBLE_NESTED; mcimadamore@221: } mcimadamore@221: mcimadamore@221: String getOutput(OutputKind outKind, ErrorKind errKind, MultilinePolicy policy, mcimadamore@221: IndentKind summaryIndent, IndentKind detailsIndent, IndentKind multiIndent) { mcimadamore@221: String constIndent = (errKind == ErrorKind.DOUBLE) ? mcimadamore@221: summaryIndent.string + detailsIndent.string : mcimadamore@221: summaryIndent.string; mcimadamore@221: constIndent += multiIndent.string; mcimadamore@221: mcimadamore@221: String errMsg1 = errKind.getOutput(outKind, summaryIndent, detailsIndent, constIndent); mcimadamore@221: String errMsg2 = errKind.getOutput(outKind, summaryIndent, detailsIndent, constIndent + constIndent); mcimadamore@221: mcimadamore@221: errMsg1 = errMsg1.replaceAll("compiler.err", "compiler.misc"); mcimadamore@221: errMsg1 = errMsg1.replaceAll("error message", "subdiagnostic"); mcimadamore@221: errMsg2 = errMsg2.replaceAll("compiler.err", "compiler.misc"); mcimadamore@221: errMsg2 = errMsg2.replaceAll("error message", "subdiagnostic"); mcimadamore@221: mcimadamore@221: String template = outKind == OutputKind.RAW ? mcimadamore@221: rawTemplates[policy.index][index] : mcimadamore@221: basicTemplates[policy.index][index]; mcimadamore@221: mcimadamore@221: template = template.replaceAll("E", errMsg1); mcimadamore@221: return template.replaceAll("Q", errMsg2); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum MultilinePolicy { mcimadamore@221: ENABLED(0, "multilinePolicy", "enabled"), mcimadamore@221: DISABLED(1, "multilinePolicy", "disabled"), mcimadamore@221: LIMIT_LENGTH(2, "multilinePolicy", "limit:1:*"), mcimadamore@221: LIMIT_DEPTH(3, "multilinePolicy", "limit:*:1"), mcimadamore@221: LIMIT_BOTH(4, "multilinePolicy", "limit:1:1"); mcimadamore@221: mcimadamore@221: String name; mcimadamore@221: String value; mcimadamore@221: int index; mcimadamore@221: mcimadamore@221: MultilinePolicy(int index, String name, String value) { mcimadamore@221: this.name = name; mcimadamore@221: this.value = value; mcimadamore@221: this.index = index; mcimadamore@221: } mcimadamore@221: mcimadamore@221: void init(Options options) { mcimadamore@221: options.put(name, value); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum PositionKind { mcimadamore@221: NOPOS(Position.NOPOS, "- ", "error: "), jjg@929: POS(5, "Test.java:1:6: ", "/Test.java:1: error: "); mcimadamore@221: mcimadamore@221: int pos; mcimadamore@221: String rawOutput; mcimadamore@221: String nonRawOutput; mcimadamore@221: mcimadamore@221: PositionKind(int pos, String rawOutput, String nonRawOutput) { mcimadamore@221: this.pos = pos; mcimadamore@221: this.rawOutput = rawOutput; mcimadamore@221: this.nonRawOutput = nonRawOutput; mcimadamore@221: } mcimadamore@221: mcimadamore@221: JCDiagnostic.DiagnosticPosition pos() { mcimadamore@221: return new JCDiagnostic.SimpleDiagnosticPosition(pos); mcimadamore@221: } mcimadamore@221: mcimadamore@221: String getOutput(OutputKind outputKind) { mcimadamore@221: return outputKind == OutputKind.RAW ? mcimadamore@221: rawOutput : mcimadamore@221: nonRawOutput; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: static class MyFileObject extends SimpleJavaFileObject { mcimadamore@221: private String text; mcimadamore@221: public MyFileObject(String text) { mcimadamore@221: super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); mcimadamore@221: this.text = text; mcimadamore@221: } mcimadamore@221: @Override mcimadamore@221: public CharSequence getCharContent(boolean ignoreEncodingErrors) { mcimadamore@221: return text; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: enum IndentKind { mcimadamore@221: NONE(""), mcimadamore@221: CUSTOM(" "); mcimadamore@221: mcimadamore@221: String string; mcimadamore@221: mcimadamore@221: IndentKind(String indent) { mcimadamore@221: string = indent; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: class MyLog extends Log { mcimadamore@221: MyLog(Context ctx) { mcimadamore@221: super(ctx); mcimadamore@221: } mcimadamore@221: mcimadamore@221: @Override mcimadamore@221: protected java.io.PrintWriter getWriterForDiagnosticType(JCDiagnostic.DiagnosticType dt) { mcimadamore@221: return new java.io.PrintWriter(System.out); mcimadamore@221: } mcimadamore@221: mcimadamore@221: @Override mcimadamore@221: protected boolean shouldReport(JavaFileObject jfo, int pos) { mcimadamore@221: return true; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: int nerrors = 0; mcimadamore@221: mcimadamore@221: void exec(OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind, mcimadamore@221: MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource, mcimadamore@221: XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind, mcimadamore@221: IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent, mcimadamore@221: IndentKind subdiagsIndent) { mcimadamore@221: Context ctx = new Context(); mcimadamore@221: Options options = Options.instance(ctx); mcimadamore@221: outputKind.init(options); mcimadamore@221: multiPolicy.init(options); mcimadamore@221: xdiagsSource.init(options); mcimadamore@221: xdiagsCompact.init(options); mcimadamore@221: caretKind.init(options); mcimadamore@221: sourceLineKind.init(options); mcimadamore@221: String indentString = ""; mcimadamore@221: indentString = (summaryIndent == IndentKind.CUSTOM) ? "3" : "0"; mcimadamore@221: indentString += (detailsIndent == IndentKind.CUSTOM) ? "|3" : "|0"; mcimadamore@221: indentString += (sourceIndent == IndentKind.CUSTOM) ? "|3" : "|0"; mcimadamore@221: indentString += (subdiagsIndent == IndentKind.CUSTOM) ? "|3" : "|0"; mcimadamore@221: options.put("diagsIndentation", indentString); mcimadamore@221: MyLog log = new MyLog(ctx); mcimadamore@221: JavacMessages messages = JavacMessages.instance(ctx); mcimadamore@221: messages.add("tester"); mcimadamore@221: JCDiagnostic.Factory diags = JCDiagnostic.Factory.instance(ctx); mcimadamore@221: log.useSource(new MyFileObject("This is a source line")); mcimadamore@221: JCDiagnostic d = diags.error(log.currentSource(), mcimadamore@221: posKind.pos(), mcimadamore@221: errorKind.key(), "Hello!"); mcimadamore@221: if (multiKind != MultilineKind.NONE) { mcimadamore@221: JCDiagnostic sub = diags.fragment(errorKind.key(), "Hello!"); mcimadamore@221: if (multiKind.isNested()) mcimadamore@221: sub = new JCDiagnostic.MultilineDiagnostic(sub, List.of(sub)); mcimadamore@221: List subdiags = multiKind.isDouble() ? mcimadamore@221: List.of(sub, sub) : mcimadamore@221: List.of(sub); mcimadamore@221: d = new JCDiagnostic.MultilineDiagnostic(d, subdiags); mcimadamore@221: } mcimadamore@221: String diag = log.getDiagnosticFormatter().format(d, messages.getCurrentLocale()); mcimadamore@221: checkOutput(diag, mcimadamore@221: outputKind, mcimadamore@221: errorKind, mcimadamore@221: multiKind, mcimadamore@221: multiPolicy, mcimadamore@221: posKind, mcimadamore@221: xdiagsSource, mcimadamore@221: xdiagsCompact, mcimadamore@221: caretKind, mcimadamore@221: sourceLineKind, mcimadamore@221: summaryIndent, mcimadamore@221: detailsIndent, mcimadamore@221: sourceIndent, mcimadamore@221: subdiagsIndent); mcimadamore@221: } mcimadamore@221: mcimadamore@221: void test() { mcimadamore@221: for (OutputKind outputKind : OutputKind.values()) { mcimadamore@221: for (ErrorKind errKind : ErrorKind.values()) { mcimadamore@221: for (MultilineKind multiKind : MultilineKind.values()) { mcimadamore@221: for (MultilinePolicy multiPolicy : MultilinePolicy.values()) { mcimadamore@221: for (PositionKind posKind : PositionKind.values()) { mcimadamore@221: for (XDiagsSource xdiagsSource : XDiagsSource.values()) { mcimadamore@221: for (XDiagsCompact xdiagsCompact : XDiagsCompact.values()) { mcimadamore@221: for (CaretKind caretKind : CaretKind.values()) { mcimadamore@221: for (SourceLineKind sourceLineKind : SourceLineKind.values()) { mcimadamore@221: for (IndentKind summaryIndent : IndentKind.values()) { mcimadamore@221: for (IndentKind detailsIndent : IndentKind.values()) { mcimadamore@221: for (IndentKind sourceIndent : IndentKind.values()) { mcimadamore@221: for (IndentKind subdiagsIndent : IndentKind.values()) { mcimadamore@221: exec(outputKind, mcimadamore@221: errKind, mcimadamore@221: multiKind, mcimadamore@221: multiPolicy, mcimadamore@221: posKind, mcimadamore@221: xdiagsSource, mcimadamore@221: xdiagsCompact, mcimadamore@221: caretKind, mcimadamore@221: sourceLineKind, mcimadamore@221: summaryIndent, mcimadamore@221: detailsIndent, mcimadamore@221: sourceIndent, mcimadamore@221: subdiagsIndent); mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: } mcimadamore@221: if (nerrors != 0) mcimadamore@221: throw new AssertionError(nerrors + " errors found"); mcimadamore@221: } mcimadamore@221: mcimadamore@221: void printInfo(String msg, OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind, mcimadamore@221: MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource, mcimadamore@221: XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind, mcimadamore@221: IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent, mcimadamore@221: IndentKind subdiagsIndent, String errorLine) { mcimadamore@221: String sep = "*********************************************************"; mcimadamore@221: String desc = "raw=" + outputKind + " pos=" + posKind + " key=" + errorKind.key() + mcimadamore@221: " multiline=" + multiKind +" multiPolicy=" + multiPolicy.value + mcimadamore@221: " diags= " + java.util.Arrays.asList(xdiagsSource.flag, xdiagsCompact.flag) + mcimadamore@221: " caret=" + caretKind + " sourcePosition=" + sourceLineKind + mcimadamore@221: " summaryIndent=" + summaryIndent + " detailsIndent=" + detailsIndent + mcimadamore@221: " sourceIndent=" + sourceIndent + " subdiagsIndent=" + subdiagsIndent; mcimadamore@221: System.out.println(sep); mcimadamore@221: System.out.println(desc); mcimadamore@221: System.out.println(sep); mcimadamore@221: System.out.println(msg); mcimadamore@221: System.out.println("Diagnostic formatting problem - expected diagnostic...\n" + errorLine); mcimadamore@221: } mcimadamore@221: mcimadamore@221: void checkOutput(String msg, OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind, mcimadamore@221: MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource, mcimadamore@221: XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind, mcimadamore@221: IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent, mcimadamore@221: IndentKind subdiagsIndent) { mcimadamore@221: boolean shouldPrintSource = posKind == PositionKind.POS && mcimadamore@221: xdiagsSource != XDiagsSource.NO_SOURCE && mcimadamore@221: (xdiagsSource == XDiagsSource.SOURCE || mcimadamore@221: outputKind == OutputKind.BASIC); mcimadamore@221: String errorLine = posKind.getOutput(outputKind) + mcimadamore@221: errorKind.getOutput(outputKind, summaryIndent, detailsIndent); mcimadamore@221: if (xdiagsCompact != XDiagsCompact.COMPACT) mcimadamore@221: errorLine += multiKind.getOutput(outputKind, errorKind, multiPolicy, summaryIndent, detailsIndent, subdiagsIndent); mcimadamore@221: String[] lines = errorLine.split("\n"); mcimadamore@221: if (xdiagsCompact == XDiagsCompact.COMPACT) { mcimadamore@221: errorLine = lines[0]; mcimadamore@221: lines = new String[] {errorLine}; mcimadamore@221: } mcimadamore@221: if (shouldPrintSource) { mcimadamore@221: if (sourceLineKind.isAfterSummary()) { mcimadamore@221: String sep = "\n"; mcimadamore@221: if (lines.length == 1) { mcimadamore@221: errorLine += "\n"; mcimadamore@221: sep = ""; mcimadamore@221: } mcimadamore@221: errorLine = errorLine.replaceFirst("\n", mcimadamore@221: Matcher.quoteReplacement(xdiagsSource.getOutput(caretKind, sourceIndent, outputKind) + sep)); mcimadamore@221: } mcimadamore@221: else mcimadamore@221: errorLine += xdiagsSource.getOutput(caretKind, sourceIndent, outputKind); mcimadamore@221: } mcimadamore@221: mcimadamore@221: if (!msg.equals(errorLine)) { mcimadamore@221: printInfo(msg, mcimadamore@221: outputKind, mcimadamore@221: errorKind, mcimadamore@221: multiKind, mcimadamore@221: multiPolicy, mcimadamore@221: posKind, mcimadamore@221: xdiagsSource, mcimadamore@221: xdiagsCompact, mcimadamore@221: caretKind, mcimadamore@221: sourceLineKind, mcimadamore@221: summaryIndent, mcimadamore@221: detailsIndent, mcimadamore@221: sourceIndent, mcimadamore@221: subdiagsIndent, mcimadamore@221: errorLine); mcimadamore@221: nerrors++; mcimadamore@221: } mcimadamore@221: } mcimadamore@221: mcimadamore@221: public static void main(String... args) throws Exception { mcimadamore@221: new T6769027().test(); mcimadamore@221: } mcimadamore@221: }