diff options
| author | Dylan Baker <dylan@pnwbakers.com> | 2025-09-16 13:23:19 -0700 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-10-20 15:15:53 -0700 |
| commit | e005e9a459f3847a9d30861ec0a5f5653b4df0e4 (patch) | |
| tree | b77bde943801c0b0d83538413c6e1b51e14aeee1 /mesonbuild/interpreter/interpreterobjects.py | |
| parent | 87dac856b61dbd98e922aa159f08bce4852941d9 (diff) | |
| download | meson-e005e9a459f3847a9d30861ec0a5f5653b4df0e4.tar.gz | |
interpreter: Rework extract_required_kwarg to have better typing
This allows us to avoid making `feature` a union, therefore if we write
code like:
```python
disabled, required, feature = extract_required_kwarg(...)
if disabled:
...
```
and now mypy knows that feature is a `str` inside the `if disabled`
block
Diffstat (limited to 'mesonbuild/interpreter/interpreterobjects.py')
| -rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index b6137d175..697c4a0f0 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -36,7 +36,7 @@ if T.TYPE_CHECKING: from ..interpreterbase import FeatureCheckBase, SubProject, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs from .interpreter import Interpreter - from typing_extensions import TypedDict + from typing_extensions import Literal, TypedDict class EnvironmentSeparatorKW(TypedDict): @@ -52,18 +52,36 @@ _ERROR_MSG_KW: KwargInfo[T.Optional[str]] = KwargInfo('error_message', (str, Non def extract_required_kwarg(kwargs: 'kwargs.ExtractRequired', subproject: 'SubProject', feature_check: T.Optional[FeatureCheckBase] = None, - default: bool = True) -> T.Tuple[bool, bool, T.Optional[str]]: + default: bool = True + ) -> T.Union[T.Tuple[Literal[True], bool, str], + T.Tuple[Literal[False], bool, None]]: + """Check common keyword arguments for required status. + + This handles booleans vs feature option. + + :param kwargs: + keyword arguments from the Interpreter, containing a `required` argument + :param subproject: The subproject this is + :param feature_check: + A custom feature check for this use of `required` with a + `UserFeatureOption`, defaults to None. + :param default: + The default value is `required` is not set in `kwargs`, defaults to + True + :raises InterpreterException: If the type of `kwargs['required']` is invalid + :return: + a tuple of `disabled, required, feature_name`. If `disabled` is `True` + `feature_name` will be a string, otherwise it is `None` + """ val = kwargs.get('required', default) - disabled = False required = False - feature: T.Optional[str] = None if isinstance(val, options.UserFeatureOption): if not feature_check: feature_check = FeatureNew('User option "feature"', '0.47.0') feature_check.use(subproject) feature = val.name if val.is_disabled(): - disabled = True + return True, required, feature elif val.is_enabled(): required = True elif isinstance(val, bool): @@ -76,7 +94,7 @@ def extract_required_kwarg(kwargs: 'kwargs.ExtractRequired', # TODO: this should be removed, and those callers should learn about FeatureOptions kwargs['required'] = required - return disabled, required, feature + return False, required, None def extract_search_dirs(kwargs: 'kwargs.ExtractSearchDirs') -> T.List[str]: search_dirs_str = mesonlib.stringlistify(kwargs.get('dirs', [])) |
