// Copyright (c) 2020, 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.graph;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import java.lang.reflect.GenericSignatureFormatError;

public class GenericSignatureFormatDiagnostic implements Diagnostic {

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

  GenericSignatureFormatDiagnostic(Origin origin, Position position, String message) {
    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;
  }

  static GenericSignatureFormatDiagnostic invalidClassSignature(
      String signature, String name, Origin origin, GenericSignatureFormatError error) {
    return invalidSignature(signature, "class", name, origin, error);
  }

  static GenericSignatureFormatDiagnostic invalidMethodSignature(
      String signature, String name, Origin origin, GenericSignatureFormatError error) {
    return invalidSignature(signature, "method", name, origin, error);
  }

  static GenericSignatureFormatDiagnostic invalidFieldSignature(
      String signature, String name, Origin origin, GenericSignatureFormatError error) {
    return invalidSignature(signature, "field", name, origin, error);
  }

  private static GenericSignatureFormatDiagnostic invalidSignature(
      String signature,
      String kind,
      String name,
      Origin origin,
      GenericSignatureFormatError error) {
    String message =
        "Invalid signature '"
            + signature
            + "' for "
            + kind
            + " "
            + name
            + "."
            + System.lineSeparator()
            + "Signature is ignored and will not be present in the output."
            + System.lineSeparator()
            + "Parser error: "
            + error.getMessage();
    return new GenericSignatureFormatDiagnostic(origin, Position.UNKNOWN, message);
  }
}
