diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2021-06-08 12:37:25 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-08 12:37:25 +0300 |
commit | a4a61b6bf8b7659a799dd31dd4f989056b1ccc00 (patch) | |
tree | 40675c93feec9a0e0e310b01e6bcb8c41a6dc7ea /mesonbuild/interpreter/interpreterobjects.py | |
parent | 98efec5c2b1ede3133470c0fc27e70b2ea4aa731 (diff) | |
parent | 6497e52035509a2669720b03bd166a50a834c784 (diff) | |
download | meson-a4a61b6bf8b7659a799dd31dd4f989056b1ccc00.zip meson-a4a61b6bf8b7659a799dd31dd4f989056b1ccc00.tar.gz meson-a4a61b6bf8b7659a799dd31dd4f989056b1ccc00.tar.bz2 |
Merge pull request #8512 from bonzini/feature-methods
Utility methods for feature objects
Diffstat (limited to 'mesonbuild/interpreter/interpreterobjects.py')
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 61720c8..e87feb9 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -66,29 +66,71 @@ class FeatureOptionHolder(InterpreterObject, ObjectHolder[coredata.UserFeatureOp def __init__(self, env: 'Environment', name: str, option: coredata.UserFeatureOption): InterpreterObject.__init__(self) ObjectHolder.__init__(self, option) - if option.is_auto(): + if option and option.is_auto(): # TODO: we need to case here because options is not a TypedDict self.held_object = T.cast(coredata.UserFeatureOption, env.coredata.options[OptionKey('auto_features')]) self.name = name self.methods.update({'enabled': self.enabled_method, 'disabled': self.disabled_method, + 'allowed': self.allowed_method, 'auto': self.auto_method, + 'require': self.require_method, + 'disable_auto_if': self.disable_auto_if_method, }) + @property + def value(self): + return 'disabled' if not self.held_object else self.held_object.value + + def as_disabled(self): + return FeatureOptionHolder(None, self.name, None) + @noPosargs @permittedKwargs({}) def enabled_method(self, args, kwargs): - return self.held_object.is_enabled() + return self.value == 'enabled' @noPosargs @permittedKwargs({}) def disabled_method(self, args, kwargs): - return self.held_object.is_disabled() + return self.value == 'disabled' + + @noPosargs + @permittedKwargs({}) + def allowed_method(self, args, kwargs): + return not self.value == 'disabled' @noPosargs @permittedKwargs({}) def auto_method(self, args, kwargs): - return self.held_object.is_auto() + return self.value == 'auto' + + @permittedKwargs({'error_message'}) + def require_method(self, args, kwargs): + if len(args) != 1: + raise InvalidArguments('Expected 1 argument, got %d.' % (len(args), )) + if not isinstance(args[0], bool): + raise InvalidArguments('boolean argument expected.') + error_message = kwargs.pop('error_message', '') + if error_message and not isinstance(error_message, str): + raise InterpreterException("Error message must be a string.") + if args[0]: + return self + + if self.value == 'enabled': + prefix = 'Feature {} cannot be enabled'.format(self.name) + prefix = prefix + ': ' if error_message else '' + raise InterpreterException(prefix + error_message) + return self.as_disabled() + + @permittedKwargs({}) + def disable_auto_if_method(self, args, kwargs): + if len(args) != 1: + raise InvalidArguments('Expected 1 argument, got %d.' % (len(args), )) + if not isinstance(args[0], bool): + raise InvalidArguments('boolean argument expected.') + return self if self.value != 'auto' or not args[0] else self.as_disabled() + class RunProcess(InterpreterObject): |