Sort methods

Fernflower was previously placing constructors in the middle of instance
methods. They look much nicer at the top.

This commit also ensures static methods appear before instance methods.
bzip2
Graham 5 years ago
parent 09bdf640f4
commit ad53f9a78d
  1. 2
      deob/src/main/java/dev/openrs2/deob/Deobfuscator.kt
  2. 37
      deob/src/main/java/dev/openrs2/deob/transform/MethodOrderTransformer.kt

@ -21,6 +21,7 @@ import dev.openrs2.deob.transform.ExceptionTracingTransformer
import dev.openrs2.deob.transform.FieldOrderTransformer import dev.openrs2.deob.transform.FieldOrderTransformer
import dev.openrs2.deob.transform.FinalTransformer import dev.openrs2.deob.transform.FinalTransformer
import dev.openrs2.deob.transform.InvokeSpecialTransformer import dev.openrs2.deob.transform.InvokeSpecialTransformer
import dev.openrs2.deob.transform.MethodOrderTransformer
import dev.openrs2.deob.transform.OpaquePredicateTransformer import dev.openrs2.deob.transform.OpaquePredicateTransformer
import dev.openrs2.deob.transform.OriginalNameTransformer import dev.openrs2.deob.transform.OriginalNameTransformer
import dev.openrs2.deob.transform.OverrideTransformer import dev.openrs2.deob.transform.OverrideTransformer
@ -170,6 +171,7 @@ class Deobfuscator(private val input: Path, private val output: Path) {
InvokeSpecialTransformer(), InvokeSpecialTransformer(),
StaticScramblingTransformer(), StaticScramblingTransformer(),
EmptyClassTransformer(), EmptyClassTransformer(),
MethodOrderTransformer(),
VisibilityTransformer(), VisibilityTransformer(),
OverrideTransformer() OverrideTransformer()
) )

@ -0,0 +1,37 @@
package dev.openrs2.deob.transform
import dev.openrs2.asm.classpath.ClassPath
import dev.openrs2.asm.classpath.Library
import dev.openrs2.asm.transform.Transformer
import org.objectweb.asm.Opcodes
import org.objectweb.asm.tree.ClassNode
import org.objectweb.asm.tree.MethodNode
class MethodOrderTransformer : Transformer() {
override fun transformClass(classPath: ClassPath, library: Library, clazz: ClassNode): Boolean {
clazz.methods.sortWith(STATIC_COMPARATOR.then(INIT_COMPARATOR))
return false
}
companion object {
private val STATIC_COMPARATOR = Comparator<MethodNode> { a, b ->
val aStatic = a.access and Opcodes.ACC_STATIC != 0
val bStatic = b.access and Opcodes.ACC_STATIC != 0
when {
aStatic && !bStatic -> -1
!aStatic && bStatic -> 1
else -> 0
}
}
private val INIT_COMPARATOR = Comparator<MethodNode> { a, b ->
val aInit = a.name.startsWith('<')
val bInit = b.name.startsWith('<')
when {
aInit && !bInit -> -1
!aInit && bInit -> 1
else -> 0
}
}
}
}
Loading…
Cancel
Save