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