From bd39b95ae78c20f02b5c58d0ef4448d41d6cc335 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Fri, 24 Oct 2025 09:01:13 -0700 Subject: dependencies: Add a wrapper class for Dependency candidates The goal is to have a single type for candidates that replaces having a mixture of class initializers, partials, and factories with a single wrapper class. --- mesonbuild/dependencies/base.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 5e0d871ef..47d836c2f 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -7,6 +7,7 @@ from __future__ import annotations import copy +import dataclasses import os import collections import itertools @@ -73,6 +74,8 @@ else: _MissingCompilerBase = object +DepType = T.TypeVar('DepType', bound='ExternalDependency', covariant=True) + class DependencyException(MesonException): '''Exceptions raised while trying to find dependencies''' @@ -683,3 +686,28 @@ class BuiltinDependency(ExternalDependency): @staticmethod def log_tried() -> str: return 'builtin' + + +@dataclasses.dataclass +class DependencyCandidate(T.Generic[DepType]): + + callable: T.Union[T.Type[DepType], T.Callable[[str, Environment, DependencyObjectKWs], DepType]] + name: str + method: str + modules: T.Optional[T.List[str]] = None + arguments: T.Optional[T.Tuple[Environment, DependencyObjectKWs]] = dataclasses.field(default=None) + + def __call__(self) -> DepType: + if self.arguments is None: + raise mesonlib.MesonBugException('Attempted to instantiate a candidate before setting its arguments') + env, kwargs = self.arguments + if self.modules is not None: + kwargs['modules'] = self.modules.copy() + return self.callable(self.name, env, kwargs) + + @classmethod + def from_dependency(cls, name: str, dep: T.Type[DepType], + args: T.Optional[T.Tuple[Environment, DependencyObjectKWs]] = None, + modules: T.Optional[T.List[str]] = None, + ) -> DependencyCandidate[DepType]: + return cls(dep, name, dep.log_tried(), modules, arguments=args) -- cgit v1.2.3