interpreter: use typed_kwargs for the add_*_arguments family

This makes use of the new convertor and validator arguments, so that we
can check that the languages passed are in fact vaild, and then convert
the native boolean into a MachineChoice internally.
pull/8853/head
Dylan Baker 4 years ago committed by Daniel Mensinger
parent 3e998527a3
commit 3f9a81e7f1
  1. 59
      mesonbuild/interpreter/interpreter.py
  2. 26
      mesonbuild/interpreter/kwargs.py

@ -25,7 +25,7 @@ from ..mesonlib import FileMode, MachineChoice, OptionKey, listify, extract_as_l
from ..programs import ExternalProgram, NonExistingExternalProgram
from ..dependencies import Dependency, NotFoundDependency, DependencyException
from ..depfile import DepFile
from ..interpreterbase import InterpreterBase, typed_pos_args
from ..interpreterbase import ContainerTypeInfo, InterpreterBase, KwargInfo, typed_kwargs, typed_pos_args
from ..interpreterbase import noPosargs, noKwargs, stringArgs, permittedKwargs, noArgsFlattening
from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest
from ..interpreterbase import InterpreterObject, Disabler, disablerIfNotFound
@ -60,9 +60,7 @@ import typing as T
import importlib
if T.TYPE_CHECKING:
from ..compilers import Compiler
from ..envconfig import MachineInfo
from ..environment import Environment
from . import kwargs
# Input source types passed to Targets
SourceInputs = T.Union[mesonlib.File, GeneratedListHolder, TargetHolder,
@ -72,6 +70,31 @@ if T.TYPE_CHECKING:
build.BuildTarget, build.CustomTargetIndex,
build.GeneratedList]
def _language_validator(l: T.List[str]) -> T.Optional[str]:
"""Validate language keyword argument.
Particularly for functions like `add_compiler()`, and `add_*_args()`
"""
diff = {a.lower() for a in l}.difference(compilers.all_languages)
if diff:
return f'unknown languages: {", ".join(diff)}'
return None
_NATIVE_KW = KwargInfo(
'native', bool,
default=False,
convertor=lambda n: MachineChoice.BUILD if n else MachineChoice.HOST)
_LANGUAGE_KW = KwargInfo(
'language', ContainerTypeInfo(list, str, allow_empty=False),
listify=True,
required=True,
validator=_language_validator,
convertor=lambda x: [i.lower() for i in x])
def stringifyUserArguments(args, quote=False):
if isinstance(args, list):
return '[%s]' % ', '.join([stringifyUserArguments(x, True) for x in args])
@ -2530,29 +2553,25 @@ This warning will become a hard error in a future Meson release.
self.build.test_setups[setup_name] = build.TestSetup(exe_wrapper, gdb, timeout_multiplier, env,
exclude_suites)
@permittedKwargs({'language', 'native'})
@typed_pos_args('add_global_arguments', varargs=str)
def func_add_global_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs):
for_machine = self.machine_from_native_kwarg(kwargs)
self.add_global_arguments(node, self.build.global_args[for_machine], args[0], kwargs)
@typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW)
def func_add_global_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None:
self.add_global_arguments(node, self.build.global_args[kwargs['native']], args[0], kwargs)
@permittedKwargs({'language', 'native'})
@typed_pos_args('add_global_link_arguments', varargs=str)
def func_add_global_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs):
for_machine = self.machine_from_native_kwarg(kwargs)
self.add_global_arguments(node, self.build.global_link_args[for_machine], args[0], kwargs)
@typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW)
def func_add_global_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None:
self.add_global_arguments(node, self.build.global_link_args[kwargs['native']], args[0], kwargs)
@permittedKwargs({'language', 'native'})
@typed_pos_args('add_project_arguments', varargs=str)
def func_add_project_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs):
for_machine = self.machine_from_native_kwarg(kwargs)
self.add_project_arguments(node, self.build.projects_args[for_machine], args[0], kwargs)
@typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW)
def func_add_project_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None:
self.add_project_arguments(node, self.build.projects_args[kwargs['native']], args[0], kwargs)
@permittedKwargs({'language', 'native'})
@typed_pos_args('add_project_link_arguments', varargs=str)
def func_add_project_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs):
for_machine = self.machine_from_native_kwarg(kwargs)
self.add_project_arguments(node, self.build.projects_link_args[for_machine], args[0], kwargs)
@typed_kwargs('add_global_arguments', _NATIVE_KW, _LANGUAGE_KW)
def func_add_project_link_arguments(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'kwargs.FuncAddProjectArgs') -> None:
self.add_project_arguments(node, self.build.projects_link_args[kwargs['native']], args[0], kwargs)
def warn_about_builtin_args(self, args):
# -Wpedantic is deliberately not included, since some people want to use it but not use -Wextra

@ -0,0 +1,26 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright © 2021 The Meson Developers
# Copyright © 2021 Intel Corporation
"""Keyword Argument type annotations."""
import typing as T
from typing_extensions import TypedDict
from ..mesonlib import MachineChoice
class FuncAddProjectArgs(TypedDict):
"""Keyword Arguments for the add_*_arguments family of arguments.
including `add_global_arguments`, `add_project_arguments`, and their
link variants
Because of the use of a convertor function, we get the native keyword as
a MachineChoice instance already.
"""
native: MachineChoice
language: T.List[str]
Loading…
Cancel
Save