// 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.utils;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.Keep;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;

/**
 * A diagnostic message.
 *
 * <p>This string diagnostic is used to report various error messages from the compiler. There is
 * no guarantee that the message will remain the same or that the issue will continue to be reported
 * by way of a {@link StringDiagnostic}. If there is a need to reliably identify a particular kind
 * of error which is currently reported via a {@link StringDiagnostic}, then please file a feature
 * request on D8/R8.
 */
@Keep
public class StringDiagnostic implements Diagnostic {

  private final Origin origin;
  private final Position position;
  private final String message;

  public StringDiagnostic(String message) {
    this(message, Origin.unknown());
  }

  public StringDiagnostic(String message, Origin origin) {
    this(message, origin, Position.UNKNOWN);
  }

  public StringDiagnostic(String message, Origin origin, Position position) {
    assert message != null;
    assert origin != null;
    assert position != null;
    this.origin = origin;
    this.position = position;
    this.message = message;
  }

  @Override
  public Origin getOrigin() {
    return origin;
  }

  @Override
  public Position getPosition() {
    return position;
  }

  @Override
  public String getDiagnosticMessage() {
    return message;
  }
}
