various low-hanging typing fruit

ninjabackend.py goes down from 322 type errors to 253, mainly by marking
functions as returning None.
pull/13483/head
Eli Schwartz 6 months ago
parent 2daf5f7c9d
commit 433c13c5c4
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
  1. 112
      mesonbuild/backend/ninjabackend.py

@ -45,6 +45,7 @@ if T.TYPE_CHECKING:
from ..linkers.linkers import DynamicLinker, StaticLinker
from ..compilers.cs import CsCompiler
from ..compilers.fortran import FortranCompiler
from ..mesonlib import FileOrString
CommandArgOrStr = T.List[T.Union['NinjaCommandArg', str]]
RUST_EDITIONS = Literal['2015', '2018', '2021']
@ -333,7 +334,7 @@ class NinjaBuildElement:
else:
self.deps.add(dep)
def add_orderdep(self, dep):
def add_orderdep(self, dep) -> None:
if isinstance(dep, list):
self.orderdeps.update(dep)
else:
@ -351,7 +352,7 @@ class NinjaBuildElement:
if name == 'DEPFILE':
self.elems.append((name + '_UNQUOTED', elems))
def _should_use_rspfile(self):
def _should_use_rspfile(self) -> bool:
# 'phony' is a rule built-in to ninja
if self.rulename == 'phony':
return False
@ -366,14 +367,14 @@ class NinjaBuildElement:
outfilenames,
self.elems) >= rsp_threshold
def count_rule_references(self):
def count_rule_references(self) -> None:
if self.rulename != 'phony':
if self._should_use_rspfile():
self.rule.rsprefcount += 1
else:
self.rule.refcount += 1
def write(self, outfile):
def write(self, outfile: T.TextIO) -> None:
if self.output_errors:
raise MesonException(self.output_errors)
ins = ' '.join([ninja_quote(i, True) for i in self.infilenames])
@ -432,7 +433,7 @@ class NinjaBuildElement:
outfile.write(line)
outfile.write('\n')
def check_outputs(self):
def check_outputs(self) -> None:
for n in self.outfilenames:
if n in self.all_outputs:
self.output_errors = f'Multiple producers for Ninja target "{n}". Please rename your targets.'
@ -713,7 +714,7 @@ class NinjaBackend(backends.Backend):
f, indent=4)
# http://clang.llvm.org/docs/JSONCompilationDatabase.html
def generate_compdb(self):
def generate_compdb(self) -> None:
rules = []
# TODO: Rather than an explicit list here, rules could be marked in the
# rule store as being wanted in compdb
@ -735,10 +736,10 @@ class NinjaBackend(backends.Backend):
# Get all generated headers. Any source file might need them so
# we need to add an order dependency to them.
def get_generated_headers(self, target):
def get_generated_headers(self, target: build.BuildTarget) -> T.List[FileOrString]:
if hasattr(target, 'cached_generated_headers'):
return target.cached_generated_headers
header_deps = []
header_deps: T.List[FileOrString] = []
# XXX: Why don't we add deps to CustomTarget headers here?
for genlist in target.get_generated_sources():
if isinstance(genlist, (build.CustomTarget, build.CustomTargetIndex)):
@ -798,7 +799,7 @@ class NinjaBackend(backends.Backend):
return True
def create_target_source_introspection(self, target: build.Target, comp: compilers.Compiler, parameters, sources, generated_sources,
unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None):
unity_sources: T.Optional[T.List[FileOrString]] = None) -> None:
'''
Adds the source file introspection information for a language of a target
@ -837,7 +838,7 @@ class NinjaBackend(backends.Backend):
}
tgt[id_hash] = src_block
def compute_path(file: mesonlib.FileOrString) -> str:
def compute_path(file: FileOrString) -> str:
""" Make source files absolute """
if isinstance(file, File):
return file.absolute_path(self.source_dir, self.build_dir)
@ -848,7 +849,7 @@ class NinjaBackend(backends.Backend):
if unity_sources:
src_block['unity_sources'].extend(compute_path(x) for x in unity_sources)
def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters):
def create_target_linker_introspection(self, target: build.Target, linker: T.Union[Compiler, StaticLinker], parameters) -> None:
tid = target.get_id()
tgt = self.introspection_data[tid]
lnk_hash = tuple(parameters)
@ -868,7 +869,7 @@ class NinjaBackend(backends.Backend):
}
tgt[lnk_hash] = lnk_block
def generate_target(self, target):
def generate_target(self, target) -> None:
if isinstance(target, build.BuildTarget):
os.makedirs(self.get_target_private_dir_abs(target), exist_ok=True)
if isinstance(target, build.CustomTarget):
@ -1108,7 +1109,7 @@ class NinjaBackend(backends.Backend):
compiled_sources: T.List[str],
source2object: T.Dict[str, str],
generated_source_files: T.List[mesonlib.File],
object_deps: T.List['mesonlib.FileOrString']) -> None:
object_deps: T.List[FileOrString]) -> None:
if not self.should_use_dyndeps_for_target(target):
return
self._uses_dyndeps = True
@ -1152,12 +1153,12 @@ class NinjaBackend(backends.Backend):
elif ext.lower() in compilers.lang_suffixes['fortran']:
yield source, 'fortran'
def process_target_dependencies(self, target):
def process_target_dependencies(self, target) -> None:
for t in target.get_dependencies():
if t.get_id() not in self.processed_targets:
self.generate_target(t)
def custom_target_generator_inputs(self, target):
def custom_target_generator_inputs(self, target) -> None:
for s in target.sources:
if isinstance(s, build.GeneratedList):
self.generate_genlist_for_target(s, target)
@ -1173,7 +1174,7 @@ class NinjaBackend(backends.Backend):
deps.append(os.path.join(self.get_target_dir(i), output))
return deps
def generate_custom_target(self, target: build.CustomTarget):
def generate_custom_target(self, target: build.CustomTarget) -> None:
self.custom_target_generator_inputs(target)
(srcs, ofilenames, cmd) = self.eval_custom_target_command(target)
deps = self.unwrap_dep_list(target)
@ -1215,14 +1216,14 @@ class NinjaBackend(backends.Backend):
self.add_build(elem)
self.processed_targets.add(target.get_id())
def build_run_target_name(self, target):
def build_run_target_name(self, target) -> str:
if target.subproject != '':
subproject_prefix = f'{target.subproject}@@'
else:
subproject_prefix = ''
return f'{subproject_prefix}{target.name}'
def generate_run_target(self, target: build.RunTarget):
def generate_run_target(self, target: build.RunTarget) -> None:
target_name = self.build_run_target_name(target)
if not target.command:
# This is an alias target, it has no command, it just depends on
@ -1245,7 +1246,8 @@ class NinjaBackend(backends.Backend):
self.add_build(elem)
self.processed_targets.add(target.get_id())
def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str], gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]):
def generate_coverage_command(self, elem: NinjaBuildElement, outputs: T.List[str],
gcovr_exe: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
targets = self.build.get_targets().values()
use_llvm_cov = False
exe_args = []
@ -1272,14 +1274,14 @@ class NinjaBackend(backends.Backend):
exe_args +
(['--use-llvm-cov'] if use_llvm_cov else []))
def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]):
def generate_coverage_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
e = self.create_phony_target('coverage', 'CUSTOM_COMMAND', 'PHONY')
self.generate_coverage_command(e, [], gcovr_exe, llvm_cov_exe)
e.add_item('description', 'Generates coverage reports')
self.add_build(e)
self.generate_coverage_legacy_rules(gcovr_exe, gcovr_version, llvm_cov_exe)
def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]):
def generate_coverage_legacy_rules(self, gcovr_exe: T.Optional[str], gcovr_version: T.Optional[str], llvm_cov_exe: T.Optional[str]) -> None:
e = self.create_phony_target('coverage-html', 'CUSTOM_COMMAND', 'PHONY')
self.generate_coverage_command(e, ['--html'], gcovr_exe, llvm_cov_exe)
e.add_item('description', 'Generates HTML coverage report')
@ -1302,7 +1304,7 @@ class NinjaBackend(backends.Backend):
e.add_item('description', 'Generates Sonarqube XML coverage report')
self.add_build(e)
def generate_install(self):
def generate_install(self) -> None:
self.create_install_data_files()
elem = self.create_phony_target('install', 'CUSTOM_COMMAND', 'PHONY')
elem.add_dep('all')
@ -1311,7 +1313,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('pool', 'console')
self.add_build(elem)
def generate_tests(self):
def generate_tests(self) -> None:
self.serialize_tests()
cmd = self.environment.get_build_command(True) + ['test', '--no-rebuild']
if not self.environment.coredata.get_option(OptionKey('stdsplit')):
@ -1334,7 +1336,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('pool', 'console')
self.add_build(elem)
def generate_rules(self):
def generate_rules(self) -> None:
self.rules = []
self.ruledict = {}
@ -1409,7 +1411,7 @@ class NinjaBackend(backends.Backend):
elem = NinjaBuildElement(self.all_outputs, 'PHONY', 'phony', '')
self.add_build(elem)
def generate_jar_target(self, target: build.Jar):
def generate_jar_target(self, target: build.Jar) -> None:
fname = target.get_filename()
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
@ -1463,7 +1465,7 @@ class NinjaBackend(backends.Backend):
# Create introspection information
self.create_target_source_introspection(target, compiler, compile_args, src_list, gen_src_list)
def generate_cs_resource_tasks(self, target):
def generate_cs_resource_tasks(self, target) -> T.Tuple[T.List[str], T.List[str]]:
args = []
deps = []
for r in target.resources:
@ -1484,7 +1486,7 @@ class NinjaBackend(backends.Backend):
args.append(a)
return args, deps
def generate_cs_target(self, target: build.BuildTarget):
def generate_cs_target(self, target: build.BuildTarget) -> None:
fname = target.get_filename()
outname_rel = os.path.join(self.get_target_dir(target), fname)
src_list = target.get_sources()
@ -1529,7 +1531,7 @@ class NinjaBackend(backends.Backend):
self.generate_generator_list_rules(target)
self.create_target_source_introspection(target, compiler, commands, rel_srcs, generated_rel_srcs)
def determine_java_compile_args(self, target, compiler):
def determine_java_compile_args(self, target, compiler) -> T.List[str]:
args = []
args = self.generate_basic_compiler_args(target, compiler)
args += target.get_java_args()
@ -1569,13 +1571,13 @@ class NinjaBackend(backends.Backend):
self.add_build(element)
return plain_class_paths
def generate_java_link(self):
def generate_java_link(self) -> None:
rule = 'java_LINKER'
command = ['jar', '$ARGS']
description = 'Creating JAR $out'
self.add_rule(NinjaRule(rule, command, [], description))
def determine_dep_vapis(self, target):
def determine_dep_vapis(self, target) -> T.List[str]:
"""
Peek into the sources of BuildTargets we're linking with, and if any of
them was built with Vala, assume that it also generated a .vapi file of
@ -1838,7 +1840,7 @@ class NinjaBackend(backends.Backend):
return static_sources, generated_sources, cython_sources
def _generate_copy_target(self, src: 'mesonlib.FileOrString', output: Path) -> None:
def _generate_copy_target(self, src: FileOrString, output: Path) -> None:
"""Create a target to copy a source file from one location to another."""
if isinstance(src, File):
instr = src.absolute_path(self.environment.source_dir, self.environment.build_dir)
@ -2191,7 +2193,7 @@ class NinjaBackend(backends.Backend):
others.append(i)
return srcs, others
def generate_swift_target(self, target):
def generate_swift_target(self, target) -> None:
module_name = self.target_swift_modulename(target)
swiftc = target.compilers['swift']
abssrc = []
@ -2296,7 +2298,7 @@ class NinjaBackend(backends.Backend):
options['rspfile_quote_style'] = tool.rsp_file_syntax()
return options
def generate_static_link_rules(self):
def generate_static_link_rules(self) -> None:
num_pools = self.environment.coredata.optstore.get_value('backend_max_links')
if 'java' in self.environment.coredata.compilers.host:
self.generate_java_link()
@ -2344,7 +2346,7 @@ class NinjaBackend(backends.Backend):
options = self._rsp_options(static_linker)
self.add_rule(NinjaRule(rule, cmdlist, args, description, **options, extra=pool))
def generate_dynamic_link_rules(self):
def generate_dynamic_link_rules(self) -> None:
num_pools = self.environment.coredata.optstore.get_value('backend_max_links')
for for_machine in MachineChoice:
complist = self.environment.coredata.compilers[for_machine]
@ -2383,7 +2385,7 @@ class NinjaBackend(backends.Backend):
synstat = 'restat = 1'
self.add_rule(NinjaRule(symrule, symcmd, [], syndesc, extra=synstat))
def generate_java_compile_rule(self, compiler):
def generate_java_compile_rule(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Java sources for $FOR_JAR'
@ -2398,7 +2400,7 @@ class NinjaBackend(backends.Backend):
rspable=mesonlib.is_windows(),
rspfile_quote_style=compiler.rsp_file_syntax()))
def generate_vala_compile_rules(self, compiler):
def generate_vala_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Vala source $in'
@ -2419,7 +2421,7 @@ class NinjaBackend(backends.Backend):
depfile=depfile,
extra='restat = 1'))
def generate_rust_compile_rules(self, compiler):
def generate_rust_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
command = compiler.get_exelist() + ['$ARGS', '$in']
description = 'Compiling Rust source $in'
@ -2428,7 +2430,7 @@ class NinjaBackend(backends.Backend):
self.add_rule(NinjaRule(rule, command, [], description, deps=depstyle,
depfile=depfile))
def generate_swift_compile_rules(self, compiler):
def generate_swift_compile_rules(self, compiler) -> None:
rule = self.compiler_to_rule_name(compiler)
full_exe = self.environment.get_build_command() + [
'--internal',
@ -2459,7 +2461,7 @@ https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, cmd, [], 'Dep hack', extra='restat = 1'))
def generate_llvm_ir_compile_rule(self, compiler):
def generate_llvm_ir_compile_rule(self, compiler) -> None:
if self.created_llvm_ir_rule[compiler.for_machine]:
return
rule = self.get_compiler_rule_name('llvm_ir', compiler.for_machine)
@ -2472,7 +2474,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, args, description, **options))
self.created_llvm_ir_rule[compiler.for_machine] = True
def generate_compile_rule_for(self, langname, compiler):
def generate_compile_rule_for(self, langname: str, compiler: Compiler) -> None:
if langname == 'java':
self.generate_java_compile_rule(compiler)
return
@ -2518,7 +2520,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, args, description, **options,
deps=deps, depfile=depfile))
def generate_pch_rule_for(self, langname, compiler):
def generate_pch_rule_for(self, langname: str, compiler: Compiler) -> None:
if langname not in {'c', 'cpp'}:
return
rule = self.compiler_to_pch_rule_name(compiler)
@ -2544,7 +2546,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.add_rule(NinjaRule(rule, command, [], description, deps=deps,
depfile=depfile))
def generate_scanner_rules(self):
def generate_scanner_rules(self) -> None:
rulename = 'depscan'
if rulename in self.ruledict:
# Scanning command is the same for native and cross compilation.
@ -2556,7 +2558,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
rule = NinjaRule(rulename, command, args, description)
self.add_rule(rule)
def generate_compile_rules(self):
def generate_compile_rules(self) -> None:
for for_machine in MachineChoice:
clist = self.environment.coredata.compilers[for_machine]
for langname, compiler in clist.items():
@ -2567,7 +2569,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
for mode in compiler.get_modes():
self.generate_compile_rule_for(langname, mode)
def generate_generator_list_rules(self, target):
def generate_generator_list_rules(self, target) -> None:
# CustomTargets have already written their rules and
# CustomTargetIndexes don't actually get generated, so write rules for
# GeneratedLists here
@ -2652,7 +2654,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
elem.add_item('COMMAND', cmdlist)
self.add_build(elem)
def scan_fortran_module_outputs(self, target):
def scan_fortran_module_outputs(self, target) -> None:
"""
Find all module and submodule made available in a Fortran code file.
"""
@ -2794,7 +2796,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
return linker.get_link_debugfile_args(filename)
return []
def generate_llvm_ir_compile(self, target, src: mesonlib.FileOrString):
def generate_llvm_ir_compile(self, target, src: FileOrString):
base_proxy = target.get_options()
compiler = get_compiler_for_source(target.compilers.values(), src)
commands = compiler.compiler_args()
@ -2954,9 +2956,9 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
def generate_single_compile(self, target: build.BuildTarget, src,
is_generated: bool = False, header_deps=None,
order_deps: T.Optional[T.List['mesonlib.FileOrString']] = None,
order_deps: T.Optional[T.List[FileOrString]] = None,
extra_args: T.Optional[T.List[str]] = None,
unity_sources: T.Optional[T.List[mesonlib.FileOrString]] = None,
unity_sources: T.Optional[T.List[FileOrString]] = None,
) -> T.Tuple[str, str]:
"""
Compiles C/C++, ObjC/ObjC++, Fortran, and D sources
@ -3098,7 +3100,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
assert isinstance(rel_src, str)
return (rel_obj, rel_src.replace('\\', '/'))
def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src):
def add_dependency_scanner_entries_to_element(self, target: build.BuildTarget, compiler, element, src) -> None:
if not self.should_use_dyndeps_for_target(target):
return
if isinstance(target, build.CompileTarget):
@ -3123,7 +3125,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
d = os.path.join(self.get_target_private_dir(target), d)
ninja_element.add_dep(d)
def has_dir_part(self, fname: mesonlib.FileOrString) -> bool:
def has_dir_part(self, fname: FileOrString) -> bool:
# FIXME FIXME: The usage of this is a terrible and unreliable hack
if isinstance(fname, File):
return fname.subdir != ''
@ -3230,7 +3232,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
targetdir = self.get_target_private_dir(target)
return os.path.join(targetdir, target.get_filename() + '.symbols')
def generate_shsym(self, target):
def generate_shsym(self, target) -> None:
target_file = self.get_target_filename(target)
symname = self.get_target_shsym_filename(target)
elem = NinjaBuildElement(self.all_outputs, symname, 'SHSYM', target_file)
@ -3240,7 +3242,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
elem.add_item('CROSS', '--cross-host=' + self.environment.machines[target.for_machine].system)
self.add_build(elem)
def get_import_filename(self, target):
def get_import_filename(self, target) -> str:
return os.path.join(self.get_target_dir(target), target.import_filename)
def get_target_type_link_args(self, target, linker):
@ -3295,7 +3297,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
commands += linker.get_win_subsystem_args(target.win_subsystem)
return commands
def get_link_whole_args(self, linker, target):
def get_link_whole_args(self, linker: DynamicLinker, target):
use_custom = False
if linker.id == 'msvc':
# Expand our object lists manually if we are on pre-Visual Studio 2015 Update 2
@ -3565,7 +3567,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.environment.get_build_dir())
return self.get_target_filename(t)
def generate_shlib_aliases(self, target, outdir):
def generate_shlib_aliases(self, target, outdir) -> None:
for alias, to, tag in target.get_aliases():
aliasfile = os.path.join(outdir, alias)
abs_aliasfile = os.path.join(self.environment.get_build_dir(), outdir, alias)
@ -3605,7 +3607,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
gcda_elem.add_item('description', 'Deleting gcda files')
self.add_build(gcda_elem)
def get_user_option_args(self):
def get_user_option_args(self) -> T.List[str]:
cmds = []
for k, v in self.environment.coredata.optstore.items():
if self.environment.coredata.optstore.is_project_option(k):

Loading…
Cancel
Save