aboutsummaryrefslogtreecommitdiff
path: root/java/com/google/turbine/diag/TurbineDiagnostic.java
diff options
context:
space:
mode:
authorcushon <cushon@google.com>2019-08-07 16:41:44 -0700
committerLiam Miller-Cushon <cushon@google.com>2019-08-07 17:55:06 -0700
commitb27ae9a76b2c1610fcf92cbd7569385b615948e1 (patch)
treed085605ea50ac4847bb76bca1eb938f0ff3b9e8b /java/com/google/turbine/diag/TurbineDiagnostic.java
parentddb1f097310fa66b7f7446e87b31edf27580eb99 (diff)
downloadturbine-b27ae9a76b2c1610fcf92cbd7569385b615948e1.tar.gz
Finish implementing Messager
Look up annotation positions for processor diagnostics, and support diagnostic kinds other than 'error'. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=262242138
Diffstat (limited to 'java/com/google/turbine/diag/TurbineDiagnostic.java')
-rw-r--r--java/com/google/turbine/diag/TurbineDiagnostic.java113
1 files changed, 78 insertions, 35 deletions
diff --git a/java/com/google/turbine/diag/TurbineDiagnostic.java b/java/com/google/turbine/diag/TurbineDiagnostic.java
index 3ce87a7..4334bbb 100644
--- a/java/com/google/turbine/diag/TurbineDiagnostic.java
+++ b/java/com/google/turbine/diag/TurbineDiagnostic.java
@@ -16,29 +16,48 @@
package com.google.turbine.diag;
-import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.Iterables.getOnlyElement;
import static java.util.Objects.requireNonNull;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.turbine.binder.sym.ClassSymbol;
import com.google.turbine.diag.TurbineError.ErrorKind;
import java.util.Objects;
+import javax.tools.Diagnostic;
/** A compilation error. */
public class TurbineDiagnostic {
+ private final Diagnostic.Kind severity;
private final ErrorKind kind;
- private final String diagnostic;
private final ImmutableList<Object> args;
+ private final SourceFile source;
+ private final int position;
+ private final Supplier<LineMap> lineMap =
+ Suppliers.memoize(
+ new Supplier<LineMap>() {
+ @Override
+ public LineMap get() {
+ return LineMap.create(source.source());
+ }
+ });
- private TurbineDiagnostic(ErrorKind kind, String diagnostic, ImmutableList<Object> args) {
+ private TurbineDiagnostic(
+ Diagnostic.Kind severity,
+ ErrorKind kind,
+ ImmutableList<Object> args,
+ SourceFile source,
+ int position) {
+ this.severity = requireNonNull(severity);
this.kind = requireNonNull(kind);
- this.diagnostic = requireNonNull(diagnostic);
this.args = requireNonNull(args);
+ this.source = source;
+ this.position = position;
}
/** The diagnostic kind. */
@@ -46,9 +65,28 @@ public class TurbineDiagnostic {
return kind;
}
+ /**
+ * The diagnostic severity (error, warning, ...). Turbine only produces errors, non-error
+ * diagnostics are only ever created by annotation processors.
+ */
+ public Diagnostic.Kind severity() {
+ return severity;
+ }
+
/** The diagnostic message. */
public String diagnostic() {
- return diagnostic;
+ StringBuilder sb = new StringBuilder(path());
+ if (line() != -1) {
+ sb.append(':').append(line());
+ }
+ sb.append(": error: ");
+ sb.append(message().trim()).append(System.lineSeparator());
+ if (line() != -1 && column() != -1) {
+ sb.append(CharMatcher.breakingWhitespace().trimTrailingFrom(lineMap.get().line(position)))
+ .append(System.lineSeparator());
+ sb.append(Strings.repeat(" ", column() - 1)).append('^');
+ }
+ return sb.toString();
}
/** The diagnostic arguments. */
@@ -56,21 +94,29 @@ public class TurbineDiagnostic {
return args;
}
- public static TurbineDiagnostic create(
- ErrorKind kind, String diagnostic, ImmutableList<Object> args) {
+ private static TurbineDiagnostic create(
+ Diagnostic.Kind severity,
+ ErrorKind kind,
+ ImmutableList<Object> args,
+ SourceFile source,
+ int position) {
switch (kind) {
case SYMBOL_NOT_FOUND:
{
checkArgument(
args.size() == 1 && getOnlyElement(args) instanceof ClassSymbol,
- "diagnostic (%s) has invalid argument args %s",
- diagnostic,
+ "diagnostic (%s) has invalid argument %s",
+ kind,
args);
break;
}
default: // fall out
}
- return new TurbineDiagnostic(kind, diagnostic, args);
+ return new TurbineDiagnostic(severity, kind, args, source, position);
+ }
+
+ public static TurbineDiagnostic format(Diagnostic.Kind severity, ErrorKind kind, String message) {
+ return create(severity, kind, ImmutableList.of(message), null, -1);
}
/**
@@ -81,10 +127,7 @@ public class TurbineDiagnostic {
* @param args format args
*/
public static TurbineDiagnostic format(SourceFile source, ErrorKind kind, Object... args) {
- String path = firstNonNull(source.path(), "<>");
- String message = kind.format(args);
- String diagnostic = path + ": error: " + message.trim() + System.lineSeparator();
- return create(kind, diagnostic, ImmutableList.copyOf(args));
+ return create(Diagnostic.Kind.ERROR, kind, ImmutableList.copyOf(args), source, -1);
}
/**
@@ -95,34 +138,34 @@ public class TurbineDiagnostic {
* @param args format args
*/
public static TurbineDiagnostic format(
- SourceFile source, int position, ErrorKind kind, Object... args) {
- String path = firstNonNull(source.path(), "<>");
- LineMap lineMap = LineMap.create(source.source());
- int lineNumber = lineMap.lineNumber(position);
- int column = lineMap.column(position);
- String message = kind.format(args);
-
- StringBuilder sb = new StringBuilder(path).append(":");
- sb.append(lineNumber).append(": error: ");
- sb.append(message.trim()).append(System.lineSeparator());
- sb.append(CharMatcher.breakingWhitespace().trimTrailingFrom(lineMap.line(position)))
- .append(System.lineSeparator());
- sb.append(Strings.repeat(" ", column)).append('^');
- String diagnostic = sb.toString();
- return create(kind, diagnostic, ImmutableList.copyOf(args));
+ Diagnostic.Kind severity, SourceFile source, int position, ErrorKind kind, Object... args) {
+ return create(severity, kind, ImmutableList.copyOf(args), source, position);
}
@Override
public int hashCode() {
- return Objects.hash(diagnostic, kind);
+ return Objects.hash(kind, source, position);
}
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof TurbineDiagnostic)) {
- return false;
- }
- TurbineDiagnostic that = (TurbineDiagnostic) obj;
- return diagnostic.equals(that.diagnostic) && kind.equals(that.kind);
+ return obj instanceof TurbineDiagnostic
+ && diagnostic().equals(((TurbineDiagnostic) obj).diagnostic());
+ }
+
+ public String path() {
+ return source != null && source.path() != null ? source.path() : "<>";
+ }
+
+ public int line() {
+ return position != -1 ? lineMap.get().lineNumber(position) : -1;
+ }
+
+ public int column() {
+ return position != -1 ? lineMap.get().column(position) + 1 : -1;
+ }
+
+ public String message() {
+ return kind.format(args.toArray());
}
}