Files
sdk/tools/generate_idefiles.py
T
Daco Harkes 20f37e3e33 [tools] Make generate_idefiles ignore most Dart files
Make tools/generate_idefiles.py generate analysis_options.yaml which
ignores most Dart files while we are in a state in which we pass a flag
to the analyzer on whether it should analyze in NNBD mode or not.

Both passing the flag and not passing the flag currently results in
10000s errors in the SDK on the files which should be analyzed the other
way.

This CL changes generate_idefiles.py to exclude many folders, after
which the user can manually uncomment some of the lines in
analysis_options.yaml that correspond the current dartanalyzer flag
setting.

Change-Id: I6c05251691ee1cae12ab3a98fbaf1e6a97b37475
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/168344
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Tess Strickland <sstrickl@google.com>
2020-10-19 14:01:57 +00:00

181 lines
4.8 KiB
Python
Executable File

#!/usr/bin/python
#
# Copyright (c) 2018, 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.
"""Script to generate configuration files for analysis servers of C++ and Dart.
It generates compile_commands.json for C++ clang and intellij and
analysis_options.yaml for the Dart analyzer.
"""
import argparse
import json
import os
import subprocess
import sys
import generate_buildfiles
import utils
HOST_OS = utils.GuessOS()
def GenerateIdeFiles(options):
GenerateCompileCommands(options)
GenerateAnalysisOptions(options)
def GenerateCompileCommands(options):
"""Generate compile_commands.json for the C++ analysis servers.
compile_commands.json is used by the c++ clang and intellij language analysis
servers used in IDEs such as Visual Studio Code and Emacs.
Args:
options: supported options include: verbose, force, dir
Returns:
success (0) or failure (non zero)
"""
fname = os.path.join(options.dir, "compile_commands.json")
if os.path.isfile(fname) and not options.force:
print fname + " already exists, use --force to override"
return
gn_result = generate_buildfiles.RunGn(options)
if gn_result != 0:
return gn_result
out_folder = utils.GetBuildRoot(HOST_OS,
mode="debug",
arch=options.arch,
target_os=options.os)
if not os.path.isdir(out_folder):
return 1
command_set = json.loads(
subprocess.check_output(
["ninja", "-C", out_folder, "-t", "compdb", "cxx", "cc", "h"]))
commands = []
for obj in command_set:
command = obj["command"]
# Skip precompiled mode, a lot of code is commented out in precompiled mode
if "-DDART_PRECOMPILED_RUNTIME" in command:
continue
# Remove warnings
command = command.replace("-Werror", "")
obj["command"] = command
commands += [obj]
with open(fname, "w") as f:
json.dump(commands, f, indent=4)
return 0
def GenerateAnalysisOptions(options):
"""Generate analysis_optioms.yaml for the Dart analyzer.
To prevent dartanalyzer from tripping on the non-Dart files when it is
started from the root dart-sdk directory.
https://github.com/dart-lang/sdk/issues/35562
Args:
options: supported options include: force, dir
"""
contents = """analyzer:
exclude:
- benchmarks/**
- benchmarks-internal/**
- docs/newsletter/20171103/**
- pkg/**
- out/**
- runtime/**
- samples-dev/swarm/**
- sdk/lib/**
- tests/co19/**
- tests/co19_2/**
- tests/corelib/**
- tests/corelib_2/**
- tests/dart2js/**
- tests/dart2js_2/**
- tests/dartdevc/**
- tests/dartdevc_2/**
- tests/ffi/**
- tests/ffi_2/**
- tests/kernel/**
- tests/language/**
- tests/language_2/**
- tests/lib/**
- tests/lib_2/**
- tests/modular/**
- tests/standalone/**
- tests/standalone_2/**
- third_party/observatory_pub_packages/**
- third_party/pkg/**
- third_party/pkg_tested/dart_style/**
- third_party/tcmalloc/**
- tools/apps/update_homebrew/**
- tools/dart2js/**
- tools/dom/**
- tools/sdks/dart-sdk/lib/**
- tools/status_clean.dart
- xcodebuild/**"""
fname = os.path.join(options.dir, "analysis_options.yaml")
if os.path.isfile(fname) and not options.force:
print fname + " already exists, use --force to override"
return
with open(fname, "w") as f:
f.write(contents)
def main(argv):
parser = argparse.ArgumentParser(
description="Python script to generate compile_commands.json and "
"analysis_options.yaml which are used by the analysis servers for "
"c++ and Dart.")
parser.add_argument("-v",
"--verbose",
help="Verbose output.",
action="store_true")
parser.add_argument("-f",
"--force",
help="Override files.",
action="store_true")
parser.add_argument("-d",
"--dir",
help="Target directory.",
default=utils.DART_DIR)
parser.add_argument("-a",
"--arch",
help="Target architecture for runtime sources.",
default="x64")
parser.add_argument("-s",
"--os",
help="Target operating system for runtime sources.",
default=HOST_OS)
options = parser.parse_args(argv[1:])
return GenerateIdeFiles(options)
if __name__ == "__main__":
sys.exit(main(sys.argv))