evo/tools/waves_n.py

400 lines
12 KiB
Python

"""Волна 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.<mo>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<Path> var15 = Files.list(capesDir()))",
),
(
"defpackage/aeq.java",
817,
"try (Stream var1 = Files.list(var0))",
"try (Stream<Path> 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<String>)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<anr> 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<hu> var1 = Comparator.comparingInt(",
),
# --- hl ---
(
"defpackage/hl.java",
76,
"LinkedHashMap var1 = new LinkedHashMap();",
"LinkedHashMap<hk, hh> var1 = new LinkedHashMap();",
),
(
"defpackage/hl.java",
88,
"ArrayList var7 = new ArrayList(var1.values());",
"ArrayList<hh> var7 = new ArrayList(var1.values());",
),
# --- hn ---
(
"defpackage/hn.java",
594,
"HashMap var1 = null;",
"HashMap<String, Integer> 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<HttpResponse<String>>)(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<rh> var2 = new ArrayList();",
),
# --- tf ---
(
"defpackage/tf.java",
239,
"Optional var16 = null;",
"Optional<Vec3> 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<BlockHitResult> 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<xd> var2 = decode(var0, var1);",
),
# --- agk ---
(
"defpackage/agk.java",
346,
"ArrayList var3 = null;",
"ArrayList<agh> 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<SharedSuggestionProvider>)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()