#!/usr/bin/env python
#
# Copyright (c) 2017, the Dart 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.

# This script runs the parser which is generated using ANTLR 4 from
# docs/language/Dart.g. It relies on a certain environment and is hence
# usable locally where this environment can be obtained, but it may not be
# possible to run it, e.g., on build bots. The requirements are as follows:
#
#   - `make parser` in spec_parser has been executed successfully.
#   - A suitable JVM is in the PATH and may be executed as 'java'.
#   - the ANTLR3 jar is available as /usr/share/java/antlr4-runtime.jar.

import os
import string
import subprocess
import sys

import utils


def Help(missing):
    print('Execution of the spec parser failed. Missing: ' + missing)
    print('Please read the comment near the top of spec_parse.py.\n')
    sys.exit(1)


def Main():
    args = sys.argv[1:]
    tools_dir = os.path.dirname(os.path.realpath(__file__))
    spec_parser_dir = os.path.join(tools_dir, 'spec_parser')
    spec_parser_file = os.path.join(spec_parser_dir, 'SpecParser.class')
    antlr_jar = '/usr/share/java/antlr4-runtime.jar'
    class_path = string.join([spec_parser_dir, antlr_jar], ':')
    command = ['java', '-cp', class_path, 'SpecParser'] + args

    if not os.path.exists(antlr_jar): Help(antlr_jar)
    if not os.path.exists(spec_parser_file):
        Help('"make parser" in spec_parser')

    with utils.CoreDumpArchiver(args):
        exit_code = subprocess.call(command)

    utils.DiagnoseExitCode(exit_code, command)
    return exit_code


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