aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2021-06-11 16:58:13 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2021-06-18 23:48:33 +0200
commit63ade7d9378cae8ec2a811581684bf459407a7f0 (patch)
tree8cbc21520642db608b529f04d01fe25f89149ad3
parent202e345dfba7ff3a39e4fb560b98889182dcc506 (diff)
downloadmeson-63ade7d9378cae8ec2a811581684bf459407a7f0.zip
meson-63ade7d9378cae8ec2a811581684bf459407a7f0.tar.gz
meson-63ade7d9378cae8ec2a811581684bf459407a7f0.tar.bz2
interpreter: Add a new MesonInterpreterObject for non-elementary objects
-rw-r--r--mesonbuild/ast/interpreter.py30
-rw-r--r--mesonbuild/interpreter/interpreter.py4
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py10
-rw-r--r--mesonbuild/interpreter/mesonmain.py11
-rw-r--r--mesonbuild/interpreterbase/__init__.py2
-rw-r--r--mesonbuild/interpreterbase/baseobjects.py7
-rw-r--r--mesonbuild/interpreterbase/disabler.py4
7 files changed, 43 insertions, 25 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py
index 71c7f47..26447ce 100644
--- a/mesonbuild/ast/interpreter.py
+++ b/mesonbuild/ast/interpreter.py
@@ -16,10 +16,20 @@
# or an interpreter-based tool.
from .visitor import AstVisitor
-from .. import interpreterbase, mparser, mesonlib
+from .. import mparser, mesonlib
from .. import environment
-from ..interpreterbase import InvalidArguments, BreakRequest, ContinueRequest, TYPE_nvar, TYPE_nkwargs
+from ..interpreterbase import (
+ MesonInterpreterObject,
+ InterpreterBase,
+ InvalidArguments,
+ BreakRequest,
+ ContinueRequest,
+ default_resolve_key,
+ TYPE_nvar,
+ TYPE_nkwargs,
+)
+
from ..mparser import (
AndNode,
ArgumentNode,
@@ -45,28 +55,28 @@ from ..mparser import (
import os, sys
import typing as T
-class DontCareObject(interpreterbase.InterpreterObject):
+class DontCareObject(MesonInterpreterObject):
pass
-class MockExecutable(interpreterbase.InterpreterObject):
+class MockExecutable(MesonInterpreterObject):
pass
-class MockStaticLibrary(interpreterbase.InterpreterObject):
+class MockStaticLibrary(MesonInterpreterObject):
pass
-class MockSharedLibrary(interpreterbase.InterpreterObject):
+class MockSharedLibrary(MesonInterpreterObject):
pass
-class MockCustomTarget(interpreterbase.InterpreterObject):
+class MockCustomTarget(MesonInterpreterObject):
pass
-class MockRunTarget(interpreterbase.InterpreterObject):
+class MockRunTarget(MesonInterpreterObject):
pass
ADD_SOURCE = 0
REMOVE_SOURCE = 1
-class AstInterpreter(interpreterbase.InterpreterBase):
+class AstInterpreter(InterpreterBase):
def __init__(self, source_root: str, subdir: str, subproject: str, visitors: T.Optional[T.List[AstVisitor]] = None):
super().__init__(source_root, subdir, subproject)
self.visitors = visitors if visitors is not None else []
@@ -224,7 +234,7 @@ class AstInterpreter(interpreterbase.InterpreterBase):
def reduce_arguments(
self,
args: mparser.ArgumentNode,
- key_resolver: T.Callable[[mparser.BaseNode], str] = interpreterbase.default_resolve_key,
+ key_resolver: T.Callable[[mparser.BaseNode], str] = default_resolve_key,
duplicate_key_error: T.Optional[str] = None,
) -> T.Tuple[T.List[TYPE_nvar], TYPE_nkwargs]:
if isinstance(args, ArgumentNode):
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 93cabec..726a240 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -394,7 +394,7 @@ class Interpreter(InterpreterBase):
if isinstance(item, build.CustomTarget):
return CustomTargetHolder(item, self)
- elif isinstance(item, (int, str, bool, Disabler, InterpreterObject, mesonlib.File)) or item is None:
+ elif isinstance(item, (int, str, bool, InterpreterObject, mesonlib.File)) or item is None:
return item
elif isinstance(item, build.Executable):
return ExecutableHolder(item, self)
@@ -414,7 +414,7 @@ class Interpreter(InterpreterBase):
return MutableModuleObjectHolder(item, self)
elif isinstance(item, ModuleObject):
return ModuleObjectHolder(item, self)
- elif isinstance(item, (InterpreterObject, ObjectHolder)):
+ elif isinstance(item, InterpreterObject):
return item
else:
raise InterpreterException('Module returned a value of unknown type.')
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index 176ebd9..4ae107d 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -13,8 +13,8 @@ from .. import mlog
from ..modules import ModuleReturnValue, ModuleObject, ModuleState, ExtensionModule
from ..backend.backends import TestProtocol
-from ..interpreterbase import (ContainerTypeInfo, InterpreterObject, KwargInfo,
- ObjectHolder, MutableInterpreterObject,
+from ..interpreterbase import (ContainerTypeInfo, KwargInfo,
+ MesonInterpreterObject, ObjectHolder, MutableInterpreterObject,
FeatureNewKwargs, FeatureNew, FeatureDeprecated,
typed_kwargs, typed_pos_args, stringArgs,
permittedKwargs, noArgsFlattening, noPosargs,
@@ -145,7 +145,7 @@ class FeatureOptionHolder(ObjectHolder[coredata.UserFeatureOption]):
return self if self.value != 'auto' or not args[0] else self.as_disabled()
-class RunProcess(InterpreterObject):
+class RunProcess(MesonInterpreterObject):
def __init__(self, cmd, args, env, source_dir, build_dir, subdir, mesonintrospect, in_builddir=False, check=False, capture=True):
super().__init__()
@@ -718,13 +718,13 @@ class GeneratedObjectsHolder(ObjectHolder[build.ExtractedObjects]):
def __init__(self, held_object: build.ExtractedObjects):
super().__init__(held_object)
-class Test(InterpreterObject):
+class Test(MesonInterpreterObject):
def __init__(self, name: str, project: str, suite: T.List[str], exe: build.Executable,
depends: T.List[T.Union[build.CustomTarget, build.BuildTarget]],
is_parallel: bool, cmd_args: T.List[str], env: build.EnvironmentVariables,
should_fail: bool, timeout: int, workdir: T.Optional[str], protocol: str,
priority: int):
- InterpreterObject.__init__(self)
+ super().__init__()
self.name = name
self.suite = suite
self.project_name = project
diff --git a/mesonbuild/interpreter/mesonmain.py b/mesonbuild/interpreter/mesonmain.py
index e76ad2e..1a4fbea 100644
--- a/mesonbuild/interpreter/mesonmain.py
+++ b/mesonbuild/interpreter/mesonmain.py
@@ -7,7 +7,7 @@ from .. import mlog
from ..mesonlib import unholder, MachineChoice, OptionKey
from ..programs import OverrideProgram, ExternalProgram
-from ..interpreterbase import (InterpreterObject, FeatureNewKwargs, FeatureNew, FeatureDeprecated,
+from ..interpreterbase import (MesonInterpreterObject, FeatureNewKwargs, FeatureNew, FeatureDeprecated,
typed_pos_args, permittedKwargs, noArgsFlattening, noPosargs, noKwargs,
MesonVersionString, InterpreterException)
@@ -18,9 +18,12 @@ from .interpreterobjects import (ExecutableHolder, ExternalProgramHolder,
import typing as T
-class MesonMain(InterpreterObject):
+if T.TYPE_CHECKING:
+ from .interpreter import Interpreter
+
+class MesonMain(MesonInterpreterObject):
def __init__(self, build: 'build.Build', interpreter: 'Interpreter'):
- InterpreterObject.__init__(self)
+ super().__init__()
self.build = build
self.interpreter = interpreter
self.methods.update({'get_compiler': self.get_compiler_method,
@@ -55,7 +58,7 @@ class MesonMain(InterpreterObject):
})
def _find_source_script(self, prog: T.Union[str, mesonlib.File, ExecutableHolder], args):
-
+
if isinstance(prog, (ExecutableHolder, ExternalProgramHolder)):
return self.interpreter.backend.get_executable_serialisation([unholder(prog)] + args)
found = self.interpreter.func_find_program({}, prog, {}).held_object
diff --git a/mesonbuild/interpreterbase/__init__.py b/mesonbuild/interpreterbase/__init__.py
index d5ef367..1d5c75f 100644
--- a/mesonbuild/interpreterbase/__init__.py
+++ b/mesonbuild/interpreterbase/__init__.py
@@ -14,6 +14,7 @@
__all__ = [
'InterpreterObject',
+ 'MesonInterpreterObject',
'ObjectHolder',
'RangeHolder',
'MesonVersionString',
@@ -64,6 +65,7 @@ __all__ = [
from .baseobjects import (
InterpreterObject,
+ MesonInterpreterObject,
ObjectHolder,
RangeHolder,
MutableInterpreterObject,
diff --git a/mesonbuild/interpreterbase/baseobjects.py b/mesonbuild/interpreterbase/baseobjects.py
index 3e3963f..511a146 100644
--- a/mesonbuild/interpreterbase/baseobjects.py
+++ b/mesonbuild/interpreterbase/baseobjects.py
@@ -51,12 +51,15 @@ class InterpreterObject:
return method(args, kwargs)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
+class MesonInterpreterObject(InterpreterObject):
+ ''' All non-elementary objects should be derived from this '''
+
class MutableInterpreterObject:
''' Dummy class to mark the object type as mutable '''
TV_InterpreterObject = T.TypeVar('TV_InterpreterObject')
-class ObjectHolder(InterpreterObject, T.Generic[TV_InterpreterObject]):
+class ObjectHolder(MesonInterpreterObject, T.Generic[TV_InterpreterObject]):
def __init__(self, obj: TV_InterpreterObject, *, subproject: T.Optional[str] = None) -> None:
super().__init__(subproject=subproject)
self.held_object = obj
@@ -64,7 +67,7 @@ class ObjectHolder(InterpreterObject, T.Generic[TV_InterpreterObject]):
def __repr__(self) -> str:
return f'<Holder: {self.held_object!r}>'
-class RangeHolder(InterpreterObject):
+class RangeHolder(MesonInterpreterObject):
def __init__(self, start: int, stop: int, step: int, *, subproject: T.Optional[str] = None) -> None:
super().__init__(subproject=subproject)
self.range = range(start, stop, step)
diff --git a/mesonbuild/interpreterbase/disabler.py b/mesonbuild/interpreterbase/disabler.py
index 50bc5bb..81f5264 100644
--- a/mesonbuild/interpreterbase/disabler.py
+++ b/mesonbuild/interpreterbase/disabler.py
@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from .baseobjects import InterpreterObject
+from .baseobjects import MesonInterpreterObject
import typing as T
-class Disabler(InterpreterObject):
+class Disabler(MesonInterpreterObject):
def __init__(self) -> None:
super().__init__()
self.methods.update({'found': self.found_method})