Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/deob/src/main/java/dev/openrs2/deob/remap/ClassMappingGenerator.kt

73 lines
2.2 KiB

package dev.openrs2.deob.remap
import dev.openrs2.asm.classpath.ClassMetadata
import dev.openrs2.asm.classpath.ClassPath
import dev.openrs2.asm.filter.ClassFilter
import dev.openrs2.deob.util.map.NameMap
import org.objectweb.asm.Opcodes
class ClassMappingGenerator(
private val classPath: ClassPath,
private val excludedClasses: ClassFilter,
private val nameMap: NameMap
) {
private val nameGenerator = NameGenerator()
private val mapping = mutableMapOf<String, String>()
fun generate(): Map<String, String> {
for (clazz in classPath.libraryClasses) {
populateMapping(clazz)
}
mapping.replaceAll { k, v ->
val (library, default) = v.splitAtLibraryBoundary()
val name = nameMap.mapClassName(k, default)
return@replaceAll "$library!$name"
}
return mapping
}
private fun populateMapping(clazz: ClassMetadata): String {
val name = clazz.name
if (mapping.containsKey(name) || !isRenamable(clazz)) {
return mapping.getOrDefault(name, name)
}
val mappedName = generateName(clazz)
mapping[name] = mappedName
return mappedName
}
private fun isRenamable(clazz: ClassMetadata): Boolean {
if (excludedClasses.matches(clazz.name) || clazz.dependency) {
return false
}
for (method in clazz.methods) {
if (clazz.getMethodAccess(method)!! and Opcodes.ACC_NATIVE != 0) {
return false
}
}
return true
}
private fun generateName(clazz: ClassMetadata): String {
val name = clazz.name
var mappedName = name.getLibraryAndPackageName()
val superClass = clazz.superClass
if (superClass != null && superClass.name != "java/lang/Object") {
var superName = populateMapping(superClass)
superName = superName.getClassName()
mappedName += nameGenerator.generate(superName + "_Sub")
} else if (clazz.`interface`) {
mappedName += nameGenerator.generate("Interface")
} else {
mappedName += nameGenerator.generate("Class")
}
return mappedName
}
}