diff options
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 6 | ||||
-rw-r--r-- | mesonbuild/interpreter/primitives/__init__.py | 2 | ||||
-rw-r--r-- | mesonbuild/interpreter/primitives/range.py | 34 |
3 files changed, 39 insertions, 3 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index f0b650b..9a89b0c 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -30,7 +30,7 @@ from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, noArgsFlatte from ..interpreterbase import InterpreterException, InvalidArguments, InvalidCode, SubdirDoneRequest from ..interpreterbase import Disabler, disablerIfNotFound from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureNewKwargs, FeatureDeprecatedKwargs -from ..interpreterbase import ObjectHolder, RangeHolder +from ..interpreterbase import ObjectHolder from ..interpreterbase.baseobjects import TYPE_nkwargs, TYPE_nvar, TYPE_var, TYPE_kwargs from ..modules import ExtensionModule, ModuleObject, MutableModuleObject, NewExtensionModule, NotFoundExtensionModule from ..cmake import CMakeInterpreter @@ -2761,7 +2761,7 @@ This will become a hard error in the future.''', location=self.current_node) @noKwargs @FeatureNew('range', '0.58.0') @typed_pos_args('range', int, optargs=[int, int]) - def func_range(self, node, args: T.Tuple[int, T.Optional[int], T.Optional[int]], kwargs: T.Dict[str, T.Any]) -> RangeHolder: + def func_range(self, node, args: T.Tuple[int, T.Optional[int], T.Optional[int]], kwargs: T.Dict[str, T.Any]) -> P_OBJ.RangeHolder: start, stop, step = args # Just like Python's range, we allow range(stop), range(start, stop), or # range(start, stop, step) @@ -2777,4 +2777,4 @@ This will become a hard error in the future.''', location=self.current_node) raise InterpreterException('stop cannot be less than start') if step < 1: raise InterpreterException('step must be >=1') - return RangeHolder(start, stop, step, subproject=self.subproject) + return P_OBJ.RangeHolder(start, stop, step, subproject=self.subproject) diff --git a/mesonbuild/interpreter/primitives/__init__.py b/mesonbuild/interpreter/primitives/__init__.py index d876f56..b4fe621 100644 --- a/mesonbuild/interpreter/primitives/__init__.py +++ b/mesonbuild/interpreter/primitives/__init__.py @@ -6,6 +6,7 @@ __all__ = [ 'BooleanHolder', 'DictHolder', 'IntegerHolder', + 'RangeHolder', 'StringHolder', 'MesonVersionString', 'MesonVersionStringHolder', @@ -15,4 +16,5 @@ from .array import ArrayHolder from .boolean import BooleanHolder from .dict import DictHolder from .integer import IntegerHolder +from .range import RangeHolder from .string import StringHolder, MesonVersionString, MesonVersionStringHolder diff --git a/mesonbuild/interpreter/primitives/range.py b/mesonbuild/interpreter/primitives/range.py new file mode 100644 index 0000000..9054278 --- /dev/null +++ b/mesonbuild/interpreter/primitives/range.py @@ -0,0 +1,34 @@ +# Copyright 2021 The Meson development team +# SPDX-license-identifier: Apache-2.0 + +import typing as T + +from ...interpreterbase import ( + MesonInterpreterObject, + IterableObject, + MesonOperator, + InvalidArguments, +) + +class RangeHolder(MesonInterpreterObject, IterableObject): + def __init__(self, start: int, stop: int, step: int, *, subproject: str) -> None: + super().__init__(subproject=subproject) + self.range = range(start, stop, step) + self.operators.update({ + MesonOperator.INDEX: self.op_index, + }) + + def op_index(self, other: int) -> int: + try: + return self.range[other] + except: + raise InvalidArguments(f'Index {other} out of bounds of range.') + + def iter_tuple_size(self) -> None: + return None + + def iter_self(self) -> T.Iterator[int]: + return iter(self.range) + + def size(self) -> int: + return len(self.range) |