|  | // 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; | 
|  | } | 
|  | } |