runtimeNamesOf

fun runtimeNamesOf(target: Class<*>, mojmapMethod: String): Set<String>

Every RUNTIME name mojmapMethod can carry on target or any ancestor — the forward direction, and the only sound way to pick a patch target on an obf runtime.

methodToMojmap cannot do this job: its table is keyed by the runtime name alone, which is unique on intermediary/srg but not on spigot, where it refuses to answer at all. The forward table is keyed by (owner, mojmap name) — unique in every namespace — and the owner is free, because the script named it.

The climb is what the owner-free reverse lookup was standing in for: an override declared on a MOD class carries the runtime name of the MC method it overrides, and only the MC declarer has a mapping row. Converting the OWNER per level is safe where converting the member is not: no namespace can spell two classes the same way, so the class map is injective in all of them — which is exactly what obf member names are not, collapsing many mojmap methods onto one.

O(hierarchy depth), NOT O(declared methods): the wanted name is fixed, so each level is two hash lookups. An unmapped level passes mojmapMethod through, which is what a mod's own same-named method needs.