diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2021-06-07 10:03:55 -0700 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-08 11:00:55 +0200 |
commit | 3f9a81e7f14e166934b6fd44a1236aa808555656 (patch) | |
tree | 114fa5f7515d8682bf8999398d08f604d14d394b /mesonbuild/interpreter/interpreter.py | |
parent | 3e998527a350cb197ca61b59c0a98cb6681b5fdd (diff) | |
download | meson-3f9a81e7f14e166934b6fd44a1236aa808555656.zip meson-3f9a81e7f14e166934b6fd44a1236aa808555656.tar.gz meson-3f9a81e7f14e166934b6fd44a1236aa808555656.tar.bz2 |
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.
Diffstat (limited to 'mesonbuild/interpreter/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 38ab22f..6f613a1 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.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 |