#!/usr/bin/env python3
# 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.

import jdk
import os
import subprocess
import sys
import utils

ASM_VERSION = '9.9'
ASM_JAR = os.path.join(utils.DEPENDENCIES_DIR, 'org', 'ow2', 'asm', 'asm',
                       ASM_VERSION, 'asm-' + ASM_VERSION + '.jar')
ASM_UTIL_JAR = os.path.join(utils.DEPENDENCIES_DIR, 'org', 'ow2', 'asm',
                            'asm-util', ASM_VERSION,
                            'asm-util-' + ASM_VERSION + '.jar')


def run(args):
    cmd = []
    cmd.append(jdk.GetJavaExecutable())
    cp = ":".join([ASM_JAR, ASM_UTIL_JAR])
    print(cp)
    cmd.extend(['-cp', cp])
    cmd.append('org.objectweb.asm.util.ASMifier')
    cmd.extend(args)
    utils.PrintCmd(cmd)
    result = subprocess.check_output(cmd).decode('utf-8')
    print(result)
    return result


def main():
    help = True
    args = []
    for arg in sys.argv[1:]:
        if arg == "--no-debug":
            args.append("-debug")
        elif arg in ("-help", "--help", "-debug"):
            help = True
            break
        else:
            help = False
            args.append(arg)
    if help:
        print("asmifier.py [--no-debug] <classfile>*")
        print(
            "  --no-debug    Don't include local variable information in output."
        )
        return
    try:
        run(args)
    except subprocess.CalledProcessError as e:
        # In case anything relevant was printed to stdout, normally this is already
        # on stderr.
        print(e.output)
        return e.returncode


if __name__ == '__main__':
    sys.exit(main())
