Skip to content

Commit 8183cc4

Browse files
committed
stage2/ml9: Fix merging of provided services into KFF
With kotlinx-metadata-jvm being promoted to stable in Kotlin 2.0, the kotlin-reflect library now relies on a new service ([1]), the services file for which wasn't yet present in older KFF versions. And with the Java module system, which ModLauncher uses, merely merging the service file from the newer Kotlin isn't enough, we also need to merge them into KFF's module descriptor. [1]: https://github.com/JetBrains/kotlin/blob/4c61b7118f23a090a764a3aa07e4291e50210771/libraries/kotlinx-metadata/jvm/resources/META-INF/services/kotlin.metadata.internal.extensions.MetadataExtensions
1 parent e173100 commit 8183cc4

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

stage2/modlauncher9/src/main/java/gg/essential/loader/stage2/DescriptorRewritingJarMetadata.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@
66
import gg.essential.loader.stage2.util.Lazy;
77

88
import java.lang.module.ModuleDescriptor;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.stream.Collectors;
913

1014
/**
1115
* Re-creates the {@link #descriptor()} with an updated {@link SecureJar#getPackages() package list}.
1216
* This is needed when one adds classes (even internal ones) to a {@link SecureJar} in previously non-existent packages
1317
* because the module system needs to know about all packages because ModLauncher will use that package list to build
1418
* a lookup table.
19+
* Also updates the provided services with the ones from the new meta.
1520
*/
1621
public class DescriptorRewritingJarMetadata implements JarMetadata {
1722
private final JarMetadata delegate;
@@ -47,7 +52,13 @@ public ModuleDescriptor descriptor() {
4752
}
4853
org.uses().forEach(builder::uses);
4954
}
50-
org.provides().forEach(builder::provides);
55+
Map<String, List<String>> orgProvides = org.provides()
56+
.stream().collect(Collectors.toMap(ModuleDescriptor.Provides::service, ModuleDescriptor.Provides::providers));
57+
Map<String, List<String>> newProvides = newPkgsMeta.descriptor().provides()
58+
.stream().collect(Collectors.toMap(ModuleDescriptor.Provides::service, ModuleDescriptor.Provides::providers));
59+
Map<String, List<String>> mergedProvides = new HashMap<>(orgProvides);
60+
mergedProvides.putAll(newProvides);
61+
mergedProvides.forEach(builder::provides);
5162
org.mainClass().ifPresent(builder::mainClass);
5263
this.descriptor = builder.build();
5364
}

0 commit comments

Comments
 (0)