Path: blob/main/Tools/c-analyzer/c_analyzer/__init__.py
12 views
from c_parser import (1parse_files as _parse_files,2)3from c_parser.info import (4KIND,5TypeDeclaration,6resolve_parsed,7)8from c_parser.match import (9filter_by_kind,10group_by_kinds,11)12from . import (13analyze as _analyze,14datafiles as _datafiles,15)16from .info import Analysis171819def analyze(filenmes, **kwargs):20results = iter_analyis_results(filenames, **kwargs)21return Analysis.from_results(results)222324def iter_analysis_results(filenmes, *,25known=None,26**kwargs27):28decls = iter_decls(filenames, **kwargs)29yield from analyze_decls(decls, known)303132def iter_decls(filenames, *,33kinds=None,34parse_files=_parse_files,35**kwargs36):37kinds = KIND.DECLS if kinds is None else (KIND.DECLS & set(kinds))38parse_files = parse_files or _parse_files3940parsed = parse_files(filenames, **kwargs)41parsed = filter_by_kind(parsed, kinds)42for item in parsed:43yield resolve_parsed(item)444546def analyze_decls(decls, known, *,47analyze_resolved=None,48handle_unresolved=True,49relroot=None,50):51knowntypes, knowntypespecs = _datafiles.get_known(52known,53handle_unresolved=handle_unresolved,54analyze_resolved=analyze_resolved,55relroot=relroot,56)5758decls = list(decls)59collated = group_by_kinds(decls)6061types = {decl: None for decl in collated['type']}62typespecs = _analyze.get_typespecs(types)6364def analyze_decl(decl):65return _analyze.analyze_decl(66decl,67typespecs,68knowntypespecs,69types,70knowntypes,71analyze_resolved=analyze_resolved,72)73_analyze.analyze_type_decls(types, analyze_decl, handle_unresolved)74for decl in decls:75if decl in types:76resolved = types[decl]77else:78resolved = analyze_decl(decl)79if resolved and handle_unresolved:80typedeps, _ = resolved81if not isinstance(typedeps, TypeDeclaration):82if not typedeps or None in typedeps:83raise NotImplementedError((decl, resolved))8485yield decl, resolved868788#######################################89# checks9091def check_all(analysis, checks, *, failfast=False):92for check in checks or ():93for data, failure in check(analysis):94if failure is None:95continue9697yield data, failure98if failfast:99yield None, None100break101else:102continue103# We failed fast.104break105106107