"""Волна N поверх vfbuild14 (83 ошибки). Таблицы по file:line из vfbuild14.log. Запуск: python3 tools/waves_n.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): 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 edit_all(rel, old, new, tag, expect=None): L = get(rel) c = 0 for i, l in enumerate(L): if old in l: L[i] = l.replace(old, new) c += 1 if expect is not None and c != expect: stats[tag + "_COUNT"] += 1 print(f"COUNT {rel}: {old!r} matched {c}, expected {expect}") if c: stats[tag] += c else: if any(new in l for l in L): stats[tag + "_skip"] += 1 else: stats[tag + "_MISS"] += 1 print(f"MISS-ALL {rel}: {old!r}") def add_import(rel, imp, tag): L = get(rel) if imp in L: stats[tag + "_skip"] += 1 return for i, l in enumerate(L): if l.startswith("import "): L.insert(i, imp) stats[tag] += 1 return stats[tag + "_MISS"] += 1 print(f"IMPORT-MISS {rel}: {imp}") # (rel, line, old, new) EDITS = [ # --- gq: effectively-final (blank decls, single later assignment) --- ("defpackage/gq.java", 37, "float var3 = 0.0F;", "float var3;"), ("defpackage/gq.java", 38, "float var4 = 0.0F;", "float var4;"), ("defpackage/gq.java", 39, "Int2ObjectMap var5 = null;", "Int2ObjectMap var5;"), ("defpackage/gq.java", 40, "Int2ObjectMap var6 = null;", "Int2ObjectMap var6;"), # --- mm --- ( "defpackage/mm.java", 169, "this.activeFadingSounds.put(var1, var8);", "this.activeFadingSounds.put(var1, (ml)var8);", ), # --- ach --- ( "defpackage/ach.java", 458, "var6 = Comparator.comparing(var0 ->", "var6 = Comparator.comparing(var0 ->", ), # --- acz: бриджи через Object --- ( "defpackage/acz.java", 81, "var1 = (PerServerVersionScreen)var0;", "var1 = (b.k)(Object)var0;", ), ( "defpackage/acz.java", 83, "return new acx(var1.prevScreen,", "return new acx(((PerServerVersionScreen)var0).prevScreen,", ), ( "defpackage/acz.java", 105, "var1 = (ViaFabricPlusScreen)var0;", "var1 = (b.k)(Object)var0;", ), ( "defpackage/acz.java", 106, "return new acx(((ViaFabricPlusScreen)var1).prevScreen);", "return new acx(((ViaFabricPlusScreen)var0).prevScreen);", ), # --- adc --- ( "defpackage/adc.java", 448, "var0.setValue(var2[Math.floorMod(var3 + var1, var2.length)]);", "var0.setValue((T)var2[Math.floorMod(var3 + var1, var2.length)]);", ), # --- ado / aeq: typed Stream --- ( "defpackage/ado.java", 163, "try (Stream var15 = Files.list(capesDir()))", "try (Stream var15 = Files.list(capesDir()))", ), ( "defpackage/aeq.java", 817, "try (Stream var1 = Files.list(var0))", "try (Stream var1 = Files.list(var0))", ), # --- aeo: usage casts --- ("defpackage/aeo.java", 310, "var10.append(", "((MutableComponent)var10).append("), ("defpackage/aeo.java", 328, "var10.append(", "((MutableComponent)var10).append("), ("defpackage/aeo.java", 345, "var10.append(", "((MutableComponent)var10).append("), ("defpackage/aeo.java", 382, "var10.append(", "((MutableComponent)var10).append("), # --- ahw --- ( "defpackage/ahw.java", 175, "? -1: var9.getOrDefault(var11.parent.name, (1226890724 | -1226890725) + (1226890724 & -1226890725));", "? -1: ((Integer)var9.getOrDefault(var11.parent.name, (1226890724 | -1226890725) + (1226890724 & -1226890725)));", ), # --- aid --- ( "defpackage/aid.java", 636, "byte var33 = var18 ? 1 : 0;", "byte var33 = (byte)(var18 ? 1 : 0);", ), # --- akx --- ( "defpackage/akx.java", 154, "var1.sort((var0x, var1x) -> Integer.compare(var1x.getIntValue(), var0x.getIntValue()));", "var1.sort((var0x, var1x) -> Integer.compare(((Entry)var1x).getIntValue(), ((Entry)var0x).getIntValue()));", ), # --- akz --- ( "defpackage/akz.java", 160, "var1.sort(String::compareToIgnoreCase);", "((List)var1).sort(String::compareToIgnoreCase);", ), # --- ald --- ( "defpackage/ald.java", 128, "var7.toArray(new Direction[0]),", "(Direction[])var7.toArray(new Direction[0]),", ), ("defpackage/ald.java", 170, "var2.add(var5);", "var2.add((BakedQuad)var5);"), # --- alp / auw: логгер defpackage.id --- ( "defpackage/alp.java", 54, "id.warn(Cif.SECURITY,", "defpackage.id.warn(Cif.SECURITY,", ), ("defpackage/auw.java", 467, "id.error(", "defpackage.id.error("), # --- B -> byte[] --- ("defpackage/anm.java", 38, "B var2 = null;", "byte[] var2 = null;"), ("defpackage/ann.java", 36, "B var3 = null;", "byte[] var3 = null;"), ("defpackage/ans.java", 470, "B var3 = null;", "byte[] var3 = null;"), # --- ans: typed list for sort --- ( "defpackage/ans.java", 154, "ArrayList var4 = null;", "ArrayList var4 = null;", ), # --- anl --- ( "defpackage/anl.java", 823, 'var7.add("d", var1x)', 'var7.add("d", (JsonElement)var1x)', ), # --- aua: бридж mixin-интерфейса --- ("defpackage/aua.java", 126, "((b.j)var0)", "((b.j)(Object)var0)"), ("defpackage/aua.java", 241, "((b.j)var0)", "((b.j)(Object)var0)"), # --- dq: ams var5, blank EF --- ("defpackage/dq.java", 41, "Object var5 = null;", "ams var5;"), ("defpackage/dq.java", 42, "String var6 = null;", "String var6;"), # --- hy: typed comparator --- ( "defpackage/hy.java", 351, "Comparator var1 = Comparator.comparingInt(", "Comparator var1 = Comparator.comparingInt(", ), # --- hl --- ( "defpackage/hl.java", 76, "LinkedHashMap var1 = new LinkedHashMap();", "LinkedHashMap var1 = new LinkedHashMap();", ), ( "defpackage/hl.java", 88, "ArrayList var7 = new ArrayList(var1.values());", "ArrayList var7 = new ArrayList(var1.values());", ), # --- hn --- ( "defpackage/hn.java", 594, "HashMap var1 = null;", "HashMap var1 = null;", ), # --- j --- ("defpackage/j.java", 221, "final i var3 = null;", "i var3 = null;"), # --- ld --- ( "defpackage/ld.java", 289, ".thenCompose(Function.identity());", ".thenCompose(var12x -> (java.util.concurrent.CompletionStage>)(Object)var12x);", ), # --- mr: lambda вместо method ref (raw Optional) --- ( "defpackage/mr.java", 57, "ifPresent(var14::add);", "ifPresent(var17 -> var14.add((JsonElement)var17));", ), ( "defpackage/mr.java", 110, "ifPresent(var14::add);", "ifPresent(var17 -> var14.add((JsonElement)var17));", ), # --- nj --- ("defpackage/nj.java", 1036, "new nl(var3, var3x,", "new nl((nk)var3, var3x,"), # --- op: merged slots --- ("defpackage/op.java", 239, "Constable var3 = null;", "Object var3 = null;"), ("defpackage/op.java", 242, "Constable var6 = null;", "Object var6 = null;"), ("defpackage/op.java", 1179, "Object var4 = null;", "ob var4 = null;"), # --- ri --- ( "defpackage/ri.java", 1206, "ArrayList var2 = new ArrayList();", "ArrayList var2 = new ArrayList();", ), # --- tf --- ( "defpackage/tf.java", 239, "Optional var16 = null;", "Optional var16 = null;", ), ( "defpackage/tf.java", 279, "var16 = var15.clip(var2, var3);", "var16 = var15.clip(var2, var3).map(BlockHitResult::getLocation);", ), ( "defpackage/tf.java", 482, "Optional var13 = null;", "Optional var13 = null;", ), ( "defpackage/tf.java", 489, "new EntityHitResult(var2, var1x)", "new EntityHitResult(var2, var1x.getLocation())", ), # --- ux: int -> boolean --- ( "defpackage/ux.java", 281, "var16, var17, var18, var19);", "var16, var17 != 0, var18, var19);", ), # --- vd / vu --- ( "defpackage/vd.java", 454, "var6.sort(Comparator.comparingDouble(var0 -> -mc.player.distanceToSqr(var0)));", "var6.sort(Comparator.comparingDouble(var0 -> -mc.player.distanceToSqr((net.minecraft.world.entity.player.Player)var0)));", ), ( "defpackage/vu.java", 841, "var4.sort(Comparator.comparingDouble(var0 -> -mc.player.distanceToSqr(var0)));", "var4.sort(Comparator.comparingDouble(var0 -> -mc.player.distanceToSqr((net.minecraft.world.entity.player.Player)var0)));", ), # --- ww --- ( "defpackage/ww.java", 147, "Optional var2 = decode(var0, var1);", "Optional var2 = decode(var0, var1);", ), # --- agk --- ( "defpackage/agk.java", 346, "ArrayList var3 = null;", "ArrayList var3 = null;", ), # --- b: bare bz + ParseResults --- ( "b/bx.java", 27, ", bz.getInstance().getCommandManager().getSource());", ", defpackage.bz.getInstance().getCommandManager().getSource());", ), ( "b/t.java", 49, ", bz.getInstance().getCommandManager().getSource());", ", defpackage.bz.getInstance().getCommandManager().getSource());", ), ( "b/t.java", 54, "getCompletionSuggestions(this.currentParse, cursor);", "getCompletionSuggestions((ParseResults)this.currentParse, cursor);", ), ] # (rel, old, new, expect) ALL_EDITS = [ ("defpackage/aeh.java", "((Object[])var6)", "((float[])var6)", 3), ("defpackage/aua.java", "((b.j)var0)", "((b.j)(Object)var0)", 2), ] # content-based (unprivate ctors) CTOR_EDITS = [ ("defpackage/ara.java", "private ara()", "ara()"), ("defpackage/vk.java", "private vk()", "vk()"), ("defpackage/hh.java", "private hh(hk var1)", "hh(hk var1)"), ] IMPORTS = [ ("defpackage/gt.java", "import java.util.Iterator;"), ("defpackage/aeo.java", "import net.minecraft.network.chat.MutableComponent;"), ("b/t.java", "import net.minecraft.commands.SharedSuggestionProvider;"), ] def main(): by = collections.defaultdict(list) for row in EDITS: by[row[0]].append(row) # aua строки из EDITS уже есть (126/241) — ALL_EDITS по aua дублирует, убираем оттуда for rel, rows in by.items(): for row in sorted(rows, key=lambda r: -r[1]): edit_line(rel, row[1], row[2], row[3], "n") for rel, old, new, expect in ALL_EDITS: if rel == "defpackage/aua.java": continue edit_all(rel, old, new, "n", expect) for rel, old, new in CTOR_EDITS: edit_all(rel, old, new, "ctor") for rel, imp in IMPORTS: add_import(rel, imp, "import") 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 or "COUNT" in k} if miss: print("PROBLEMS:", dict(miss)) sys.exit(1) if __name__ == "__main__": main()