| # 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] |