package dev.openrs2.asm.io 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 classes = generateSequence { input.nextJarEntry } .filter(::isClass) .map { input.readClass() } .associateBy(ClassNode::name) return Library(classes) } private fun isClass(entry: JarEntry): Boolean { return entry.name.endsWith(CLASS_SUFFIX) } 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 { private const val CLASS_SUFFIX = ".class" } }