diff --git a/docs/yaml/functions/is_disabler.yaml b/docs/yaml/functions/is_disabler.yaml index 278634541627..8a26bf684a97 100644 --- a/docs/yaml/functions/is_disabler.yaml +++ b/docs/yaml/functions/is_disabler.yaml @@ -1,7 +1,11 @@ name: is_disabler returns: bool since: 0.52.0 -description: Returns true if a variable is a disabler and false otherwise. +description: | + Returns true if a variable is a disabler and false otherwise. + + Since 1.10.0, the variable can be a list and true is returned if any of its + items is a disabler. posargs: var: diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 631890d0fbee..b5b38c4fd7ac 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -27,10 +27,11 @@ from ..interpreterbase import ContainerTypeInfo, InterpreterBase, KwargInfo, typed_kwargs, typed_pos_args from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, noArgsFlattening, noSecondLevelHolderResolving, unholder_return from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest -from ..interpreterbase import Disabler, disablerIfNotFound +from ..interpreterbase import Disabler, disablerIfNotFound, is_disabled from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureBroken, FeatureNewKwargs from ..interpreterbase import ObjectHolder, ContextManagerObject from ..interpreterbase import stringifyUserArguments + from ..modules import ExtensionModule, ModuleObject, MutableModuleObject, NewExtensionModule, NotFoundExtensionModule from ..optinterpreter import optname_regex @@ -3589,8 +3590,16 @@ def machine_from_native_kwarg(kwargs: T.Dict[str, T.Any]) -> MachineChoice: @FeatureNew('is_disabler', '0.52.0') @typed_pos_args('is_disabler', object) @noKwargs + @noArgsFlattening def func_is_disabler(self, node: mparser.BaseNode, args: T.Tuple[object], kwargs: 'TYPE_kwargs') -> bool: - return isinstance(args[0], Disabler) + if isinstance(args[0], Disabler): + return True + if isinstance(args[0], dict): + return is_disabled([], args[0]) + if isinstance(args[0], list): + FeatureNew.single_use('is_disabler with list argument', '1.10.0', self.subproject, location=node) + return is_disabled(args[0], {}) + return False @noKwargs @FeatureNew('range', '0.58.0') diff --git a/test cases/common/158 disabler/meson.build b/test cases/common/158 disabler/meson.build index 65ca5fdf5457..beaa863bd0c2 100644 --- a/test cases/common/158 disabler/meson.build +++ b/test cases/common/158 disabler/meson.build @@ -151,3 +151,12 @@ foreach k, i : {'a': true, 'b': disabler(), 'c': true} endforeach assert(loops == 3, 'Disabler in foreach dict') assert(disablers == 1, 'Disabler in foreach dict') + +assert(not is_disabler([1, 2, 3])) +assert(is_disabler([1, disabler(), 3])) +assert(is_disabler([1, [disabler()], 3])) +assert(is_disabler({'a': 1, 'b': disabler(), 'c': 3})) +assert(is_disabler({'a': 1, 'b': [disabler()], 'c': 3})) +# Disctionaries are not looked into recursively, unlike lists. +# This reflects the behavior kwargs handling. +assert(not is_disabler({'a': 1, 'b': {'x': disabler()}, 'c': 3}))