#!/bin/bash
# Copyright (c) 2013, 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 file is used to execute the analyzer by running the jar file.
# It is a simple wrapper enabling us to have simpler command lines in
# the testing infrastructure.
set -e

FOUND_BATCH=0
for ARG in "$@"
do
  case $ARG in
    -batch|--batch)
      FOUND_BATCH=1
      ;;
    *)
      ;;
  esac
done

function follow_links() {
  file="$1"
  while [ -h "$file" ]; do
    # On Mac OS, readlink -f doesn't work.
    file="$(readlink "$file")"
  done
  echo "$file"
}

# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
PROG_NAME="$(follow_links "$BASH_SOURCE")"

# Handle the case where dart-sdk/bin has been symlinked to.
BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"

SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"

if [ -z "$DART_CONFIGURATION" ];
then
  DART_CONFIGURATION="ReleaseIA32"
fi

if [ `uname` == 'Darwin' ];
then
  JAR_DIR="$BIN_DIR"/../../xcodebuild/$DART_CONFIGURATION/dartanalyzer
else
  JAR_DIR="$BIN_DIR"/../../out/$DART_CONFIGURATION/dartanalyzer
fi

JAR_FILE="$JAR_DIR/dartanalyzer.jar"

EXTRA_JVMARGS="-Xss2M "
OS=`uname | tr "[A-Z]" "[a-z]"`
if [ "$OS" == "darwin" ] ; then
  # Bump up the heap on Mac VMs, some of which default to 128M or less.
  EXTRA_JVMARGS+=" -Xmx512M -client "
else
  # On other architectures
  # -batch invocations will do better with a server vm
  # invocations for analyzing a single file do better with a client vm
  if [ $FOUND_BATCH -eq 0 ] ; then
    EXTRA_JVMARGS+=" -client "
  fi
fi

exec java $EXTRA_JVMARGS -jar "$JAR_FILE" --dart-sdk "$SDK_DIR" "$@"
