// 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.origin.Origin;
import com.android.tools.r8.position.Position;

/**
 * A DiagnosticsHandler can be provided to customize handling of diagnostics information.
 *
 * <p>During compilation the warning and info methods will be called.
 */
@Keep
public interface DiagnosticsHandler {

  /**
   * Handle error diagnostics.
   *
   * @param error Diagnostic containing error information.
   */
  default void error(Diagnostic error) {
    if (error.getOrigin() != Origin.unknown()) {
      System.err.print("Error in " + error.getOrigin());
      if (error.getPosition() != Position.UNKNOWN) {
        System.err.print(" at " + error.getPosition().getDescription());
      }
      System.err.println(":");
    } else {
      System.err.print("Error: ");
    }
    System.err.println(error.getDiagnosticMessage());
  }

  /**
   * Handle warning diagnostics.
   *
   * @param warning Diagnostic containing warning information.
   */
  default void warning(Diagnostic warning) {
    if (warning.getOrigin() != Origin.unknown()) {
      System.err.print("Warning in " + warning.getOrigin() + ":\n  ");
    } else {
      System.err.print("Warning: ");
    }
    System.err.println(warning.getDiagnosticMessage());
  }

  /**
   * Handle info diagnostics.
   *
   * @param info Diagnostic containing the information.
   */
  default void info(Diagnostic info) {
    if (info.getOrigin() != Origin.unknown()) {
      System.out.print("In " + info.getOrigin() + ":\n  ");
    }
    System.out.println(info.getDiagnosticMessage());
  }

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