Class TestDiagnosticUtils

java.lang.Object
org.checkerframework.framework.test.diagnostics.TestDiagnosticUtils

public class TestDiagnosticUtils extends Object
A set of utilities and factory methods useful for working with TestDiagnostics.
  • Field Details

    • DIAGNOSTIC_IN_JAVA_REGEX

      public static final String DIAGNOSTIC_IN_JAVA_REGEX
      How the diagnostics appear in Java source files.
      See Also:
    • DIAGNOSTIC_IN_JAVA_PATTERN

      public static final Pattern DIAGNOSTIC_IN_JAVA_PATTERN
      Pattern compiled from DIAGNOSTIC_IN_JAVA_REGEX.
    • DIAGNOSTIC_WARNING_IN_JAVA_REGEX

      public static final String DIAGNOSTIC_WARNING_IN_JAVA_REGEX
      How the diagnostic warnings appear in Java source files.
      See Also:
    • DIAGNOSTIC_WARNING_IN_JAVA_PATTERN

      public static final Pattern DIAGNOSTIC_WARNING_IN_JAVA_PATTERN
      Pattern compiled from DIAGNOSTIC_WARNING_IN_JAVA_REGEX.
    • DIAGNOSTIC_REGEX

      public static final String DIAGNOSTIC_REGEX
      How the diagnostics appear in javax tools diagnostics from the compiler.
      See Also:
    • DIAGNOSTIC_PATTERN

      public static final Pattern DIAGNOSTIC_PATTERN
      Pattern compiled from DIAGNOSTIC_REGEX.
    • DIAGNOSTIC_WARNING_REGEX

      public static final String DIAGNOSTIC_WARNING_REGEX
      How the diagnostic warnings appear in javax tools diagnostics from the compiler.
      See Also:
    • DIAGNOSTIC_WARNING_PATTERN

      public static final Pattern DIAGNOSTIC_WARNING_PATTERN
      Pattern compiled from DIAGNOSTIC_WARNING_REGEX.
    • DIAGNOSTIC_FILE_REGEX

      public static final String DIAGNOSTIC_FILE_REGEX
      How the diagnostics appear in diagnostic files (.out).
      See Also:
    • DIAGNOSTIC_FILE_PATTERN

      public static final Pattern DIAGNOSTIC_FILE_PATTERN
      Pattern compiled from DIAGNOSTIC_FILE_REGEX.
    • DIAGNOSTIC_FILE_WARNING_REGEX

      public static final String DIAGNOSTIC_FILE_WARNING_REGEX
      How the diagnostic warnings appear in diagnostic files (.out).
      See Also:
    • DIAGNOSTIC_FILE_WARNING_PATTERN

      public static final Pattern DIAGNOSTIC_FILE_WARNING_PATTERN
      Pattern compiled from DIAGNOSTIC_FILE_WARNING_REGEX.
  • Constructor Details

    • TestDiagnosticUtils

      public TestDiagnosticUtils()
  • Method Details

    • fromDiagnosticFileString

      public static TestDiagnostic fromDiagnosticFileString(String stringFromDiagnosticFile)
      Instantiate the diagnostic based on a string that would appear in diagnostic files (i.e. files that only contain line after line of expected diagnostics).
      Parameters:
      stringFromDiagnosticFile - a single diagnostic string to parse
      Returns:
      a new TestDiagnostic
    • fromJavaFileComment

      public static TestDiagnostic fromJavaFileComment(String filename, long lineNumber, String stringFromJavaFile)
      Instantiate the diagnostic from a string that would appear in a Java file, e.g.: "error: (message)"
      Parameters:
      filename - the file containing the diagnostic (and the error)
      lineNumber - the line number of the line immediately below the diagnostic comment in the Java file
      stringFromJavaFile - the string containing the diagnostic
      Returns:
      a new TestDiagnostic
    • fromJavaxToolsDiagnostic

      public static TestDiagnostic fromJavaxToolsDiagnostic(String diagnosticString)
      Instantiate a diagnostic from output produced by the Java compiler. The resulting diagnostic is never fixable and always has parentheses.
      Parameters:
      diagnosticString - the compiler diagnostics string
      Returns:
      the corresponding test diagnostic
    • fromPatternMatching

      protected static TestDiagnostic fromPatternMatching(Pattern diagnosticPattern, Pattern warningPattern, Path file, @Nullable Long lineNumber, String diagnosticString)
      Instantiate the diagnostic via pattern-matching against patterns.
      Parameters:
      diagnosticPattern - a pattern that matches any diagnostic
      warningPattern - a pattern that matches a warning diagnostic
      file - the test file
      lineNumber - the line number
      diagnosticString - the string to parse
      Returns:
      a diagnostic parsed from the given string
    • formatJavaxToolString

      public static org.plumelib.util.IPair<String,Path> formatJavaxToolString(String original)
      Given a javax diagnostic, return a pair of (trimmed, file), where "trimmed" is the message without the leading filename and the file path. As an example: "foo/bar/Baz.java:49: My error message" is turned into IPair.of(":49: My error message", Path("foo/bar/Baz.java")). If the file path cannot be determined, it uses "". This is necessary to make writing the expected warnings easy.
      Parameters:
      original - a javax diagnostic
      Returns:
      the diagnostic, split into message and file
    • isJavaDiagnosticLineStart

      public static boolean isJavaDiagnosticLineStart(String originalLine)
      Return true if this line in a Java file indicates an expected diagnostic that might be continued on the next line.
      Parameters:
      originalLine - the input line
      Returns:
      whether the diagnostic might be continued on the next line
    • handleEndOfLineJavaDiagnostic

      public static String handleEndOfLineJavaDiagnostic(String originalLine)
      Convert an end-of-line diagnostic message to a beginning-of-line one. Returns the argument unchanged if it does not contain an end-of-line diagnostic message.

      Most diagnostics in Java files start at the beginning of a line. Occasionally, javac issues a warning about implicit code, such as an implicit constructor, on the line immediately after a curly brace. The only place to put the expected diagnostic message is on the line with the curly brace.

      This implementation replaces "{ // ::" by "// ::", converting the end-of-line diagnostic message to a beginning-of-line one that the rest of the code can handle. It is rather specific (to avoid false positive matches, such as when "// ::" is commented out in source code). It could be extended in the future if such an extension is necessary.

    • isJavaDiagnosticLineContinuation

      @EnsuresNonNullIf(result=true, expression="#1") public static boolean isJavaDiagnosticLineContinuation(@Nullable String originalLine)
      Return true if this line in a Java file continues an expected diagnostic.
    • continuationPart

      public static String continuationPart(String originalLine)
      Return the continuation part. The argument is such that isJavaDiagnosticLineContinuation(java.lang.String) returns true.
    • fromJavaSourceLine

      public static TestDiagnosticLine fromJavaSourceLine(String filename, String line, long lineNumber)
      Convert a line in a Java source file to a TestDiagnosticLine.

      The input line is possibly the concatenation of multiple source lines, if the diagnostic was split across lines in the source code.

    • fromDiagnosticFileLine

      public static TestDiagnosticLine fromDiagnosticFileLine(String diagnosticLine)
      Convert a line in a DiagnosticFile to a TestDiagnosticLine.
    • fromJavaxToolsDiagnosticList

      public static Set<TestDiagnostic> fromJavaxToolsDiagnosticList(List<Diagnostic<? extends JavaFileObject>> javaxDiagnostics)
      Convert a list of compiler diagnostics into test diagnostics.
      Parameters:
      javaxDiagnostics - the list of compiler diagnostics
      Returns:
      the corresponding test diagnostics
    • diagnosticsToString

      public static List<String> diagnosticsToString(List<TestDiagnostic> diagnostics)
      Converts the given diagnostics to strings (as they would appear in a source file individually).
      Parameters:
      diagnostics - a list of diagnostics
      Returns:
      a list of the diagnastics as they would appear in a source file