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

import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.naming.MemberNaming.Signature;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;

public class ProguardMapError extends CompilationError {

  protected static final String DUPLICATE_TARGET_MESSAGE = "'%s' and '%s' map to same name: '%s'";
  protected static final String DUPLICATE_SOURCE_MESSAGE = "'%s' already has a mapping";

  private ProguardMapError(String message) {
    super(message);
  }

  private ProguardMapError(String message, Position position) {
    super(message, null, Origin.unknown(), position);
  }

  static ProguardMapError duplicateSourceClass(String typeName, Position position) {
    return new ProguardMapError(String.format(DUPLICATE_SOURCE_MESSAGE, typeName), position);
  }

  static ProguardMapError duplicateSourceMember(
      String signature, String typeName, Position position) {
    return new ProguardMapError(
        String.format(DUPLICATE_SOURCE_MESSAGE, signature, typeName), position);
  }

  static ProguardMapError duplicateTargetClass(
      String source, String other, String mappedName, Position position) {
    return new ProguardMapError(
        String.format(DUPLICATE_TARGET_MESSAGE, source, other, mappedName), position);
  }

  static ProguardMapError duplicateTargetSignature(
      Signature source, Signature other, String mappedName, Position position) {
    return new ProguardMapError(
        String.format(DUPLICATE_TARGET_MESSAGE, source.toString(), other.toString(), mappedName),
        position);
  }
}
