Skip to content

Commit 45218d1

Browse files
committed
Preserve parent <-> child mapping in dependency resolution
1 parent 5cd20ac commit 45218d1

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ versionAdapterDefinition=1.2.3
1111
versionMc=1.20.1
1212
versionForge=47.1.3
1313
versionForgeAutoRenamingTool=1.0.8
14-
versionFabricLoader=2.3.3+0.14.21+1.20.1
14+
versionFabricLoader=2.3.4+0.14.21+1.20.1
1515
versionAccessWidener=2.1.0
1616
versionFabricApi=0.87.0+1.9.6+1.20.1
1717
versionMixin=0.12.6+mixin.0.8.5

src/main/java/dev/su5ed/sinytra/connector/locator/ConnectorLocator.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.su5ed.sinytra.connector.locator;
22

3+
import com.google.common.collect.HashMultimap;
4+
import com.google.common.collect.Multimap;
35
import com.mojang.logging.LogUtils;
46
import cpw.mods.jarhandling.SecureJar;
57
import dev.su5ed.sinytra.connector.ConnectorUtil;
@@ -86,18 +88,18 @@ private List<IModFile> locateFabricMods(Iterable<IModFile> loadedMods) {
8688
return !ConnectorUtil.DISABLED_MODS.contains(modid) && !loadedModIds.contains(modid);
8789
})
8890
.toList();
91+
Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentToChildren = HashMultimap.create();
8992
// Discover fabric nested mod jars
9093
List<JarTransformer.TransformableJar> discoveredNestedJars = discoveredJars.stream()
9194
.flatMap(jar -> {
92-
SecureJar secureJar = SecureJar.from(jar.input().toPath());
9395
ConnectorLoaderModMetadata metadata = jar.modPath().metadata().modMetadata();
94-
return discoverNestedJarsRecursive(tempDir, secureJar, metadata.getJars());
96+
return discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren);
9597
})
9698
.toList();
9799
// Remove mods loaded by FML
98100
List<JarTransformer.TransformableJar> uniqueJars = handleDuplicateMods(discoveredJars, discoveredNestedJars, loadedModIds);
99101
// Ensure we have all required dependencies before transforming
100-
List<JarTransformer.TransformableJar> candidates = DependencyResolver.resolveDependencies(uniqueJars, loadedMods);
102+
List<JarTransformer.TransformableJar> candidates = DependencyResolver.resolveDependencies(uniqueJars, parentToChildren, loadedMods);
101103
// Get renamer library classpath
102104
List<Path> renameLibs = StreamSupport.stream(loadedMods.spliterator(), false).map(modFile -> modFile.getSecureJar().getRootPath()).toList();
103105
// Run jar transformations (or get existing outputs from cache)
@@ -138,14 +140,16 @@ private static boolean locateFabricModJar(Path path) {
138140
return false;
139141
}
140142

141-
private static Stream<JarTransformer.TransformableJar> discoverNestedJarsRecursive(Path tempDir, SecureJar secureJar, Collection<NestedJarEntry> jars) {
143+
private static Stream<JarTransformer.TransformableJar> discoverNestedJarsRecursive(Path tempDir, JarTransformer.TransformableJar parent, Collection<NestedJarEntry> jars, Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentToChildren) {
144+
SecureJar secureJar = SecureJar.from(parent.input().toPath());
142145
return jars.stream()
143146
.map(entry -> secureJar.getPath(entry.getFile()))
144147
.filter(Files::exists)
145148
.flatMap(path -> {
146149
JarTransformer.TransformableJar jar = uncheck(() -> prepareNestedJar(tempDir, secureJar.getPrimaryPath().getFileName().toString(), path));
147150
ConnectorLoaderModMetadata metadata = jar.modPath().metadata().modMetadata();
148-
return Stream.concat(Stream.of(jar), discoverNestedJarsRecursive(tempDir, SecureJar.from(jar.input().toPath()), metadata.getJars()));
151+
parentToChildren.put(parent, jar);
152+
return Stream.concat(Stream.of(jar), discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren));
149153
});
150154
}
151155

src/main/java/dev/su5ed/sinytra/connector/locator/DependencyResolver.java

+28-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package dev.su5ed.sinytra.connector.locator;
22

3+
import com.google.common.collect.BiMap;
4+
import com.google.common.collect.HashBiMap;
5+
import com.google.common.collect.Multimap;
36
import com.mojang.logging.LogUtils;
47
import dev.su5ed.sinytra.connector.loader.ConnectorEarlyLoader;
58
import dev.su5ed.sinytra.connector.transformer.JarTransformer;
@@ -21,8 +24,9 @@
2124

2225
import java.nio.file.Path;
2326
import java.nio.file.Paths;
27+
import java.util.ArrayList;
28+
import java.util.Collection;
2429
import java.util.Collections;
25-
import java.util.HashMap;
2630
import java.util.List;
2731
import java.util.Map;
2832
import java.util.Objects;
@@ -37,28 +41,23 @@ public final class DependencyResolver {
3741
public static final VersionOverrides VERSION_OVERRIDES = new VersionOverrides();
3842
public static final DependencyOverrides DEPENDENCY_OVERRIDES = new DependencyOverrides(FMLPaths.CONFIGDIR.get());
3943

40-
public static List<JarTransformer.TransformableJar> resolveDependencies(List<JarTransformer.TransformableJar> jars, Iterable<IModFile> loadedMods) {
41-
Map<ModCandidate, JarTransformer.TransformableJar> candidateToJar = new HashMap<>();
44+
public static List<JarTransformer.TransformableJar> resolveDependencies(Collection<JarTransformer.TransformableJar> keys, Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> jars, Iterable<IModFile> loadedMods) {
45+
BiMap<JarTransformer.TransformableJar, ModCandidate> jarToCandidate = HashBiMap.create();
4246
// Fabric candidates
43-
Stream<ModCandidate> candidates = jars.stream()
44-
.map(jar -> {
45-
ModCandidate candidate = ModCandidate.createPlain(List.of(jar.modPath().path()), jar.modPath().metadata().modMetadata(), false, List.of());
46-
candidateToJar.put(candidate, jar);
47-
return candidate;
48-
});
47+
List<ModCandidate> candidates = createCandidatesRecursive(keys, jars, jarToCandidate);
4948
// Forge dependencies
5049
Stream<ModCandidate> forgeCandidates = StreamSupport.stream(loadedMods.spliterator(), false)
5150
.flatMap(modFile -> modFile.getModFileInfo() != null ? modFile.getModInfos().stream() : Stream.empty())
5251
.map(modInfo -> ModCandidate.createPlain(List.of(modInfo.getOwningFile().getFile().getFilePath()), new BuiltinMetadataWrapper(new FMLModMetadata(modInfo)), false, List.of()));
5352
Stream<ModCandidate> builtinCandidates = Stream.of(createJavaMod(), createFabricLoaderMod());
5453
// Merge
55-
List<ModCandidate> allCandidates = Stream.of(candidates, forgeCandidates, builtinCandidates).flatMap(Function.identity()).toList();
54+
List<ModCandidate> allCandidates = Stream.of(candidates.stream(), forgeCandidates, builtinCandidates).flatMap(Function.identity()).toList();
5655

5756
EnvType envType = FabricLoader.getInstance().getEnvironmentType();
5857
try {
5958
List<ModCandidate> resolved = ModResolver.resolve(allCandidates, envType, Map.of());
6059
List<JarTransformer.TransformableJar> candidateJars = resolved.stream()
61-
.map(candidateToJar::get)
60+
.map(jarToCandidate.inverse()::get)
6261
.filter(Objects::nonNull)
6362
.toList();
6463
LOGGER.info("Dependency resolution found {} candidates to load", candidateJars.size());
@@ -68,6 +67,24 @@ public static List<JarTransformer.TransformableJar> resolveDependencies(List<Jar
6867
}
6968
}
7069

70+
private static List<ModCandidate> createCandidatesRecursive(Collection<JarTransformer.TransformableJar> candidateJars, Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentsToChildren, Map<JarTransformer.TransformableJar, ModCandidate> jarToCandidate) {
71+
List<ModCandidate> candidates = new ArrayList<>();
72+
for (JarTransformer.TransformableJar candidateJar : candidateJars) {
73+
ModCandidate candidate = jarToCandidate.computeIfAbsent(candidateJar, j -> {
74+
Collection<JarTransformer.TransformableJar> children = parentsToChildren.containsKey(candidateJar) ? parentsToChildren.get(candidateJar) : List.of();
75+
List<ModCandidate> childCandidates = createCandidatesRecursive(children, parentsToChildren, jarToCandidate);
76+
List<Path> paths = parentsToChildren.containsValue(candidateJar) ? null : List.of(candidateJar.modPath().path());
77+
ModCandidate parent = ModCandidate.createPlain(paths, candidateJar.modPath().metadata().modMetadata(), false, childCandidates);
78+
for (ModCandidate childCandidate : childCandidates) {
79+
childCandidate.addParent(parent);
80+
}
81+
return parent;
82+
});
83+
candidates.add(candidate);
84+
}
85+
return candidates;
86+
}
87+
7188
private static ModCandidate createJavaMod() {
7289
ModMetadata metadata = new BuiltinModMetadata.Builder("java", System.getProperty("java.specification.version").replaceFirst("^1\\.", ""))
7390
.setName(System.getProperty("java.vm.name"))

0 commit comments

Comments
 (0)