#!/usr/bin/env python3

import json
import re
import sys
from pathlib import Path


# Use this script by piping the output of clippy into it:
# > cargo clippy --workspace --all-features --all-targets --message-format=json -- -W unreachable_pub | python scripts/fix-unreachable-pub.py
#
# You might have to run this in a loop as restricting the visibility of one item can trigger the warning for another item.

def fix_unreachable_pub_warning(warning):
    file_path = Path(warning["spans"][0]["file_name"])

    try:
        line = warning["spans"][0]["line_start"]

        # Don't modify generated code
        if "generated" in str(file_path):
            return

        with file_path.open() as f:
            lines = f.readlines()

        pub_pattern = re.compile(r"(\s*)pub(\s)(.*)")
        match = pub_pattern.match(lines[line - 1])

        if match:
            indentation = match.group(1)
            space = match.group(2)
            rest_of_line = match.group(3)
            lines[line - 1] = f"{indentation}pub(crate){space}{rest_of_line}"

        with file_path.open("w") as f:
            f.writelines(lines)
    except Exception as e:
        print(f"Failed to apply suggestion in {file_path}: {e}")


def main():
    for line in sys.stdin:
        # Ignore other compiler messages
        if "unreachable_pub" not in line:
            continue

        warning = json.loads(line.strip())

        # Don't modify code that is not in the current workspace
        if str(Path.cwd()) not in str(warning['target']['src_path']):
            return

        m = warning["message"]

        if m is None:
            continue

        code = m['code']

        if code is None:
            continue

        fix_unreachable_pub_warning(m)


if __name__ == "__main__":
    main()