"""Волна N+2 поверх vfbuild16 (12 EF-ошибок в aaj.java). Запуск: python3 tools/waves_n2.py""" import os, sys, collections ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) JAVA = os.path.join(ROOT, "src/main/java") stats = collections.Counter() files = {} def get(rel): p = rel if os.path.isabs(rel) else os.path.join(JAVA, rel) if p not in files: files[p] = open(p, encoding="utf-8", errors="replace").read().splitlines() return files[p] def edit_line(rel, ln, old, new, tag="n"): L = get(rel) i = ln - 1 if i >= len(L): stats[tag + "_MISS"] += 1 print(f"MISS {rel}:{ln} (oob {len(L)})") return if old in L[i]: L[i] = L[i].replace(old, new, 1) stats[tag] += 1 elif new in L[i]: stats[tag + "_skip"] += 1 else: stats[tag + "_MISS"] += 1 print(f"MISS {rel}:{ln}: {old!r}\n got: {L[i].strip()!r}") def insert_before(rel, ln, lines, tag="ins"): L = get(rel) i = ln - 1 if lines[0] in L[max(0, i - 5) : i]: stats[tag + "_skip"] += 1 return L[i:i] = lines stats[tag] += len(lines) A = "defpackage/aaj.java" EDITS = [ (A, 1888, ", var1, var3.at()));", ", var1f, var3f.at()));"), ( A, 1876, "if (!var2.equals(this.chatWith)) {", "if (!var2f.equals(this.chatWith)) {", ), (A, 1865, "this.chatPending.remove(var3);", "this.chatPending.remove(var3f);"), ( A, 1797, "if (!var1.equals(this.chatWith)) {", "if (!var1f.equals(this.chatWith)) {", ), (A, 1501, "if (var3.level != null) {", "if (var3f.level != null) {"), ( A, 1494, "new ServerData(var1.username(), var2, Type.OTHER),", "new ServerData(var1.username(), var2f, Type.OTHER),", ), (A, 1493, "ServerAddress.parseString(var2),", "ServerAddress.parseString(var2f),"), (A, 1492, "var3,", "var3f,"), ( A, 1486, "var3.disconnectWithProgressScreen();", "var3f.disconnectWithProgressScreen();", ), ] INSERTS = [ ( A, 1859, [ " final String var1f = var1;", " final String var2f = var2;", " final amw var3f = var3;", ], ), (A, 1772, [" final String var1f = var1;"]), ( A, 1479, [ " final Minecraft var3f = var3;", " final String var2f = var2;", ], ), ] def main(): rows = [("e", ln, a, b) for _, ln, a, b in EDITS] + [ ("i", ln, a, None) for _, ln, a in INSERTS ] for kind, ln, a, b in sorted(rows, key=lambda r: -r[1]): if kind == "e": edit_line(A, ln, a, b) else: insert_before(A, ln, a) for p, L in files.items(): with open(p, "w", encoding="utf-8") as f: f.write("\n".join(L) + "\n") print(dict(stats)) miss = {k: v for k, v in stats.items() if "MISS" in k} if miss: print("PROBLEMS:", dict(miss)) sys.exit(1) if __name__ == "__main__": main()