| from c_common.fsutil import match_glob as _match_glob | |
| from .parser import parse as _parse | |
| from .preprocessor import get_preprocessor as _get_preprocessor | |
| def parse_file(filename, *, | |
| match_kind=None, | |
| get_file_preprocessor=None, | |
| file_maxsizes=None, | |
| ): | |
| if get_file_preprocessor is None: | |
| get_file_preprocessor = _get_preprocessor() | |
| yield from _parse_file( | |
| filename, match_kind, get_file_preprocessor, file_maxsizes) | |
| def parse_files(filenames, *, | |
| match_kind=None, | |
| get_file_preprocessor=None, | |
| file_maxsizes=None, | |
| ): | |
| if get_file_preprocessor is None: | |
| get_file_preprocessor = _get_preprocessor() | |
| for filename in filenames: | |
| try: | |
| yield from _parse_file( | |
| filename, match_kind, get_file_preprocessor, file_maxsizes) | |
| except Exception: | |
| print(f'# requested file: <{filename}>') | |
| raise # re-raise | |
| def _parse_file(filename, match_kind, get_file_preprocessor, maxsizes): | |
| srckwargs = {} | |
| maxsize = _resolve_max_size(filename, maxsizes) | |
| if maxsize: | |
| srckwargs['maxtext'], srckwargs['maxlines'] = maxsize | |
| # Preprocess the file. | |
| preprocess = get_file_preprocessor(filename) | |
| preprocessed = preprocess() | |
| if preprocessed is None: | |
| return | |
| # Parse the lines. | |
| srclines = ((l.file, l.data) for l in preprocessed if l.kind == 'source') | |
| for item in _parse(srclines, **srckwargs): | |
| if match_kind is not None and not match_kind(item.kind): | |
| continue | |
| if not item.filename: | |
| raise NotImplementedError(repr(item)) | |
| yield item | |
| def _resolve_max_size(filename, maxsizes): | |
| for pattern, maxsize in (maxsizes.items() if maxsizes else ()): | |
| if _match_glob(filename, pattern): | |
| break | |
| else: | |
| return None | |
| if not maxsize: | |
| return None, None | |
| maxtext, maxlines = maxsize | |
| if maxtext is not None: | |
| maxtext = int(maxtext) | |
| if maxlines is not None: | |
| maxlines = int(maxlines) | |
| return maxtext, maxlines | |
| def parse_signature(text): | |
| raise NotImplementedError | |
| # aliases | |
| from .info import resolve_parsed |