| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8; | |
| import com.android.tools.r8.keepanno.annotations.KeepForApi; | |
| import com.android.tools.r8.origin.Origin; | |
| import com.android.tools.r8.position.Position; | |
| import java.io.PrintStream; | |
| /** | |
| * A DiagnosticsHandler can be provided to customize handling of diagnostics information. | |
| * | |
| * <p>During compilation the warning and info methods will be called. | |
| */ | |
| @KeepForApi | |
| public interface DiagnosticsHandler { | |
| /** Should be considered private. */ | |
| @SuppressWarnings("ReferenceEquality") | |
| static void printDiagnosticToStream(Diagnostic diagnostic, String prefix, PrintStream stream) { | |
| if (diagnostic.getOrigin() != Origin.unknown()) { | |
| stream.print(prefix + " in " + diagnostic.getOrigin()); | |
| if (diagnostic.getPosition() != Position.UNKNOWN) { | |
| stream.print(" at " + diagnostic.getPosition().getDescription()); | |
| } | |
| stream.println(":"); | |
| } else { | |
| stream.print(prefix + ": "); | |
| } | |
| stream.println(diagnostic.getDiagnosticMessage()); | |
| } | |
| /** | |
| * Handle error diagnostics. | |
| * | |
| * @param error Diagnostic containing error information. | |
| */ | |
| default void error(Diagnostic error) { | |
| printDiagnosticToStream(error, "Error", System.err); | |
| } | |
| /** | |
| * Handle warning diagnostics. | |
| * | |
| * @param warning Diagnostic containing warning information. | |
| */ | |
| default void warning(Diagnostic warning) { | |
| printDiagnosticToStream(warning, "Warning", System.err); | |
| } | |
| /** | |
| * Handle info diagnostics. | |
| * | |
| * @param info Diagnostic containing the information. | |
| */ | |
| default void info(Diagnostic info) { | |
| printDiagnosticToStream(info, "Info", System.out); | |
| } | |
| /** | |
| * Modify the level of a diagnostic. | |
| * | |
| * <p>This modification is allowed only for non-fatal compiler diagnostics. | |
| * | |
| * <p>Changing a non-error into an error will cause the compiler to exit with a <code> | |
| * CompilationFailedException</code> at its next error check point. | |
| * | |
| * <p>Changing an error into a non-error will allow the compiler to continue compilation. Note | |
| * that doing so could very well lead to an internal compiler error due to a broken invariant. | |
| */ | |
| default DiagnosticsLevel modifyDiagnosticsLevel(DiagnosticsLevel level, Diagnostic diagnostic) { | |
| return level; | |
| } | |
| } |