#!/usr/bin/env python

# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''Uses the closure compiler to check syntax and semantics of a js module
with dependencies.'''

import os
import re
import subprocess
import sys

_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
_CHROME_SOURCE_DIR = os.path.normpath(
    os.path.join(
        _SCRIPT_DIR, *[os.path.pardir] * 6))

# Compiler path.
_CLOSURE_COMPILER_JAR = os.path.join(
    _CHROME_SOURCE_DIR, 'third_party', 'closure_compiler', 'compiler',
    'compiler.jar')

# List of compilation errors to enable with the --jscomp_errors flag.
_JSCOMP_ERRORS = [ 'accessControls', 'checkTypes', 'checkVars', 'invalidCasts',
                   'missingProperties', 'undefinedNames', 'undefinedVars',
                   'visibility' ]

_java_executable = 'java'


def _Error(msg):
  print >>sys.stderr, msg
  sys.exit(1)


def _ExecuteCommand(args, ignore_exit_status=False):
  try:
    return subprocess.check_output(args, stderr=subprocess.STDOUT)
  except subprocess.CalledProcessError as e:
    if ignore_exit_status and e.returncode > 0:
      return e.output
    _Error('%s\nCommand \'%s\' returned non-zero exit status %d' %
           (e.output, ' '.join(e.cmd), e.returncode))
  except (OSError, IOError) as e:
    _Error('Error executing %s: %s' % (_java_executable, str(e)))


def _CheckJava():
  global _java_executable
  java_home = os.environ.get('JAVAHOME')
  if java_home is not None:
    _java_executable = os.path.join(java_home, 'bin', 'java')
  output = _ExecuteCommand([_java_executable, '-version'])
  match = re.search(r'version "(?:\d+)\.(\d+)', output)
  if match is None or int(match.group(1)) < 7:
    _Error('Java 7 or later is required: \n%s' % output)

_CheckJava()


def RunCompiler(js_files, externs=[]):
  args = [_java_executable, '-jar', _CLOSURE_COMPILER_JAR]
  args.extend(['--compilation_level', 'SIMPLE_OPTIMIZATIONS'])
  args.extend(['--jscomp_error=%s' % error for error in _JSCOMP_ERRORS])
  args.extend(['--language_in', 'ECMASCRIPT6'])
  args.extend(['--externs=%s' % extern for extern in externs])
  args.extend(['--js=%s' % js for js in js_files])
  args.extend(['--js_output_file', '/dev/null'])
  output = _ExecuteCommand(args, ignore_exit_status=True)
  success = len(output) == 0
  return success, output
