// 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.cf.code.CfInstruction;
import com.android.tools.r8.origin.Origin;

public class CfCodeStackMapValidatingException extends RuntimeException {

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

  public static CfCodeStackMapValidatingException error(String messsage) {
    return new CfCodeStackMapValidatingException(messsage);
  }

  public static CfCodeDiagnostics unexpectedStackMapFrame(
      Origin origin, DexMethod method, AppView<?> appView) {
    StringBuilder sb = new StringBuilder("Unexpected stack map frame without target");
    if (appView.enableWholeProgramOptimizations()) {
      sb.append(" In later version of R8, the method may be assumed not reachable.");
    }
    return new CfCodeDiagnostics(origin, method, sb.toString());
  }

  public static CfCodeDiagnostics multipleFramesForLabel(
      Origin origin, DexMethod method, AppView<?> appView) {
    StringBuilder sb = new StringBuilder("Multiple frames for label");
    if (appView.enableWholeProgramOptimizations()) {
      sb.append(" In later version of R8, the method may be assumed not reachable.");
    }
    return new CfCodeDiagnostics(origin, method, sb.toString());
  }

  public static CfCodeDiagnostics noFramesForMethodWithJumps(
      Origin origin, DexMethod method, AppView<?> appView) {
    StringBuilder sb =
        new StringBuilder("Expected stack map table for method with non-linear control flow.");
    if (appView.enableWholeProgramOptimizations()) {
      sb.append(" In later version of R8, the method may be assumed not reachable.");
    }
    return new CfCodeDiagnostics(origin, method, sb.toString());
  }

  public static CfCodeDiagnostics toDiagnostics(
      Origin origin,
      DexMethod method,
      int instructionIndex,
      CfInstruction instruction,
      String detailMessage,
      AppView<?> appView) {
    StringBuilder sb =
        new StringBuilder("Invalid stack map table at ")
            .append(instructionIndex)
            .append(": ")
            .append(instruction)
            .append(", error: ")
            .append(detailMessage)
            .append(".");
    if (appView.enableWholeProgramOptimizations()) {
      sb.append(" In later version of R8, the method may be assumed not reachable.");
    }
    return new CfCodeDiagnostics(origin, method, sb.toString());
  }
}
