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