diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-25 21:14:27 +0200 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2021-06-26 12:49:35 +0200 |
commit | 8f7343831bb78e6801c93cd45e4edfeed65bc437 (patch) | |
tree | e90a37ac9b27584b8c43a32779330705973def02 /mesonbuild/interpreterbase | |
parent | b95d6e319f18389c3a11408481335955bdff4e36 (diff) | |
download | meson-8f7343831bb78e6801c93cd45e4edfeed65bc437.zip meson-8f7343831bb78e6801c93cd45e4edfeed65bc437.tar.gz meson-8f7343831bb78e6801c93cd45e4edfeed65bc437.tar.bz2 |
refactor: Refactor BothLibraries logic
This commit introduces a new type of `HoldableObject`: The
`SecondLevelHolder`. The primary purpose of this class is
to handle cases where two (or more) `HoldableObject`s are
stored at the same time (with one default object). The
best (and currently only) example here is the `BothLibraries`
class.
Diffstat (limited to 'mesonbuild/interpreterbase')
-rw-r--r-- | mesonbuild/interpreterbase/__init__.py | 5 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/baseobjects.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/decorators.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/helpers.py | 13 | ||||
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 4 |
5 files changed, 26 insertions, 4 deletions
diff --git a/mesonbuild/interpreterbase/__init__.py b/mesonbuild/interpreterbase/__init__.py index d776ae1..298a034 100644 --- a/mesonbuild/interpreterbase/__init__.py +++ b/mesonbuild/interpreterbase/__init__.py @@ -33,12 +33,14 @@ __all__ = [ 'check_stringlist', 'default_resolve_key', 'flatten', + 'resolve_second_level_holders', 'noPosargs', 'builtinMethodNoKwargs', 'noKwargs', 'stringArgs', 'noArgsFlattening', + 'noSecondLevelHolderResolving', 'unholder_return', 'disablerIfNotFound', 'permittedKwargs', @@ -91,6 +93,7 @@ from .decorators import ( noKwargs, stringArgs, noArgsFlattening, + noSecondLevelHolderResolving, unholder_return, disablerIfNotFound, permittedKwargs, @@ -115,5 +118,5 @@ from .exceptions import ( ) from .disabler import Disabler, is_disabled -from .helpers import check_stringlist, default_resolve_key, flatten +from .helpers import check_stringlist, default_resolve_key, flatten, resolve_second_level_holders from .interpreterbase import MesonVersionString, InterpreterBase diff --git a/mesonbuild/interpreterbase/baseobjects.py b/mesonbuild/interpreterbase/baseobjects.py index d82aad2..e65e4cb 100644 --- a/mesonbuild/interpreterbase/baseobjects.py +++ b/mesonbuild/interpreterbase/baseobjects.py @@ -14,7 +14,7 @@ from .. import mparser from .exceptions import InvalidCode -from .helpers import flatten +from .helpers import flatten, resolve_second_level_holders from ..mesonlib import HoldableObject import typing as T @@ -57,6 +57,8 @@ class InterpreterObject: method = self.methods[method_name] if not getattr(method, 'no-args-flattening', False): args = flatten(args) + if not getattr(method, 'no-second-level-holder-flattening', False): + args, kwargs = resolve_second_level_holders(args, kwargs) return method(args, kwargs) raise InvalidCode(f'Unknown method "{method_name}" in object {self} of type {type(self).__name__}.') diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py index b05df5b..b91e9d5 100644 --- a/mesonbuild/interpreterbase/decorators.py +++ b/mesonbuild/interpreterbase/decorators.py @@ -68,6 +68,10 @@ def noArgsFlattening(f: TV_func) -> TV_func: setattr(f, 'no-args-flattening', True) # noqa: B010 return f +def noSecondLevelHolderResolving(f: TV_func) -> TV_func: + setattr(f, 'no-second-level-holder-flattening', True) # noqa: B010 + return f + def unholder_return(f: TV_func) -> T.Callable[..., TYPE_var]: @wraps(f) def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any: diff --git a/mesonbuild/interpreterbase/helpers.py b/mesonbuild/interpreterbase/helpers.py index 2602e80..2352577 100644 --- a/mesonbuild/interpreterbase/helpers.py +++ b/mesonbuild/interpreterbase/helpers.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from .. import mparser, mlog +from .. import mesonlib, mparser, mlog from .exceptions import InvalidArguments, InterpreterException import collections.abc @@ -38,6 +38,17 @@ def flatten(args: T.Union['TYPE_var', T.List['TYPE_var']]) -> T.List['TYPE_var'] result.append(a) return result +def resolve_second_level_holders(args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> T.Tuple[T.List['TYPE_var'], 'TYPE_kwargs']: + def resolver(arg: 'TYPE_var') -> 'TYPE_var': + if isinstance(arg, list): + return [resolver(x) for x in arg] + if isinstance(arg, dict): + return {k: resolver(v) for k, v in arg.items()} + if isinstance(arg, mesonlib.SecondLevelHolder): + return arg.get_default_object() + return arg + return [resolver(x) for x in args], {k: resolver(v) for k, v in kwargs.items()} + def check_stringlist(a: T.Any, msg: str = 'Arguments must be strings.') -> None: if not isinstance(a, list): mlog.debug('Not a list:', str(a)) diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index 3ea10f4..3f5726b 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -42,7 +42,7 @@ from .exceptions import ( from .decorators import FeatureNew, builtinMethodNoKwargs from .disabler import Disabler, is_disabled -from .helpers import check_stringlist, default_resolve_key, flatten +from .helpers import check_stringlist, default_resolve_key, flatten, resolve_second_level_holders from ._unholder import _unholder import os, copy, re @@ -546,6 +546,8 @@ The result of this is undefined and will become a hard error in a future Meson r func_args = posargs if not getattr(func, 'no-args-flattening', False): func_args = flatten(posargs) + if not getattr(func, 'no-second-level-holder-flattening', False): + func_args, kwargs = resolve_second_level_holders(func_args, kwargs) res = func(node, func_args, kwargs) return self._holderify(res) else: |