summaryrefslogtreecommitdiff
path: root/mesonbuild/ast
diff options
context:
space:
mode:
authorVolker Weißmann <volker.weissmann@gmx.de>2025-03-09 16:54:52 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-05-29 09:20:27 -0700
commit81558a0e39e969d9059e004088cc0e32b93e5f05 (patch)
tree6bfd0c04bf5919ece13e2bb1a128a532f14a3858 /mesonbuild/ast
parentbb40ef69cce327094ba67fe00739b4a845e2cd5c (diff)
downloadmeson-81558a0e39e969d9059e004088cc0e32b93e5f05.tar.gz
rewriter: Add IntrospectionBuildTarget
To improve type-safety and readability we replace a dictionary with a new class `IntrospectionBuildTarget`.
Diffstat (limited to 'mesonbuild/ast')
-rw-r--r--mesonbuild/ast/interpreter.py19
-rw-r--r--mesonbuild/ast/introspection.py53
2 files changed, 45 insertions, 27 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py
index 271ad7d6d..b462c7e87 100644
--- a/mesonbuild/ast/interpreter.py
+++ b/mesonbuild/ast/interpreter.py
@@ -8,11 +8,13 @@ from __future__ import annotations
import os
import sys
import typing as T
+from dataclasses import dataclass
from .. import mparser, mesonlib
from .. import environment
from ..interpreterbase import (
+ MesonInterpreterObject,
InterpreterBase,
InvalidArguments,
BreakRequest,
@@ -57,11 +59,28 @@ if T.TYPE_CHECKING:
OrNode,
TestCaseClauseNode,
UMinusNode,
+ FunctionNode,
)
_T = T.TypeVar('_T')
_V = T.TypeVar('_V')
+# `IntrospectionBuildTarget` is to the `IntrospectionInterpreter` what `BuildTarget` is to the normal `Interpreter`.
+@dataclass
+class IntrospectionBuildTarget(MesonInterpreterObject):
+ name: str
+ machine: str
+ id: str
+ typename: str
+ defined_in: str
+ subdir: str
+ build_by_default: bool
+ installed: bool
+ outputs: T.List[str]
+ source_nodes: T.List[BaseNode]
+ extra_files: T.List[BaseNode]
+ kwargs: T.Dict[str, TYPE_var]
+ node: FunctionNode
class AstInterpreter(InterpreterBase):
def __init__(self, source_root: str, subdir: str, subproject: SubProject, subproject_dir: str, env: environment.Environment, visitors: T.Optional[T.List[AstVisitor]] = None):
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py
index 2f1572f38..316b26175 100644
--- a/mesonbuild/ast/introspection.py
+++ b/mesonbuild/ast/introspection.py
@@ -16,7 +16,7 @@ from ..interpreterbase import InvalidArguments, SubProject
from ..mesonlib import MachineChoice
from ..options import OptionKey
from ..mparser import BaseNode, ArithmeticNode, ArrayNode, ElementaryNode, IdNode, FunctionNode, StringNode
-from .interpreter import AstInterpreter
+from .interpreter import AstInterpreter, IntrospectionBuildTarget
if T.TYPE_CHECKING:
from ..build import BuildTarget
@@ -65,7 +65,7 @@ class IntrospectionInterpreter(AstInterpreter):
self.backend = backend
self.default_options = {OptionKey('backend'): self.backend}
self.project_data: T.Dict[str, T.Any] = {}
- self.targets: T.List[T.Dict[str, T.Any]] = []
+ self.targets: T.List[IntrospectionBuildTarget] = []
self.dependencies: T.List[T.Dict[str, T.Any]] = []
self.project_node: BaseNode = None
@@ -234,7 +234,7 @@ class IntrospectionInterpreter(AstInterpreter):
'node': node
}]
- def build_target(self, node: BaseNode, args: T.List[TYPE_var], kwargs_raw: T.Dict[str, TYPE_var], targetclass: T.Type[BuildTarget]) -> T.Optional[T.Dict[str, T.Any]]:
+ def build_target(self, node: BaseNode, args: T.List[TYPE_var], kwargs_raw: T.Dict[str, TYPE_var], targetclass: T.Type[BuildTarget]) -> IntrospectionBuildTarget:
args = self.flatten_args(args)
if not args or not isinstance(args[0], str):
return None
@@ -299,26 +299,25 @@ class IntrospectionInterpreter(AstInterpreter):
self.environment, self.coredata.compilers[for_machine], kwargs_reduced)
target.process_compilers_late()
- new_target = {
- 'name': target.get_basename(),
- 'machine': target.for_machine.get_lower_case_name(),
- 'id': target.get_id(),
- 'type': target.get_typename(),
- 'defined_in': os.path.normpath(os.path.join(self.source_root, self.subdir, environment.build_filename)),
- 'subdir': self.subdir,
- 'build_by_default': target.build_by_default,
- 'installed': target.should_install(),
- 'outputs': target.get_outputs(),
- 'sources': source_nodes,
- 'extra_files': extraf_nodes,
- 'kwargs': kwargs,
- 'node': node,
- }
+ new_target = IntrospectionBuildTarget(
+ name=target.get_basename(),
+ machine=target.for_machine.get_lower_case_name(),
+ id=target.get_id(),
+ typename=target.get_typename(),
+ defined_in=os.path.normpath(os.path.join(self.source_root, self.subdir, environment.build_filename)),
+ subdir=self.subdir,
+ build_by_default=target.build_by_default,
+ installed=target.should_install(),
+ outputs=target.get_outputs(),
+ source_nodes=source_nodes,
+ extra_files=extraf_nodes,
+ kwargs=kwargs,
+ node=node)
self.targets += [new_target]
return new_target
- def build_library(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def build_library(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
default_library = self.coredata.optstore.get_value_for(OptionKey('default_library'))
if default_library == 'shared':
return self.build_target(node, args, kwargs, SharedLibrary)
@@ -328,28 +327,28 @@ class IntrospectionInterpreter(AstInterpreter):
return self.build_target(node, args, kwargs, SharedLibrary)
return None
- def func_executable(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_executable(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, Executable)
- def func_static_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_static_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, StaticLibrary)
- def func_shared_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_shared_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, SharedLibrary)
- def func_both_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_both_lib(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, SharedLibrary)
- def func_shared_module(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_shared_module(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, SharedModule)
- def func_library(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_library(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_library(node, args, kwargs)
- def func_jar(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_jar(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
return self.build_target(node, args, kwargs, Jar)
- def func_build_target(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> T.Optional[T.Dict[str, T.Any]]:
+ def func_build_target(self, node: BaseNode, args: T.List[TYPE_var], kwargs: T.Dict[str, TYPE_var]) -> IntrospectionBuildTarget:
if 'target_type' not in kwargs:
return None
target_type = kwargs.pop('target_type')