The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.7 KiB
88 lines
3.7 KiB
4 years ago
|
# Copyright 2021 The Meson development team
|
||
|
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
from .generatorbase import GeneratorBase
|
||
|
from .model import ReferenceManual, Object, Function, DataTypeInfo, Type, ObjectType
|
||
|
|
||
|
from mesonbuild import mlog
|
||
|
import typing as T
|
||
|
|
||
|
def my_nested() -> T.ContextManager[None]:
|
||
|
prefix = '|' * len(mlog.log_depth)
|
||
|
return mlog.nested(prefix)
|
||
|
|
||
|
class GeneratorPrint(GeneratorBase):
|
||
|
def _types_to_string(self, typ: Type) -> str:
|
||
|
def _data_type_to_str(dt: DataTypeInfo) -> str:
|
||
|
if dt.holds:
|
||
|
return f'{dt.data_type.name}[{self._types_to_string(dt.holds)}]'
|
||
|
return dt.data_type.name
|
||
|
return ' | '.join([_data_type_to_str(x) for x in typ.resolved])
|
||
|
|
||
|
def _generate_function(self, func: Function) -> None:
|
||
|
mlog.log()
|
||
|
mlog.log('Function', mlog.bold(func.name))
|
||
|
with my_nested():
|
||
|
desc = func.description
|
||
|
if '\n' in desc:
|
||
|
desc = desc[:desc.index('\n')]
|
||
|
mlog.log('Description:', mlog.bold(desc))
|
||
|
mlog.log('Return type:', mlog.bold(self._types_to_string(func.returns)))
|
||
|
mlog.log('Pos args: ', mlog.bold(str([x.name for x in func.posargs])))
|
||
|
mlog.log('Opt args: ', mlog.bold(str([x.name for x in func.optargs])))
|
||
|
mlog.log('Varargs: ', mlog.bold(func.varargs.name if func.varargs is not None else 'null'))
|
||
|
mlog.log('Kwargs: ', mlog.bold(str(list(func.kwargs.keys()))))
|
||
|
|
||
|
def _generate_object(self, obj: Object) -> None:
|
||
|
tags = []
|
||
|
tags += [{
|
||
|
ObjectType.ELEMENTARY: mlog.yellow('[elementary]'),
|
||
|
ObjectType.BUILTIN: mlog.green('[builtin]'),
|
||
|
ObjectType.MODULE: mlog.blue('[module]'),
|
||
|
ObjectType.RETURNED: mlog.cyan('[returned]'),
|
||
|
}[obj.obj_type]]
|
||
|
if obj.is_container:
|
||
|
tags += [mlog.red('[container]')]
|
||
|
mlog.log()
|
||
|
mlog.log('Object', mlog.bold(obj.name), *tags)
|
||
|
with my_nested():
|
||
|
desc = obj.description
|
||
|
if '\n' in desc:
|
||
|
desc = desc[:desc.index('\n')]
|
||
|
mlog.log('Description:', mlog.bold(desc))
|
||
|
mlog.log('Returned by:', mlog.bold(str([x.name for x in obj.returned_by])))
|
||
|
mlog.log('Methods:')
|
||
|
with my_nested():
|
||
|
for m in obj.methods:
|
||
|
self._generate_function(m)
|
||
|
|
||
|
def generate(self) -> None:
|
||
|
mlog.log('\n\n', mlog.bold('=== Functions ==='), '\n')
|
||
|
for f in self.functions:
|
||
|
self._generate_function(f)
|
||
|
mlog.log('\n\n', mlog.bold('=== Elementary ==='), '\n')
|
||
|
for obj in self.elementary:
|
||
|
self._generate_object(obj)
|
||
|
mlog.log('\n\n', mlog.bold('=== Builtins ==='), '\n')
|
||
|
for obj in self.builtins:
|
||
|
self._generate_object(obj)
|
||
|
mlog.log('\n\n', mlog.bold('=== Returned objects ==='), '\n')
|
||
|
for obj in self.returned:
|
||
|
self._generate_object(obj)
|
||
|
mlog.log('\n\n', mlog.bold('=== Modules ==='), '\n')
|
||
|
for obj in self.modules:
|
||
|
self._generate_object(obj)
|
||
|
for mod_obj in self.extract_returned_by_module(obj):
|
||
|
self._generate_object(mod_obj)
|