#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

### runs clang-tidy on specified files

## Usage: fx clang-tidy [--fix] [--verbose] [--target=TARGET|--files=FILES]
##
##   --fix    Apply recommended fixes
##   --target Run on a specified GN build target
##   --files  List of files on which to run clang-tidy

set -e

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $?

function usage() {
  fx-command-help
}

function zap-commas() {
  echo $1 | tr ',' '\n'
}

# Removes leading //, resolves to absolute path, and resolves globs.  The first
# argument is a path prefix, and the remaining arguments are relative to that
# path prefix.
function canonicalize() {
  local root_dir="$1"
  shift
  for fileglob in "${@}"; do
    # // means it comes from gn, [^/]* means it is relative
    if [[ "${fileglob}" = //* || "${fileglob}" = [^/]* ]]; then
      local dir="${root_dir}"/
    else
      local dir=""
    fi
    for file in "${dir}"${fileglob#"//"}; do
      echo "${file}"
    done
  done
}

VERBOSE=
FIX=
RAW_FILES=""

fx-config-read

while [ $# -gt 0 ]; do
  ARG="$1"
  case "$1" in
    --verbose) VERBOSE="1" ;;
    --fix) FIX=1 ;;
    --files=*)
      RAW_FILES=$(canonicalize "${PWD}" $(zap-commas "${ARG#--files=}"))
      ;;
    --target=*)
      RAW_FILES=$(canonicalize "${FUCHSIA_DIR}" \
        $(fx-buildtool-run gn desc \
            "${FUCHSIA_BUILD_DIR}" "${ARG#--target=}" sources)) ;;
    *) usage && printf "Unknown flag %s\n" "${ARG}" && exit 1 ;;
  esac
  shift
done

FILES=()
while read -r line; do
    FILES+=("${line}")
done <<< "$RAW_FILES"

if [[ -n "${VERBOSE}" ]]; then
  printf "Files on which to run clang-tidy:\n%s\n" "${FILES[@]}"
fi

declare BUILDTOOLS_ROOT="${FUCHSIA_DIR}"/buildtools
declare HOST_OS=$(uname | tr '[:upper:]' '[:lower:]')

[[ "${HOST_OS}" == "darwin" ]] && HOST_OS="mac"
case $(uname -m) in
  x86_64) HOST_ARCH="x64" ;;
  aarch64) HOST_ARCH="arm64" ;;
  *) echo "Unknown arch $(uname -m)" && exit 1 ;;
esac

declare HOST_PLATFORM="${HOST_OS}-${HOST_ARCH}"

# Specify both the clang-tidy and the clang-apply-replacements binaries to be
# the ones in //buildtools, so that they'll work properly on the tree.
declare CLANG_TIDY="${BUILDTOOLS_ROOT}/${HOST_PLATFORM}/clang/bin/clang-tidy"
declare CLANG_APPLY_REPLACEMENTS="${BUILDTOOLS_ROOT}/${HOST_PLATFORM}/clang/bin/clang-apply-replacements"
declare RUN_CLANG_TIDY="${BUILDTOOLS_ROOT}/${HOST_PLATFORM}/clang/share/clang/run-clang-tidy.py"

cd "${FUCHSIA_BUILD_DIR}"
if [[ -n "${FIX}" ]]; then
  "${RUN_CLANG_TIDY}" \
  -clang-tidy-binary "${CLANG_TIDY}" \
  -clang-apply-replacements-binary "${CLANG_APPLY_REPLACEMENTS}" \
  "${FILES[@]}" \
  -fix
else
  "${RUN_CLANG_TIDY}" \
  -clang-tidy-binary "${CLANG_TIDY}" \
  -clang-apply-replacements-binary "${CLANG_APPLY_REPLACEMENTS}" \
  "${FILES[@]}"
fi
cd "${FUCHSIA_DIR}"
