aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/unstable_rust.py53
1 files changed, 36 insertions, 17 deletions
diff --git a/mesonbuild/modules/unstable_rust.py b/mesonbuild/modules/unstable_rust.py
index 8d07128..d5678ea 100644
--- a/mesonbuild/modules/unstable_rust.py
+++ b/mesonbuild/modules/unstable_rust.py
@@ -18,16 +18,28 @@ import typing as T
from . import ExtensionModule, ModuleReturnValue
from .. import mlog
from ..build import BuildTarget, CustomTargetIndex, Executable, GeneratedList, InvalidArguments, IncludeDirs, CustomTarget
-from ..dependencies import Dependency, ExternalLibrary
-from ..interpreter import ExecutableHolder, BuildTargetHolder, CustomTargetHolder, permitted_test_kwargs
-from ..interpreterbase import InterpreterException, permittedKwargs, FeatureNew, typed_pos_args, noPosargs
+from ..interpreter.interpreter import TEST_KWARGS
+from ..interpreter.interpreterobjects import (
+ BuildTargetHolder,
+ CustomTargetHolder,
+ DependencyHolder,
+ ExecutableHolder,
+ ExternalLibraryHolder,
+)
+from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, permittedKwargs, FeatureNew, typed_kwargs, typed_pos_args, noPosargs
from ..mesonlib import stringlistify, unholder, listify, typeslistify, File
if T.TYPE_CHECKING:
from . import ModuleState
from ..interpreter import Interpreter
- from ..programs import ExternalProgram
+ from ..interpreter import kwargs as _kwargs
from ..interpreter.interpreter import SourceOutputs
+ from ..programs import ExternalProgram
+
+ class FuncTest(_kwargs.BaseTest):
+
+ dependencies: T.List[T.Union[DependencyHolder, ExternalLibraryHolder]]
+ is_parallel: bool
class RustModule(ExtensionModule):
@@ -43,9 +55,18 @@ class RustModule(ExtensionModule):
'bindgen': self.bindgen,
})
- @permittedKwargs(permitted_test_kwargs | {'dependencies'} ^ {'protocol'})
@typed_pos_args('rust.test', str, BuildTargetHolder)
- def test(self, state: 'ModuleState', args: T.Tuple[str, BuildTargetHolder], kwargs: T.Dict[str, T.Any]) -> ModuleReturnValue:
+ @typed_kwargs(
+ 'rust.test',
+ *TEST_KWARGS,
+ KwargInfo('is_parallel', bool, default=False),
+ KwargInfo(
+ 'dependencies',
+ ContainerTypeInfo(list, (DependencyHolder, ExternalLibraryHolder)),
+ listify=True,
+ default=[]),
+ )
+ def test(self, state: 'ModuleState', args: T.Tuple[str, BuildTargetHolder], kwargs: 'FuncTest') -> ModuleReturnValue:
"""Generate a rust test target from a given rust target.
Rust puts it's unitests inside it's main source files, unlike most
@@ -91,7 +112,7 @@ class RustModule(ExtensionModule):
base_target: BuildTarget = unholder(args[1])
if not base_target.uses_rust():
raise InterpreterException('Second positional argument to rustmod.test() must be a rust based target')
- extra_args = stringlistify(kwargs.get('args', []))
+ extra_args = kwargs['args']
# Delete any arguments we don't want passed
if '--test' in extra_args:
@@ -104,17 +125,17 @@ class RustModule(ExtensionModule):
del extra_args[i + 1]
del extra_args[i]
for i, a in enumerate(extra_args):
- if a.startswith('--format='):
+ if isinstance(a, str) and a.startswith('--format='):
del extra_args[i]
break
- dependencies = unholder(listify(kwargs.get('dependencies', [])))
- for d in dependencies:
- if not isinstance(d, (Dependency, ExternalLibrary)):
- raise InvalidArguments('dependencies must be a dependency or external library')
+ dependencies = [d.held_object for d in kwargs['dependencies']]
+
+ # We need to cast here, as currently these don't have protocol in them, but test itself does.
+ tkwargs = T.cast('_kwargs.FuncTest', kwargs.copy())
- kwargs['args'] = extra_args + ['--test', '--format', 'pretty']
- kwargs['protocol'] = 'rust'
+ tkwargs['args'] = extra_args + ['--test', '--format', 'pretty']
+ tkwargs['protocol'] = 'rust'
new_target_kwargs = base_target.kwargs.copy()
# Don't mutate the shallow copied list, instead replace it with a new
@@ -130,11 +151,9 @@ class RustModule(ExtensionModule):
new_target_kwargs
)
- assert isinstance(self.interpreter.current_node, mparser.FunctionNode), 'for mypy'
-
e = ExecutableHolder(new_target, self.interpreter)
test = self.interpreter.make_test(
- self.interpreter.current_node, (name, e), kwargs)
+ self.interpreter.current_node, (name, e), tkwargs)
return ModuleReturnValue(None, [e, test])