// Copyright (c) 2018, 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.bisect.Bisect;
import com.android.tools.r8.cf.CfVerifierTool;
import com.android.tools.r8.compatproguard.CompatProguard;
import com.android.tools.r8.relocator.RelocatorCommandLine;
import com.android.tools.r8.tracereferences.TraceReferences;
import java.util.Arrays;

/**
 * Common entry point to everything in the R8 project.
 *
 * <p>This class is used as the main class in {@code r8.jar}. It checks the first command-line
 * argument to find the tool to run, or runs {@link R8} if the first argument is not a recognized
 * tool name.
 *
 * <p>The set of tools recognized by this class is defined by a switch statement in {@link
 * SwissArmyKnife#main(String[])}.
 */
public class SwissArmyKnife {

  public static void main(String[] args) throws Exception {
    if (args.length == 0) {
      runDefault(args);
      return;
    }
    switch (args[0]) {
      case "bisect":
        Bisect.main(shift(args));
        break;
      case "compatproguard":
        CompatProguard.main(shift(args));
        break;
      case "d8":
        D8.main(shift(args));
        break;
      case "dexsegments":
        DexSegments.main(shift(args));
        break;
      case "disasm":
        Disassemble.main(shift(args));
        break;
      case "extractmarker":
        ExtractMarker.main(shift(args));
        break;
      case "jardiff":
        JarDiff.main(shift(args));
        break;
      case "jarsizecompare":
        JarSizeCompare.main(shift(args));
        break;
      case "maindex":
        GenerateMainDexList.main(shift(args));
        break;
      case "r8":
        R8.main(shift(args));
        break;
      case "l8":
        L8.main(shift(args));
        break;
      case "backportedmethods":
        BackportedMethodList.main(shift(args));
        break;
      case "relocator":
        RelocatorCommandLine.main(shift(args));
        break;
      case "tracereferences":
        TraceReferences.main(shift(args));
        break;
      case "verify":
        CfVerifierTool.main(shift(args));
        break;
      default:
        runDefault(args);
        break;
    }
  }

  private static void runDefault(String[] args) {
    R8.main(args);
  }

  private static String[] shift(String[] args) {
    return Arrays.copyOfRange(args, 1, args.length);
  }
}
