package org.checkerframework.framework.test.diagnostics;
/**
* Represents an expected error/warning message in a Java test file or an error/warning reported by
* the Javac compiler See JavaFileDiagnosticReader and TestDiagnosticLine
*/
public class TestDiagnostic {
private final long lineNumber;
private final DiagnosticKind kind;
private final String filename;
/** Whether this diagnostic should no longer be reported after whole program inference */
private final boolean isFixable;
/**
* An error key or full error message that usually appears between parentheses in diagnostic
* messages
*/
private final String message;
/**
* Whether or not String representation methods should omit the parentheses around the message
*/
private final boolean omitParentheses;
/** Basic constructor that sets the immutable fields of this diagnostic. */
public TestDiagnostic(
String filename,
long lineNumber,
DiagnosticKind kind,
String message,
boolean isFixable,
boolean omitParentheses) {
this.filename = filename;
this.lineNumber = lineNumber;
this.kind = kind;
this.message = message;
this.isFixable = isFixable;
this.omitParentheses = omitParentheses;
}
public String getFilename() {
return filename;
}
public long getLineNumber() {
return lineNumber;
}
public DiagnosticKind getKind() {
return kind;
}
public boolean isFixable() {
return isFixable;
}
public String getMessage() {
return message;
}
/**
* @return whether or not String representation methods should omit the parentheses around the
* message
*/
public boolean shouldOmitParentheses() {
return omitParentheses;
}
/**
* @return a String representing the format of this diagnostic as if it appeared in a source
* file
*/
public String asSourceString() {
if (omitParentheses) {
return kind.parseString + " " + message;
}
return kind.parseString + " (" + message + ")";
}
/**
* Equality is compared without isFixable/omitParentheses
*
* @return true if this and otherObj are equal according to lineNumber, kind, and message
*/
@Override
public boolean equals(Object otherObj) {
if (otherObj == null || !otherObj.getClass().equals(TestDiagnostic.class)) {
return false;
}
final TestDiagnostic other = (TestDiagnostic) otherObj;
return other.lineNumber == lineNumber
&& other.kind == this.kind
&& other.message.equals(this.message)
&& other.filename.equals(this.filename);
}
@Override
public int hashCode() {
return 331
* ((int) lineNumber)
* kind.hashCode()
* message.hashCode()
* filename.hashCode();
}
/** @return a representation of this diagnostic as if it appeared in a diagnostics file */
@Override
public String toString() {
if (omitParentheses) {
return filename + ":" + lineNumber + ": " + kind.parseString + ": " + message;
}
return filename + ":" + lineNumber + ": " + kind.parseString + ": (" + message + ")";
}
}