aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/replaymod/gradle/remap/legacy/LegacyMappingSetModelFactory.kt
blob: 6d463f06d8e8753a2e4225fe35a9e22215b5f397 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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.*

class LegacyMappingSetModelFactory : MappingSetModelFactoryImpl() {
    override fun createTopLevelClassMapping(parent: MappingSet, obfuscatedName: String, deobfuscatedName: String): TopLevelClassMapping {
        return object : TopLevelClassMappingImpl(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
            }
        }
    }

    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
            }
        }
    }
}