1from c_common.fsutil import match_glob as _match_glob
2from .parser import parse as _parse
3from .preprocessor import get_preprocessor as _get_preprocessor
4
5
6def parse_file(filename, *,
7               match_kind=None,
8               get_file_preprocessor=None,
9               file_maxsizes=None,
10               ):
11    if get_file_preprocessor is None:
12        get_file_preprocessor = _get_preprocessor()
13    yield from _parse_file(
14            filename, match_kind, get_file_preprocessor, file_maxsizes)
15
16
17def parse_files(filenames, *,
18                match_kind=None,
19                get_file_preprocessor=None,
20                file_maxsizes=None,
21                ):
22    if get_file_preprocessor is None:
23        get_file_preprocessor = _get_preprocessor()
24    for filename in filenames:
25        yield from _parse_file(
26                filename, match_kind, get_file_preprocessor, file_maxsizes)
27
28
29def _parse_file(filename, match_kind, get_file_preprocessor, maxsizes):
30    srckwargs = {}
31    maxsize = _resolve_max_size(filename, maxsizes)
32    if maxsize:
33        srckwargs['maxtext'], srckwargs['maxlines'] = maxsize
34
35    # Preprocess the file.
36    preprocess = get_file_preprocessor(filename)
37    preprocessed = preprocess()
38    if preprocessed is None:
39        return
40
41    # Parse the lines.
42    srclines = ((l.file, l.data) for l in preprocessed if l.kind == 'source')
43    for item in _parse(srclines, **srckwargs):
44        if match_kind is not None and not match_kind(item.kind):
45            continue
46        if not item.filename:
47            raise NotImplementedError(repr(item))
48        yield item
49
50
51def _resolve_max_size(filename, maxsizes):
52    for pattern, maxsize in (maxsizes.items() if maxsizes else ()):
53        if _match_glob(filename, pattern):
54            break
55    else:
56        return None
57    if not maxsize:
58        return None, None
59    maxtext, maxlines = maxsize
60    if maxtext is not None:
61        maxtext = int(maxtext)
62    if maxlines is not None:
63        maxlines = int(maxlines)
64    return maxtext, maxlines
65
66
67def parse_signature(text):
68    raise NotImplementedError
69
70
71# aliases
72from .info import resolve_parsed
73