diff options
6 files changed, 56 insertions, 11 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index f32d4c2..0a245b5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.5.21" + kotlin("jvm") version "1.9.23" `maven-publish` } @@ -22,6 +22,7 @@ val testB by sourceSets.creating kotlinVersion("1.5.21", isPrimaryVersion = true) kotlinVersion("1.6.20") +kotlinVersion("1.9.0") dependencies { api("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.5.21") @@ -86,6 +87,13 @@ tasks.test { useJUnitPlatform() } +tasks.withType<KotlinCompile> { + kotlinOptions { + apiVersion = "1.5" + languageVersion = "1.5" + } +} + fun kotlinVersion(version: String, isPrimaryVersion: Boolean = false) { val name = version.replace(".", "") diff --git a/src/kotlin1521/kotlin/com/replaymod/gradle/remap/kotlin1521.kt b/src/kotlin1521/kotlin/com/replaymod/gradle/remap/kotlin1521.kt index c63cb98..3031a9a 100644 --- a/src/kotlin1521/kotlin/com/replaymod/gradle/remap/kotlin1521.kt +++ b/src/kotlin1521/kotlin/com/replaymod/gradle/remap/kotlin1521.kt @@ -1,6 +1,7 @@ package com.replaymod.gradle.remap import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM @@ -16,3 +17,5 @@ fun analyze1521(environment: KotlinCoreEnvironment, ktFiles: List<KtFile>): Anal { scope: GlobalSearchScope -> environment.createPackagePartProvider(scope) } ) } + +fun kotlinSourceRoot1521(path: String, isCommon: Boolean) = KotlinSourceRoot(path, isCommon) diff --git a/src/kotlin190/kotlin/com/replaymod/gradle/remap/kotlin190.kt b/src/kotlin190/kotlin/com/replaymod/gradle/remap/kotlin190.kt new file mode 100644 index 0000000..fecaa66 --- /dev/null +++ b/src/kotlin190/kotlin/com/replaymod/gradle/remap/kotlin190.kt @@ -0,0 +1,5 @@ +package com.replaymod.gradle.remap + +import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot + +fun kotlinSourceRoot190(path: String, isCommon: Boolean) = KotlinSourceRoot(path, isCommon, null) diff --git a/src/main/kotlin/com/replaymod/gradle/remap/PsiMapper.kt b/src/main/kotlin/com/replaymod/gradle/remap/PsiMapper.kt index 5dba364..f0b8b6b 100644 --- a/src/main/kotlin/com/replaymod/gradle/remap/PsiMapper.kt +++ b/src/main/kotlin/com/replaymod/gradle/remap/PsiMapper.kt @@ -531,14 +531,11 @@ internal class PsiMapper( } private fun remapMixinTarget(target: String): String { - return if (target.contains(':') || target.contains('(')) { - remapFullyQualifiedMethodOrField(target) - } else { - if (target[0] == 'L') { - remapInternalType(target) - } else { - remapInternalType("L$target;").drop(1).dropLast(1) - } + return when { + target.startsWith('(') -> remapMethodDesc(target) + target.contains(':') || target.contains('(') -> remapFullyQualifiedMethodOrField(target) + target[0] == 'L' -> remapInternalType(target) + else -> remapInternalType("L$target;").drop(1).dropLast(1) } } diff --git a/src/main/kotlin/com/replaymod/gradle/remap/Transformer.kt b/src/main/kotlin/com/replaymod/gradle/remap/Transformer.kt index 6e8dae1..0845e0d 100644 --- a/src/main/kotlin/com/replaymod/gradle/remap/Transformer.kt +++ b/src/main/kotlin/com/replaymod/gradle/remap/Transformer.kt @@ -4,7 +4,6 @@ import com.replaymod.gradle.remap.legacy.LegacyMapping import org.cadixdev.lorenz.MappingSet import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.config.ContentRoot -import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector @@ -73,7 +72,12 @@ class Transformer(private val map: MappingSet) { config.put(CommonConfigurationKeys.MODULE_NAME, "main") jdkHome?.let {config.setupJdk(it) } config.add<ContentRoot>(CLIConfigurationKeys.CONTENT_ROOTS, JavaSourceRoot(tmpDir.toFile(), "")) - config.add<ContentRoot>(CLIConfigurationKeys.CONTENT_ROOTS, KotlinSourceRoot(tmpDir.toAbsolutePath().toString(), false)) + val kotlinSourceRoot = try { + kotlinSourceRoot1521(tmpDir.toAbsolutePath().toString(), false) + } catch (e: NoSuchMethodError) { + kotlinSourceRoot190(tmpDir.toAbsolutePath().toString(), false) + } + config.add<ContentRoot>(CLIConfigurationKeys.CONTENT_ROOTS, kotlinSourceRoot) config.addAll<ContentRoot>(CLIConfigurationKeys.CONTENT_ROOTS, classpath!!.map { JvmClasspathRoot(File(it)) }) config.put<MessageCollector>(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, PrintingMessageCollector(System.err, MessageRenderer.GRADLE_STYLE, true)) diff --git a/src/main/kotlin/com/replaymod/gradle/remap/legacy/LegacyMappingSetModelFactory.kt b/src/main/kotlin/com/replaymod/gradle/remap/legacy/LegacyMappingSetModelFactory.kt index ec21546..6d463f0 100644 --- a/src/main/kotlin/com/replaymod/gradle/remap/legacy/LegacyMappingSetModelFactory.kt +++ b/src/main/kotlin/com/replaymod/gradle/remap/legacy/LegacyMappingSetModelFactory.kt @@ -3,7 +3,10 @@ package com.replaymod.gradle.remap.legacy import org.cadixdev.bombe.type.signature.MethodSignature import org.cadixdev.lorenz.MappingSet import org.cadixdev.lorenz.impl.MappingSetModelFactoryImpl +import org.cadixdev.lorenz.impl.model.InnerClassMappingImpl import org.cadixdev.lorenz.impl.model.TopLevelClassMappingImpl +import org.cadixdev.lorenz.model.ClassMapping +import org.cadixdev.lorenz.model.InnerClassMapping import org.cadixdev.lorenz.model.MethodMapping import org.cadixdev.lorenz.model.TopLevelClassMapping import java.util.* @@ -29,4 +32,29 @@ class LegacyMappingSetModelFactory : MappingSetModelFactoryImpl() { } } } + + override fun createInnerClassMapping( + parent: ClassMapping<out ClassMapping<*, *>, *>?, + obfuscatedName: String?, + deobfuscatedName: String? + ): InnerClassMapping { + return object : InnerClassMappingImpl(parent, obfuscatedName, deobfuscatedName) { + private fun stripDesc(signature: MethodSignature): MethodSignature { + // actual descriptor isn't included in legacy format + return MethodSignature.of(signature.name, "()V") + } + + override fun hasMethodMapping(signature: MethodSignature): Boolean { + return super.hasMethodMapping(signature) || super.hasMethodMapping(stripDesc(signature)) + } + + override fun getMethodMapping(signature: MethodSignature): Optional<MethodMapping> { + var maybeMapping = super.getMethodMapping(signature) + if (!maybeMapping.isPresent || maybeMapping.get().let { it.signature == it.deobfuscatedSignature }) { + maybeMapping = super.getMethodMapping(stripDesc(signature)) + } + return maybeMapping + } + } + } } |