#!/usr/bin/env python3

import os
import re
import sys
from concurrent.futures import ThreadPoolExecutor, as_completed


def remove_prefix(i, d=0):
    if d == 100:
        return 2
    s = os.popen("llvm-lit -a " + i).read()
    r = re.search("no check strings found with (?:prefix|prefixes) '([^:]+)", s)
    with open(i, "r+") as f:
        s = f.read()
        if r:
            p = r.group(1)
            s = re.sub("=" + p + ",", "=", s)
            s = re.sub("," + p + "([, \n])", "\\1", s)
            s = re.sub("\s+-?-check-prefix=" + p + "([ \n])", "\\1", s)
        else:
            s = re.sub(
                "-?-check-prefixes=([\w-]+)(\Z|[ \t\n])", "--check-prefix=\\1\\2", s
            )
            t = re.search(
                "-?-check-(?:prefix|prefixes)=([^ ]+)\s+-?-check-(?:prefix|prefixes)=([^ ]+)",
                s,
            )
            while t:
                s = re.sub(
                    t.group(), "--check-prefixes=" + t.group(1) + "," + t.group(2), s
                )
                t = re.search(
                    "-?-check-(?:prefix|prefixes)=([^ ]+)\s+-?-check-(?:prefix|prefixes)=([^ ]+)",
                    s,
                )
            s = re.sub("\s+-?-check-prefix=CHECK[ \t]*\n", "\n", s)
        f.truncate(0)
        f.seek(0)
        f.write(s)
    if not r:
        t = re.search("Assertions have been autogenerated by (.*)", s)
        if t:
            s = os.popen("llvm/" + t.group(1) + " " + i + " 2>&1").read()
            if "had conflicting output from different RUN lines for all functions" in s:
                return -1
            s = os.popen("git diff " + i).read()
            if re.search("\n(?:-+)\n", s) or re.search("\n[+-].*(?<!RUN):", s):
                return 1
        return 0
    return remove_prefix(i, d + 1)


with ThreadPoolExecutor(max_workers=32) as e:
    f = []
    c = []
    a = []
    t = {e.submit(remove_prefix, i): i for i in sys.argv[1:]}
    for i in as_completed(t):
        if i.result() == 0:
            print("DONE:", end=" ")
        elif i.result() == -1:
            print("FAIL:", end=" ")
            f.append(t[i])
        elif i.result() == 1:
            print("CHANGE:", end=" ")
            c.append(t[i])
        else:
            print("ABORT:", end=" ")
            a.append(t[i])
        print(t[i])
    for i in [(f, "Failed"), (c, "Changed"), (a, "Aborted")]:
        if i[0]:
            print("********************\n%s Tests (%d):" % (i[1], len(i[0])))
            for j in i[0]:
                print("  " + j)
