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
      How the diagnostics appear in Java source files.
    • DIAGNOSTIC_WARNING_IN_JAVA_REGEX

      public static final String DIAGNOSTIC_WARNING_IN_JAVA_REGEX
      See Also:
    • DIAGNOSTIC_WARNING_IN_JAVA_PATTERN

      public static final Pattern DIAGNOSTIC_WARNING_IN_JAVA_PATTERN
    • DIAGNOSTIC_REGEX

      public static final String DIAGNOSTIC_REGEX
      See Also:
    • DIAGNOSTIC_PATTERN

      public static final Pattern DIAGNOSTIC_PATTERN
    • DIAGNOSTIC_WARNING_REGEX

      public static final String DIAGNOSTIC_WARNING_REGEX
      See Also:
    • DIAGNOSTIC_WARNING_PATTERN

      public static final Pattern DIAGNOSTIC_WARNING_PATTERN
    • DIAGNOSTIC_FILE_REGEX

      public static final String DIAGNOSTIC_FILE_REGEX
      See Also:
    • DIAGNOSTIC_FILE_PATTERN

      public static final Pattern DIAGNOSTIC_FILE_PATTERN
    • DIAGNOSTIC_FILE_WARNING_REGEX

      public static final String DIAGNOSTIC_FILE_WARNING_REGEX
      See Also:
    • DIAGNOSTIC_FILE_WARNING_PATTERN

      public static final Pattern DIAGNOSTIC_FILE_WARNING_PATTERN
  • 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, boolean noMsgText)
      Instantiate a diagnostic from output produced by the Java compiler. The resulting diagnostic is never fixable and always has parentheses.
    • fromJSpecifyFileComment

      public static TestDiagnostic fromJSpecifyFileComment(String filename, long lineNumber, String stringFromJavaFile)
      Instantiate the diagnostic from a JSpecify string that would appear in a Java file, e.g.: "jspecify_some_category".
      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
    • fromPatternMatching

      protected static TestDiagnostic fromPatternMatching(Pattern diagnosticPattern, Pattern warningPattern, String filename, @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
      filename - the file name
      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,String> formatJavaxToolString(String original, boolean noMsgText)
      Given a javax diagnostic, return a pair of (trimmed, filename), where "trimmed" is the first line of the message, without the leading filename.
      Parameters:
      original - a javax diagnostic
      noMsgText - whether to do work; if false, this returns a pair of (argument, "")
      Returns:
      the diagnostic, split into message and filename
    • 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.
    • 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.
    • fromJavaxDiagnosticList

      public static Set<TestDiagnostic> fromJavaxDiagnosticList(List<Diagnostic<? extends JavaFileObject>> javaxDiagnostics, boolean noMsgText)
    • 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
    • removeDiagnosticsOfKind

      public static void removeDiagnosticsOfKind(DiagnosticKind kind, List<TestDiagnostic> expectedDiagnostics)