aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2023-08-02 21:51:50 -0400
committerEli Schwartz <eschwartz@archlinux.org>2023-08-10 13:56:39 -0400
commit277151450a8eaf48f7038b21fdbf39b85f339e8b (patch)
tree9ff197e0af042318c3080090ba834a1c7cface85
parent13b626b67be41635886d0a95e492cd13dfee0b1a (diff)
downloadmeson-277151450a8eaf48f7038b21fdbf39b85f339e8b.zip
meson-277151450a8eaf48f7038b21fdbf39b85f339e8b.tar.gz
meson-277151450a8eaf48f7038b21fdbf39b85f339e8b.tar.bz2
allow some ObjectHolder subclasses to continue to be generic
ExternalProgram and CustomTarget have some use cases for producing subclassed interpreter holders with more specific types and methods. In order for those subclasses to properly refer to their held_object, we need a shared base class that is still generic, though bound. For the derived held objects, inherit from the base class and specify the final types as the module-specific type.
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py18
-rw-r--r--mesonbuild/modules/hotdoc.py6
-rw-r--r--mesonbuild/modules/python.py8
3 files changed, 21 insertions, 11 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index 8648b48..f1f8ea8 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -559,8 +559,10 @@ class DependencyHolder(ObjectHolder[Dependency]):
new_dep = self.held_object.generate_link_whole_dependency()
return new_dep
-class ExternalProgramHolder(ObjectHolder[ExternalProgram]):
- def __init__(self, ep: ExternalProgram, interpreter: 'Interpreter') -> None:
+_EXTPROG = T.TypeVar('_EXTPROG', bound=ExternalProgram)
+
+class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
+ def __init__(self, ep: _EXTPROG, interpreter: 'Interpreter') -> None:
super().__init__(ep, interpreter)
self.methods.update({'found': self.found_method,
'path': self.path_method,
@@ -606,6 +608,9 @@ class ExternalProgramHolder(ObjectHolder[ExternalProgram]):
def found(self) -> bool:
return self.held_object.found()
+class ExternalProgramHolder(_ExternalProgramHolder[ExternalProgram]):
+ pass
+
class ExternalLibraryHolder(ObjectHolder[ExternalLibrary]):
def __init__(self, el: ExternalLibrary, interpreter: 'Interpreter'):
super().__init__(el, interpreter)
@@ -969,8 +974,10 @@ class CustomTargetIndexHolder(ObjectHolder[build.CustomTargetIndex]):
assert self.interpreter.backend is not None
return self.interpreter.backend.get_target_filename_abs(self.held_object)
-class CustomTargetHolder(ObjectHolder[build.CustomTarget]):
- def __init__(self, target: 'build.CustomTarget', interp: 'Interpreter'):
+_CT = T.TypeVar('_CT', bound=build.CustomTarget)
+
+class _CustomTargetHolder(ObjectHolder[_CT]):
+ def __init__(self, target: _CT, interp: 'Interpreter'):
super().__init__(target, interp)
self.methods.update({'full_path': self.full_path_method,
'to_list': self.to_list_method,
@@ -1007,6 +1014,9 @@ class CustomTargetHolder(ObjectHolder[build.CustomTarget]):
except IndexError:
raise InvalidArguments(f'Index {other} out of bounds of custom target {self.held_object.name} output of size {len(self.held_object)}.')
+class CustomTargetHolder(_CustomTargetHolder[build.CustomTarget]):
+ pass
+
class RunTargetHolder(ObjectHolder[build.RunTarget]):
pass
diff --git a/mesonbuild/modules/hotdoc.py b/mesonbuild/modules/hotdoc.py
index cf1a247..f5916eb 100644
--- a/mesonbuild/modules/hotdoc.py
+++ b/mesonbuild/modules/hotdoc.py
@@ -28,7 +28,7 @@ from ..interpreterbase import (
InvalidArguments, noPosargs, noKwargs, typed_kwargs, FeatureDeprecated,
ContainerTypeInfo, KwargInfo, typed_pos_args
)
-from ..interpreter import CustomTargetHolder
+from ..interpreter.interpreterobjects import _CustomTargetHolder
from ..interpreter.type_checking import NoneType
from ..programs import ExternalProgram
@@ -364,8 +364,8 @@ class HotdocTargetBuilder:
return (target, install_script)
-class HotdocTargetHolder(CustomTargetHolder):
- def __init__(self, target, interp):
+class HotdocTargetHolder(_CustomTargetHolder['HotdocTarget']):
+ def __init__(self, target: HotdocTarget, interp):
super().__init__(target, interp)
self.methods.update({'config_path': self.config_path_method})
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index 879c548..470f7b3 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -24,8 +24,8 @@ from ..build import known_shmod_kwargs, CustomTarget, CustomTargetIndex, BuildTa
from ..dependencies import NotFoundDependency
from ..dependencies.detect import get_dep_identifier, find_external_dependency
from ..dependencies.python import BasicPythonExternalProgram, python_factory, _PythonDependencyBase
-from ..interpreter import ExternalProgramHolder, extract_required_kwarg, permitted_dependency_kwargs
-from ..interpreter import primitives as P_OBJ
+from ..interpreter import extract_required_kwarg, permitted_dependency_kwargs, primitives as P_OBJ
+from ..interpreter.interpreterobjects import _ExternalProgramHolder
from ..interpreter.type_checking import NoneType, PRESERVE_PATH_KW, SHARED_MOD_KWS
from ..interpreterbase import (
noPosargs, noKwargs, permittedKwargs, ContainerTypeInfo,
@@ -114,9 +114,9 @@ _PURE_KW = KwargInfo('pure', (bool, NoneType))
_SUBDIR_KW = KwargInfo('subdir', str, default='')
_DEFAULTABLE_SUBDIR_KW = KwargInfo('subdir', (str, NoneType))
-class PythonInstallation(ExternalProgramHolder):
+class PythonInstallation(_ExternalProgramHolder['PythonExternalProgram']):
def __init__(self, python: 'PythonExternalProgram', interpreter: 'Interpreter'):
- ExternalProgramHolder.__init__(self, python, interpreter)
+ _ExternalProgramHolder.__init__(self, python, interpreter)
info = python.info
prefix = self.interpreter.environment.coredata.get_option(mesonlib.OptionKey('prefix'))
assert isinstance(prefix, str), 'for mypy'