# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from abc import ABCMeta, abstractmethod import typing as T from .model import ReferenceManual, Function, Method, Object, ObjectType, NamedObject _N = T.TypeVar('_N', bound=NamedObject) class GeneratorBase(metaclass=ABCMeta): def __init__(self, manual: ReferenceManual) -> None: self.manual = manual @abstractmethod def generate(self) -> None: pass @staticmethod def brief(raw: _N) -> str: desc_lines = raw.description.split('\n') brief = desc_lines[0] if '.' in brief and '[[' not in brief: brief = brief[:brief.index('.')] return brief.strip() @staticmethod def sorted_and_filtered(raw: T.List[_N]) -> T.List[_N]: def key_fn(fn: NamedObject) -> str: if isinstance(fn, Method): return f'1_{fn.obj.name}.{fn.name}' return f'0_{fn.name}' return sorted([x for x in raw if not x.hidden], key=key_fn) @staticmethod def _extract_meson_version() -> str: from mesonbuild.coredata import version return version @property def functions(self) -> T.List[Function]: return GeneratorBase.sorted_and_filtered(self.manual.functions) @property def objects(self) -> T.List[Object]: return GeneratorBase.sorted_and_filtered(self.manual.objects) @property def elementary(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.ELEMENTARY] @property def builtins(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.BUILTIN] @property def returned(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.RETURNED and x.defined_by_module is None] @property def modules(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.MODULE] def extract_returned_by_module(self, module: Object) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.RETURNED and x.defined_by_module is module]