diff options
author | cushon <cushon@google.com> | 2019-08-07 16:41:44 -0700 |
---|---|---|
committer | Liam Miller-Cushon <cushon@google.com> | 2019-08-07 17:55:06 -0700 |
commit | b27ae9a76b2c1610fcf92cbd7569385b615948e1 (patch) | |
tree | d085605ea50ac4847bb76bca1eb938f0ff3b9e8b /java/com/google/turbine/diag/TurbineDiagnostic.java | |
parent | ddb1f097310fa66b7f7446e87b31edf27580eb99 (diff) | |
download | turbine-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.java | 113 |
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()); } } |