blob: b283b0ca6e8b6d48bd04454a2e3cd9635b2f97a9 [file] [log] [blame]
package org.checkerframework.framework.source;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.tools.Diagnostic.Kind;
import org.checkerframework.checker.compilermsgs.qual.CompilerMessageKey;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.dataflow.qual.Pure;
import org.checkerframework.dataflow.qual.SideEffectFree;
import org.checkerframework.framework.qual.AnnotatedFor;
/**
* A {@code DiagMessage} is a kind, a message key, and arguments. The message key will be expanded
* according to the user locale. Any arguments will then be interpolated into the localized message.
*
* <p>By contrast, {@code javax.tools.Diagnostic} has just a string message.
*/
@AnnotatedFor("nullness")
public class DiagMessage {
/** The kind of message. */
private final Kind kind;
/** The message key. */
private final @CompilerMessageKey String messageKey;
/** The arguments that will be interpolated into the localized message. */
private final Object[] args;
/**
* Create a DiagMessage.
*
* @param kind the kind of message
* @param messageKey the message key
* @param args the arguments that will be interpolated into the localized message
*/
public DiagMessage(Kind kind, @CompilerMessageKey String messageKey, Object... args) {
this.kind = kind;
this.messageKey = messageKey;
if (args == null) {
this.args = new Object[0]; /*null->nn*/
} else {
this.args = Arrays.copyOf(args, args.length);
}
}
/**
* Returns the kind of this DiagMessage.
*
* @return the kind of this DiagMessage
*/
public Kind getKind() {
return this.kind;
}
/**
* Returns the message key of this DiagMessage.
*
* @return the message key of this DiagMessage
*/
public @CompilerMessageKey String getMessageKey() {
return this.messageKey;
}
/**
* Returns the customized optional arguments for the message.
*
* @return the customized optional arguments for the message
*/
public Object[] getArgs() {
return this.args;
}
@Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof DiagMessage)) {
return false;
}
DiagMessage other = (DiagMessage) obj;
return (kind == other.kind
&& messageKey.equals(other.messageKey)
&& Arrays.equals(args, other.args));
}
@Pure
@Override
public int hashCode() {
return Objects.hash(kind, messageKey, Arrays.hashCode(args));
}
@SideEffectFree
@Override
public String toString() {
if (args.length == 0) {
return messageKey;
}
return kind + messageKey + " : " + Arrays.toString(args);
}
/**
* Returns the concatenation of the lists.
*
* @param list1 a list of DiagMessage, or null
* @param list2 a list of DiagMessage, or null
* @return the concatenation of the lists
*/
public static List<DiagMessage> mergeLists(List<DiagMessage> list1, List<DiagMessage> list2) {
if (list1 == null || list1.isEmpty()) {
return list2;
} else if (list2 == null || list2.isEmpty()) {
return list1;
} else {
List<DiagMessage> result = new ArrayList<>(list1.size() + list2.size());
result.addAll(list1);
result.addAll(list2);
return result;
}
}
}