#!/usr/bin/env python
# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

"""Invoke clang-tidy tool.

Usage: clang_tidy.py file.cc [clang-tidy-args...]

Just a proof of concept!
We use an embedded clang-tidy whose version doesn't match clang++.
"""

import argparse
import os
import shutil
import subprocess
import sys
import tempfile
#pylint: disable=relative-import
from presubmit_checks_lib.build_helpers import GetClangTidyPath, \
  GetCompilationCommand


# We enable all checkers by default for investigation purpose.
# This includes clang-analyzer-* checks.
# Individual checkers can be disabled via command line options.
# TODO(bugs.webrtc.com/10258): Select checkers relevant to webrtc guidelines.
CHECKER_OPTION = '-checks=*'


def Process(filepath, args):
  # Build directory is needed to gather compilation flags.
  # Create a temporary one (instead of reusing an existing one)
  # to keep the CLI simple and unencumbered.
  out_dir = tempfile.mkdtemp('clang_tidy')

  try:
    gn_args = []  # Use default build.
    command = GetCompilationCommand(filepath, gn_args, out_dir)

    # Remove warning flags. They aren't needed and they cause trouble
    # when clang-tidy doesn't match most recent clang.
    # Same battle for -f (e.g. -fcomplete-member-pointers).
    command = [arg for arg in command if not (arg.startswith('-W') or
                                              arg.startswith('-f'))]

    # Path from build dir.
    rel_path = os.path.relpath(os.path.abspath(filepath), out_dir)

    # Replace clang++ by clang-tidy
    command[0:1] = [GetClangTidyPath(),
                    CHECKER_OPTION,
                    rel_path] + args + ['--']  # Separator for clang flags.
    print "Running: %s" % ' '.join(command)
    # Run from build dir so that relative paths are correct.
    p = subprocess.Popen(command, cwd=out_dir,
                         stdout=sys.stdout, stderr=sys.stderr)
    p.communicate()
    return p.returncode
  finally:
    shutil.rmtree(out_dir, ignore_errors=True)


def ValidateCC(filepath):
  """We can only analyze .cc files. Provide explicit message about that."""
  if filepath.endswith('.cc'):
    return filepath
  msg = ('%s not supported.\n'
         'For now, we can only analyze translation units (.cc files).' %
         filepath)
  raise argparse.ArgumentTypeError(msg)


def Main():
  description = (
    "Run clang-tidy on single cc file.\n"
    "Use flags, defines and include paths as in default debug build.\n"
    "WARNING, this is a POC version with rough edges.")
  parser = argparse.ArgumentParser(description=description)
  parser.add_argument('filepath',
                      help='Specifies the path of the .cc file to analyze.',
                      type=ValidateCC)
  parser.add_argument('args',
                      nargs=argparse.REMAINDER,
                      help='Arguments passed to clang-tidy')
  parsed_args = parser.parse_args()
  return Process(parsed_args.filepath, parsed_args.args)


if __name__ == '__main__':
  sys.exit(Main())
