def transform_bazel_query_results()

in bsp_server/scip_sync_util/scip_utils.py [0:0]


def transform_bazel_query_results(qr: list[dict]) -> dict[str, dict[str, list[str]]]:
    """Transform the results of a bazel query into a dictionary of dependencies."""
    res = {}

    rules = set([])

    for target in qr:
        if target["type"] == "RULE":
            rules.add(target["rule"]["name"])

    for target in qr:
        if target["type"] != "RULE":
            continue

        rule = target["rule"]
        name = rule["name"]
        base_path = rule["name"].split(":")[0][2:]

        # add all rule inputs except external repository
        # to deps
        direct_deps = []

        for dep in rule.get("ruleInput", []):
            if dep.startswith("@"):
                continue
            if dep not in rules:
                continue

            direct_deps.append(dep)

        target_type = rule["ruleClass"]

        e_deps = []
        deps = []
        for attr in rule.get("attribute", []):
            if "stringListValue" not in attr:
                continue
            if attr["name"] == "deps":
                deps += [
                    dep
                    for dep in attr.get("stringListValue", [])
                    if not dep.startswith("@") and dep in rules
                ]

            if attr["name"] == "data":
                deps += [
                    data
                    for data in attr.get("stringListValue", [])
                    if not data.startswith("@") and data in rules
                ]

            if attr["name"] == "exports":
                e_deps = attr.get("stringListValue", [])

        info = {
            "base_path": base_path,
            "deps": list(set(deps)),
            "direct_deps": direct_deps,
            "exports": e_deps,
            "target_type": target_type,
        }

        res[name] = info

    return res