|
|
|
@ -4,27 +4,29 @@ import dev.openrs2.asm.classpath.JsrInliner |
|
|
|
|
import dev.openrs2.asm.classpath.Library |
|
|
|
|
import org.objectweb.asm.ClassReader |
|
|
|
|
import org.objectweb.asm.tree.ClassNode |
|
|
|
|
import java.util.jar.JarEntry |
|
|
|
|
import java.util.jar.JarInputStream |
|
|
|
|
|
|
|
|
|
class JarLibraryReader(private val input: JarInputStream) : LibraryReader { |
|
|
|
|
|
|
|
|
|
override fun read(): Library { |
|
|
|
|
val library = Library() |
|
|
|
|
val classes = generateSequence { input.nextJarEntry } |
|
|
|
|
.filter(::isClass) |
|
|
|
|
.map { input.readClass() } |
|
|
|
|
.associateBy(ClassNode::name) |
|
|
|
|
|
|
|
|
|
while (true) { |
|
|
|
|
val entry = input.nextJarEntry ?: break |
|
|
|
|
if (!entry.name.endsWith(CLASS_SUFFIX)) { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val clazz = ClassNode() |
|
|
|
|
val reader = ClassReader(input) |
|
|
|
|
reader.accept(JsrInliner(clazz), ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) |
|
|
|
|
return Library(classes) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
library.add(clazz) |
|
|
|
|
} |
|
|
|
|
private fun isClass(entry: JarEntry): Boolean { |
|
|
|
|
return entry.name.endsWith(CLASS_SUFFIX) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return library |
|
|
|
|
private fun JarInputStream.readClass(): ClassNode { |
|
|
|
|
val clazz = ClassNode() |
|
|
|
|
val reader = ClassReader(this) |
|
|
|
|
reader.accept(JsrInliner(clazz), ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) |
|
|
|
|
return clazz |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private companion object { |
|
|
|
|