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