langtools/test/tools/javac/Diagnostics/6769027/T6769027.java
changeset 15040 99fd9483d3f0
parent 8843 2602bd5c9c5f
child 15384 5a8d00abf076
equal deleted inserted replaced
15039:80190ab051c0 15040:99fd9483d3f0
     1 /*
     1 /*
     2  * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    24 /**
    24 /**
    25  * @test
    25  * @test
    26  * @bug     6769027
    26  * @bug     6769027
    27  * @summary Source line should be displayed immediately after the first diagnostic line
    27  * @summary Source line should be displayed immediately after the first diagnostic line
    28  * @author  Maurizio Cimadamore
    28  * @author  Maurizio Cimadamore
       
    29  * @library ../../lib
       
    30  * @build JavacTestingAbstractThreadedTest
    29  * @run main/othervm T6769027
    31  * @run main/othervm T6769027
    30  */
    32  */
       
    33 
    31 import java.net.URI;
    34 import java.net.URI;
    32 import java.util.regex.Matcher;
    35 import java.util.regex.Matcher;
    33 import javax.tools.*;
    36 import javax.tools.*;
    34 import com.sun.tools.javac.util.*;
    37 import com.sun.tools.javac.util.*;
    35 
    38 
    36 public class T6769027 {
    39 public class T6769027
       
    40     extends JavacTestingAbstractThreadedTest
       
    41     implements Runnable {
    37 
    42 
    38     enum OutputKind {
    43     enum OutputKind {
    39         RAW("rawDiagnostics","rawDiagnostics"),
    44         RAW("rawDiagnostics","rawDiagnostics"),
    40         BASIC("","");
    45         BASIC("","");
    41 
    46 
   312             super(ctx);
   317             super(ctx);
   313         }
   318         }
   314 
   319 
   315         @Override
   320         @Override
   316         protected java.io.PrintWriter getWriterForDiagnosticType(JCDiagnostic.DiagnosticType dt) {
   321         protected java.io.PrintWriter getWriterForDiagnosticType(JCDiagnostic.DiagnosticType dt) {
   317             return new java.io.PrintWriter(System.out);
   322             return outWriter;
   318         }
   323         }
   319 
   324 
   320         @Override
   325         @Override
   321         protected boolean shouldReport(JavaFileObject jfo, int pos) {
   326         protected boolean shouldReport(JavaFileObject jfo, int pos) {
   322             return true;
   327             return true;
   323         }
   328         }
   324     }
   329     }
   325 
   330 
   326     int nerrors = 0;
   331     OutputKind outputKind;
   327 
   332     ErrorKind errorKind;
   328     void exec(OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind,
   333     MultilineKind multiKind;
       
   334     MultilinePolicy multiPolicy;
       
   335     PositionKind posKind;
       
   336     XDiagsSource xdiagsSource;
       
   337     XDiagsCompact xdiagsCompact;
       
   338     CaretKind caretKind;
       
   339     SourceLineKind sourceLineKind;
       
   340     IndentKind summaryIndent;
       
   341     IndentKind detailsIndent;
       
   342     IndentKind sourceIndent;
       
   343     IndentKind subdiagsIndent;
       
   344 
       
   345     T6769027(OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind,
   329             MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource,
   346             MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource,
   330             XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind,
   347             XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind,
   331             IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent,
   348             IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent,
   332             IndentKind subdiagsIndent) {
   349             IndentKind subdiagsIndent) {
       
   350         this.outputKind = outputKind;
       
   351         this.errorKind = errorKind;
       
   352         this.multiKind = multiKind;
       
   353         this.multiPolicy = multiPolicy;
       
   354         this.posKind = posKind;
       
   355         this.xdiagsSource = xdiagsSource;
       
   356         this.xdiagsCompact = xdiagsCompact;
       
   357         this.caretKind = caretKind;
       
   358         this.sourceLineKind = sourceLineKind;
       
   359         this.summaryIndent = summaryIndent;
       
   360         this.detailsIndent = detailsIndent;
       
   361         this.sourceIndent = sourceIndent;
       
   362         this.subdiagsIndent = subdiagsIndent;
       
   363     }
       
   364 
       
   365     @Override
       
   366     public void run() {
   333         Context ctx = new Context();
   367         Context ctx = new Context();
   334         Options options = Options.instance(ctx);
   368         Options options = Options.instance(ctx);
   335         outputKind.init(options);
   369         outputKind.init(options);
   336         multiPolicy.init(options);
   370         multiPolicy.init(options);
   337         xdiagsSource.init(options);
   371         xdiagsSource.init(options);
   360                 List.of(sub, sub) :
   394                 List.of(sub, sub) :
   361                 List.of(sub);
   395                 List.of(sub);
   362             d = new JCDiagnostic.MultilineDiagnostic(d, subdiags);
   396             d = new JCDiagnostic.MultilineDiagnostic(d, subdiags);
   363         }
   397         }
   364         String diag = log.getDiagnosticFormatter().format(d, messages.getCurrentLocale());
   398         String diag = log.getDiagnosticFormatter().format(d, messages.getCurrentLocale());
   365         checkOutput(diag,
   399         checkOutput(diag);
   366                 outputKind,
   400     }
   367                 errorKind,
   401 
   368                 multiKind,
   402     public static void main(String[] args) throws Exception {
   369                 multiPolicy,
       
   370                 posKind,
       
   371                 xdiagsSource,
       
   372                 xdiagsCompact,
       
   373                 caretKind,
       
   374                 sourceLineKind,
       
   375                 summaryIndent,
       
   376                 detailsIndent,
       
   377                 sourceIndent,
       
   378                 subdiagsIndent);
       
   379     }
       
   380 
       
   381     void test() {
       
   382         for (OutputKind outputKind : OutputKind.values()) {
   403         for (OutputKind outputKind : OutputKind.values()) {
   383             for (ErrorKind errKind : ErrorKind.values()) {
   404             for (ErrorKind errKind : ErrorKind.values()) {
   384                 for (MultilineKind multiKind : MultilineKind.values()) {
   405                 for (MultilineKind multiKind : MultilineKind.values()) {
   385                     for (MultilinePolicy multiPolicy : MultilinePolicy.values()) {
   406                     for (MultilinePolicy multiPolicy : MultilinePolicy.values()) {
   386                         for (PositionKind posKind : PositionKind.values()) {
   407                         for (PositionKind posKind : PositionKind.values()) {
   390                                         for (SourceLineKind sourceLineKind : SourceLineKind.values()) {
   411                                         for (SourceLineKind sourceLineKind : SourceLineKind.values()) {
   391                                             for (IndentKind summaryIndent : IndentKind.values()) {
   412                                             for (IndentKind summaryIndent : IndentKind.values()) {
   392                                                 for (IndentKind detailsIndent : IndentKind.values()) {
   413                                                 for (IndentKind detailsIndent : IndentKind.values()) {
   393                                                     for (IndentKind sourceIndent : IndentKind.values()) {
   414                                                     for (IndentKind sourceIndent : IndentKind.values()) {
   394                                                         for (IndentKind subdiagsIndent : IndentKind.values()) {
   415                                                         for (IndentKind subdiagsIndent : IndentKind.values()) {
   395                                                             exec(outputKind,
   416                                                             pool.execute(new T6769027(outputKind,
   396                                                                 errKind,
   417                                                                 errKind,
   397                                                                 multiKind,
   418                                                                 multiKind,
   398                                                                 multiPolicy,
   419                                                                 multiPolicy,
   399                                                                 posKind,
   420                                                                 posKind,
   400                                                                 xdiagsSource,
   421                                                                 xdiagsSource,
   402                                                                 caretKind,
   423                                                                 caretKind,
   403                                                                 sourceLineKind,
   424                                                                 sourceLineKind,
   404                                                                 summaryIndent,
   425                                                                 summaryIndent,
   405                                                                 detailsIndent,
   426                                                                 detailsIndent,
   406                                                                 sourceIndent,
   427                                                                 sourceIndent,
   407                                                                 subdiagsIndent);
   428                                                                 subdiagsIndent));
   408                                                         }
   429                                                         }
   409                                                     }
   430                                                     }
   410                                                 }
   431                                                 }
   411                                             }
   432                                             }
   412                                         }
   433                                         }
   416                         }
   437                         }
   417                     }
   438                     }
   418                 }
   439                 }
   419             }
   440             }
   420         }
   441         }
   421         if (nerrors != 0)
   442 
   422             throw new AssertionError(nerrors + " errors found");
   443         checkAfterExec(false);
   423     }
   444     }
   424 
   445 
   425     void printInfo(String msg, OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind,
   446     void printInfo(String msg, String errorLine) {
   426             MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource,
       
   427             XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind,
       
   428             IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent,
       
   429             IndentKind subdiagsIndent, String errorLine) {
       
   430         String sep = "*********************************************************";
   447         String sep = "*********************************************************";
   431         String desc = "raw=" + outputKind + " pos=" + posKind + " key=" + errorKind.key() +
   448         String desc = "raw=" + outputKind + " pos=" + posKind + " key=" + errorKind.key() +
   432                 " multiline=" + multiKind +" multiPolicy=" + multiPolicy.value +
   449                 " multiline=" + multiKind +" multiPolicy=" + multiPolicy.value +
   433                 " diags= " + java.util.Arrays.asList(xdiagsSource.flag, xdiagsCompact.flag) +
   450                 " diags= " + java.util.Arrays.asList(xdiagsSource.flag, xdiagsCompact.flag) +
   434                 " caret=" + caretKind + " sourcePosition=" + sourceLineKind +
   451                 " caret=" + caretKind + " sourcePosition=" + sourceLineKind +
   435                 " summaryIndent=" + summaryIndent + " detailsIndent=" + detailsIndent +
   452                 " summaryIndent=" + summaryIndent + " detailsIndent=" + detailsIndent +
   436                 " sourceIndent=" + sourceIndent + " subdiagsIndent=" + subdiagsIndent;
   453                 " sourceIndent=" + sourceIndent + " subdiagsIndent=" + subdiagsIndent;
   437         System.out.println(sep);
   454         errWriter.println(sep);
   438         System.out.println(desc);
   455         errWriter.println(desc);
   439         System.out.println(sep);
   456         errWriter.println(sep);
   440         System.out.println(msg);
   457         errWriter.println(msg);
   441         System.out.println("Diagnostic formatting problem - expected diagnostic...\n" + errorLine);
   458         errWriter.println("Diagnostic formatting problem - expected diagnostic...\n" + errorLine);
   442     }
   459     }
   443 
   460 
   444     void checkOutput(String msg, OutputKind outputKind, ErrorKind errorKind, MultilineKind multiKind,
   461     void checkOutput(String msg) {
   445             MultilinePolicy multiPolicy, PositionKind posKind, XDiagsSource xdiagsSource,
       
   446             XDiagsCompact xdiagsCompact, CaretKind caretKind, SourceLineKind sourceLineKind,
       
   447             IndentKind summaryIndent, IndentKind detailsIndent, IndentKind sourceIndent,
       
   448             IndentKind subdiagsIndent) {
       
   449         boolean shouldPrintSource = posKind == PositionKind.POS &&
   462         boolean shouldPrintSource = posKind == PositionKind.POS &&
   450                 xdiagsSource != XDiagsSource.NO_SOURCE &&
   463                 xdiagsSource != XDiagsSource.NO_SOURCE &&
   451                 (xdiagsSource == XDiagsSource.SOURCE ||
   464                 (xdiagsSource == XDiagsSource.SOURCE ||
   452                 outputKind == OutputKind.BASIC);
   465                 outputKind == OutputKind.BASIC);
   453         String errorLine = posKind.getOutput(outputKind) +
   466         String errorLine = posKind.getOutput(outputKind) +
   454                 errorKind.getOutput(outputKind, summaryIndent, detailsIndent);
   467                 errorKind.getOutput(outputKind, summaryIndent, detailsIndent);
   455         if (xdiagsCompact != XDiagsCompact.COMPACT)
   468         if (xdiagsCompact != XDiagsCompact.COMPACT)
   456             errorLine += multiKind.getOutput(outputKind, errorKind, multiPolicy, summaryIndent, detailsIndent, subdiagsIndent);
   469             errorLine += multiKind.getOutput(outputKind, errorKind, multiPolicy,
       
   470                     summaryIndent, detailsIndent, subdiagsIndent);
   457         String[] lines = errorLine.split("\n");
   471         String[] lines = errorLine.split("\n");
   458         if (xdiagsCompact == XDiagsCompact.COMPACT) {
   472         if (xdiagsCompact == XDiagsCompact.COMPACT) {
   459             errorLine = lines[0];
   473             errorLine = lines[0];
   460             lines = new String[] {errorLine};
   474             lines = new String[] {errorLine};
   461         }
   475         }
   472             else
   486             else
   473                 errorLine += xdiagsSource.getOutput(caretKind, sourceIndent, outputKind);
   487                 errorLine += xdiagsSource.getOutput(caretKind, sourceIndent, outputKind);
   474         }
   488         }
   475 
   489 
   476         if (!msg.equals(errorLine)) {
   490         if (!msg.equals(errorLine)) {
   477             printInfo(msg,
   491             printInfo(msg, errorLine);
   478                     outputKind,
   492             errCount.incrementAndGet();
   479                     errorKind,
   493         }
   480                     multiKind,
   494     }
   481                     multiPolicy,
   495 
   482                     posKind,
       
   483                     xdiagsSource,
       
   484                     xdiagsCompact,
       
   485                     caretKind,
       
   486                     sourceLineKind,
       
   487                     summaryIndent,
       
   488                     detailsIndent,
       
   489                     sourceIndent,
       
   490                     subdiagsIndent,
       
   491                     errorLine);
       
   492             nerrors++;
       
   493         }
       
   494     }
       
   495 
       
   496     public static void main(String... args) throws Exception {
       
   497         new T6769027().test();
       
   498     }
       
   499 }
   496 }