#!/bin/bash
# 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.

# TODO(ahe): This should be replaced by a Dart script that works on Windows,
# Linux, and Mac.

set -e

REPO_DIR="$(cd ${BASH_SOURCE%/*} && git rev-parse --show-toplevel)"

DART_VM=${DART_VM-"${REPO_DIR}/sdk/bin/dart"}

TOOL_DIR="${REPO_DIR}/pkg/front_end/tool/_fasta"

KERNEL_BIN="${REPO_DIR}/pkg/kernel/bin"

function stop {
  echo "$@" >&2
  exit 2
}

EXTRA_VM_ARGS=()

while [[ "$1" == -* ]]; do
  EXTRA_VM_ARGS+=("$1")
  shift
done

case "${1//_/-}" in
  abcompile) SCRIPT="${TOOL_DIR}/abcompile.dart";;
  compile) SCRIPT="${TOOL_DIR}/compile.dart";;
  compile-platform) SCRIPT="${TOOL_DIR}/compile_platform.dart";;
  log) SCRIPT="${TOOL_DIR}/log_analyzer.dart";;
  logd) SCRIPT="${TOOL_DIR}/log_collector.dart";;
  outline) SCRIPT="${TOOL_DIR}/outline.dart";;
  parser) SCRIPT="${TOOL_DIR}/parser.dart";;
  scanner) SCRIPT="${TOOL_DIR}/scanner.dart";;
  dump-ir)
    SCRIPT="${KERNEL_BIN}/dump.dart"
    if [ "$#" = "2" ]; then
      # Write to stdout if no target is given.
      set -- "$@" /dev/fd/1
    fi
    if [ "$#" != "3" ]; then
      stop "Usage: $1 dillFile [output]"
    fi
    ;;
  testing)
    SCRIPT="${REPO_DIR}/pkg/testing/bin/testing.dart"
    set -- "$@" "--config=${REPO_DIR}/pkg/front_end/testing.json"
    ;;
  generate-messages) SCRIPT="${TOOL_DIR}/generate_messages.dart";;
  generate-experimental-flags) SCRIPT="${TOOL_DIR}/generate_experimental_flags.dart";;
  *)
    stop "'$1' isn't a valid subcommand."
    ;;
esac

shift

exec "${DART_VM}" "${EXTRA_VM_ARGS[@]}" --enable-asserts "${SCRIPT}" "$@"
