#!/bin/bash
# Copyright 2012 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of Google Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Inspired by and based on:
# https://chromium.googlesource.com/chromium/src/+/master/tools/bash-completion

# Flag completion rule for bash.
# To load in your shell, "source path/to/this/file".

v8_source="$(realpath "$(dirname "$BASH_SOURCE")"/..)"

_get_v8_flags() {
  # The first `sed` command joins lines when a line ends with '('.
  # See http://sed.sourceforge.net/sedfaq3.html#s3.2
  local flags_file="$v8_source/src/flags/flag-definitions.h"
  local defines=$( \
    sed -e :a -e '/($/N; s/(\n\s*/(/; ta' < "$flags_file" \
    | grep "^DEFINE" \
    | grep -v "DEFINE_IMPLICATION" \
    | grep -v "DEFINE_NEG_IMPLICATION" \
    | grep -v "DEFINE_VALUE_IMPLICATION" \
    | sed -e 's/_/-/g'; \
    grep "^  V(harmony_" "$flags_file" \
    | sed -e 's/^  V/DEFINE-BOOL/' \
    | sed -e 's/_/-/g'; \
    grep "^  V(" "$v8_source/src/wasm/wasm-feature-flags.h" \
    | sed -e 's/^  V(/DEFINE-BOOL(experimental-wasm-/' \
    | sed -e 's/_/-/g')
  sed -ne 's/^DEFINE-[^(]*(\([^,]*\).*/--\1/p' <<< "$defines"
  sed -ne 's/^DEFINE-BOOL(\([^,]*\).*/--no\1/p' <<< "$defines"
}

_get_d8_flags() {
  grep "strcmp(argv\[i\]" "$v8_source/src/d8/d8.cc" \
    | sed -ne 's/^[^"]*"--\([^"]*\)".*/--\1/p'
}

_d8_flag() {
  local targets
  targets=$(_get_v8_flags ; _get_d8_flags)
  COMPREPLY=($(compgen -W "$targets" -- "${COMP_WORDS[COMP_CWORD]}"))
  return 0
}

_test_flag() {
  local targets
  targets=$(_get_v8_flags)
  COMPREPLY=($(compgen -W "$targets" -- "${COMP_WORDS[COMP_CWORD]}"))
  return 0
}

complete -F _d8_flag -f d8 v8 v8-debug
complete -F _test_flag -f cctest unittests

# Many distros set up their own GDB completion scripts. The logic below is
# careful to wrap any such functions (with additional logic), rather than
# overwriting them.
# An additional complication is that tested distros dynamically load their
# completion scripts on first use. So in order to be able to detect their
# presence, we have to force-load them first.
_maybe_setup_gdb_completions() {
  # We only want to set up the wrapping once:
  [[ -n "$_ORIGINAL_GDB_COMPLETIONS" ]] && return 0;

  # This path works for Debian, Ubuntu, and Gentoo; other distros unknown.
  # Feel free to submit patches to extend the logic.
  local GDB_COMP
  for GDB_COMP in "/usr/share/bash-completion/completions/gdb"; do
    [[ -f "$GDB_COMP" ]] && source $GDB_COMP
  done
  _ORIGINAL_GDB_COMPLETIONS="$(complete -p gdb 2>/dev/null \
                               | sed -e 's/^.*-F \([^ ]*\).*/\1/')"

  _gdb_v8_flag() {
    local c i next
    for (( i=1; i<$(($COMP_CWORD-1)); i++ )); do
      c=${COMP_WORDS[$i]}
      if [ "$c" = "-args" ] || [ "$c" = "--args" ] || [ "$c" == "--" ]; then
        next=$(basename -- ${COMP_WORDS[$(($i+1))]})
        if [ "$next" = "d8" ] ; then
          _d8_flag
          return 0
        elif [ "$next" = "unittests" ] || [ "$next" = "cctest" ]; then
          _test_flag
          return 0
        fi
      fi
    done
    [[ -n "$_ORIGINAL_GDB_COMPLETIONS" ]] && $_ORIGINAL_GDB_COMPLETIONS
    return 0
  }
  complete -F _gdb_v8_flag -f gdb
}
_maybe_setup_gdb_completions
unset _maybe_setup_gdb_completions

_get_gm_flags() {
  "$v8_source/tools/dev/gm.py" --print-completions

  # cctest ignore directory structure, it's always "cctest/filename".
  find "$v8_source/test/cctest/" -type f -name 'test-*' | \
    xargs basename -a -s ".cc" | \
    while read -r item; do echo "cctest/$item/*"; done
}

_gm_flag() {
  local targets=$(_get_gm_flags)
  COMPREPLY=($(compgen -W "$targets" -- "${COMP_WORDS[COMP_CWORD]}"))
  return 0
}

# gm might be an alias, based on https://v8.dev/docs/build-gn#gm.
complete -F _gm_flag gm.py gm
