17db96d56Sopenharmony_cifrom c_parser import ( 27db96d56Sopenharmony_ci parse_files as _parse_files, 37db96d56Sopenharmony_ci) 47db96d56Sopenharmony_cifrom c_parser.info import ( 57db96d56Sopenharmony_ci KIND, 67db96d56Sopenharmony_ci TypeDeclaration, 77db96d56Sopenharmony_ci resolve_parsed, 87db96d56Sopenharmony_ci) 97db96d56Sopenharmony_cifrom c_parser.match import ( 107db96d56Sopenharmony_ci filter_by_kind, 117db96d56Sopenharmony_ci group_by_kinds, 127db96d56Sopenharmony_ci) 137db96d56Sopenharmony_cifrom . import ( 147db96d56Sopenharmony_ci analyze as _analyze, 157db96d56Sopenharmony_ci datafiles as _datafiles, 167db96d56Sopenharmony_ci) 177db96d56Sopenharmony_cifrom .info import Analysis 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_cidef analyze(filenmes, **kwargs): 217db96d56Sopenharmony_ci results = iter_analyis_results(filenames, **kwargs) 227db96d56Sopenharmony_ci return Analysis.from_results(results) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cidef iter_analysis_results(filenmes, *, 267db96d56Sopenharmony_ci known=None, 277db96d56Sopenharmony_ci **kwargs 287db96d56Sopenharmony_ci ): 297db96d56Sopenharmony_ci decls = iter_decls(filenames, **kwargs) 307db96d56Sopenharmony_ci yield from analyze_decls(decls, known) 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_cidef iter_decls(filenames, *, 347db96d56Sopenharmony_ci kinds=None, 357db96d56Sopenharmony_ci parse_files=_parse_files, 367db96d56Sopenharmony_ci **kwargs 377db96d56Sopenharmony_ci ): 387db96d56Sopenharmony_ci kinds = KIND.DECLS if kinds is None else (KIND.DECLS & set(kinds)) 397db96d56Sopenharmony_ci parse_files = parse_files or _parse_files 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci parsed = parse_files(filenames, **kwargs) 427db96d56Sopenharmony_ci parsed = filter_by_kind(parsed, kinds) 437db96d56Sopenharmony_ci for item in parsed: 447db96d56Sopenharmony_ci yield resolve_parsed(item) 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_cidef analyze_decls(decls, known, *, 487db96d56Sopenharmony_ci analyze_resolved=None, 497db96d56Sopenharmony_ci handle_unresolved=True, 507db96d56Sopenharmony_ci relroot=None, 517db96d56Sopenharmony_ci ): 527db96d56Sopenharmony_ci knowntypes, knowntypespecs = _datafiles.get_known( 537db96d56Sopenharmony_ci known, 547db96d56Sopenharmony_ci handle_unresolved=handle_unresolved, 557db96d56Sopenharmony_ci analyze_resolved=analyze_resolved, 567db96d56Sopenharmony_ci relroot=relroot, 577db96d56Sopenharmony_ci ) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci decls = list(decls) 607db96d56Sopenharmony_ci collated = group_by_kinds(decls) 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci types = {decl: None for decl in collated['type']} 637db96d56Sopenharmony_ci typespecs = _analyze.get_typespecs(types) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci def analyze_decl(decl): 667db96d56Sopenharmony_ci return _analyze.analyze_decl( 677db96d56Sopenharmony_ci decl, 687db96d56Sopenharmony_ci typespecs, 697db96d56Sopenharmony_ci knowntypespecs, 707db96d56Sopenharmony_ci types, 717db96d56Sopenharmony_ci knowntypes, 727db96d56Sopenharmony_ci analyze_resolved=analyze_resolved, 737db96d56Sopenharmony_ci ) 747db96d56Sopenharmony_ci _analyze.analyze_type_decls(types, analyze_decl, handle_unresolved) 757db96d56Sopenharmony_ci for decl in decls: 767db96d56Sopenharmony_ci if decl in types: 777db96d56Sopenharmony_ci resolved = types[decl] 787db96d56Sopenharmony_ci else: 797db96d56Sopenharmony_ci resolved = analyze_decl(decl) 807db96d56Sopenharmony_ci if resolved and handle_unresolved: 817db96d56Sopenharmony_ci typedeps, _ = resolved 827db96d56Sopenharmony_ci if not isinstance(typedeps, TypeDeclaration): 837db96d56Sopenharmony_ci if not typedeps or None in typedeps: 847db96d56Sopenharmony_ci raise NotImplementedError((decl, resolved)) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci yield decl, resolved 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci####################################### 907db96d56Sopenharmony_ci# checks 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_cidef check_all(analysis, checks, *, failfast=False): 937db96d56Sopenharmony_ci for check in checks or (): 947db96d56Sopenharmony_ci for data, failure in check(analysis): 957db96d56Sopenharmony_ci if failure is None: 967db96d56Sopenharmony_ci continue 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci yield data, failure 997db96d56Sopenharmony_ci if failfast: 1007db96d56Sopenharmony_ci yield None, None 1017db96d56Sopenharmony_ci break 1027db96d56Sopenharmony_ci else: 1037db96d56Sopenharmony_ci continue 1047db96d56Sopenharmony_ci # We failed fast. 1057db96d56Sopenharmony_ci break 106