Fixes merging of mappings for cases like: class_1234 is mapped, but class_1234$1 is not. (#498)
parent
ae9a9e120d
commit
98d8f37672
|
@ -34,9 +34,11 @@ import java.nio.file.FileSystems;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.net.UrlEscapers;
|
import com.google.common.net.UrlEscapers;
|
||||||
|
@ -66,6 +68,7 @@ import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch;
|
||||||
import net.fabricmc.mappingio.format.MappingFormat;
|
import net.fabricmc.mappingio.format.MappingFormat;
|
||||||
import net.fabricmc.mappingio.format.Tiny2Reader;
|
import net.fabricmc.mappingio.format.Tiny2Reader;
|
||||||
import net.fabricmc.mappingio.format.Tiny2Writer;
|
import net.fabricmc.mappingio.format.Tiny2Writer;
|
||||||
|
import net.fabricmc.mappingio.tree.MappingTree;
|
||||||
import net.fabricmc.mappingio.tree.MemoryMappingTree;
|
import net.fabricmc.mappingio.tree.MemoryMappingTree;
|
||||||
import net.fabricmc.stitch.Command;
|
import net.fabricmc.stitch.Command;
|
||||||
import net.fabricmc.stitch.commands.CommandProposeFieldNames;
|
import net.fabricmc.stitch.commands.CommandProposeFieldNames;
|
||||||
|
@ -296,6 +299,8 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
|
||||||
Tiny2Reader.read(reader, tree);
|
Tiny2Reader.read(reader, tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inheritMappedNamesOfEnclosingClasses(tree);
|
||||||
|
|
||||||
try (Tiny2Writer writer = new Tiny2Writer(Files.newBufferedWriter(out, StandardCharsets.UTF_8), false)) {
|
try (Tiny2Writer writer = new Tiny2Writer(Files.newBufferedWriter(out, StandardCharsets.UTF_8), false)) {
|
||||||
tree.accept(writer);
|
tree.accept(writer);
|
||||||
}
|
}
|
||||||
|
@ -303,6 +308,40 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
|
||||||
project.getLogger().info(":merged mappings in " + stopwatch.stop());
|
project.getLogger().info(":merged mappings in " + stopwatch.stop());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the mapping tree for inner classes with no mapped name, whose enclosing classes have mapped names.
|
||||||
|
* Currently, Yarn does not export mappings for these inner classes.
|
||||||
|
*/
|
||||||
|
private void inheritMappedNamesOfEnclosingClasses(MemoryMappingTree tree) {
|
||||||
|
int intermediaryIdx = tree.getNamespaceId("intermediary");
|
||||||
|
int namedIdx = tree.getNamespaceId("named");
|
||||||
|
|
||||||
|
// The tree does not have an index by intermediary names by default
|
||||||
|
tree.setIndexByDstNames(true);
|
||||||
|
|
||||||
|
for (MappingTree.ClassMapping classEntry : tree.getClasses()) {
|
||||||
|
String intermediaryName = classEntry.getDstName(intermediaryIdx);
|
||||||
|
String namedName = classEntry.getDstName(namedIdx);
|
||||||
|
|
||||||
|
if (intermediaryName.equals(namedName) && intermediaryName.contains("$")) {
|
||||||
|
String[] path = intermediaryName.split(Pattern.quote("$"));
|
||||||
|
int parts = path.length;
|
||||||
|
|
||||||
|
for (int i = parts - 2; i >= 0; i--) {
|
||||||
|
String currentPath = String.join("$", Arrays.copyOfRange(path, 0, i + 1));
|
||||||
|
String namedParentClass = tree.mapClassName(currentPath, intermediaryIdx, namedIdx);
|
||||||
|
|
||||||
|
if (!namedParentClass.equals(currentPath)) {
|
||||||
|
classEntry.setDstName(namedParentClass
|
||||||
|
+ "$" + String.join("$", Arrays.copyOfRange(path, i + 1, path.length)),
|
||||||
|
namedIdx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private MemoryMappingTree readIntermediaryTree() throws IOException {
|
private MemoryMappingTree readIntermediaryTree() throws IOException {
|
||||||
MemoryMappingTree tree = new MemoryMappingTree();
|
MemoryMappingTree tree = new MemoryMappingTree();
|
||||||
MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true);
|
MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true);
|
||||||
|
|
Loading…
Reference in New Issue