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.
92 lines
3.6 KiB
92 lines
3.6 KiB
package org.openrs2.deob.ast
|
|
|
|
import com.github.javaparser.ParserConfiguration
|
|
import com.github.javaparser.ast.CompilationUnit
|
|
import com.github.javaparser.printer.DefaultPrettyPrinter
|
|
import com.github.javaparser.printer.configuration.DefaultConfigurationOption
|
|
import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration
|
|
import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration.ConfigOption.INDENTATION
|
|
import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration.ConfigOption.INDENT_CASE_IN_SWITCH
|
|
import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration.ConfigOption.ORDER_IMPORTS
|
|
import com.github.javaparser.printer.configuration.Indentation
|
|
import com.github.javaparser.printer.configuration.Indentation.IndentType.TABS_WITH_SPACE_ALIGN
|
|
import com.github.javaparser.symbolsolver.JavaSymbolSolver
|
|
import com.github.javaparser.symbolsolver.resolution.typesolvers.ClassLoaderTypeSolver
|
|
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver
|
|
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver
|
|
import com.github.javaparser.utils.SourceRoot
|
|
import com.github.michaelbull.logging.InlineLogger
|
|
import org.openrs2.deob.util.Module
|
|
import java.util.function.Function
|
|
|
|
public class Library(
|
|
public val name: String,
|
|
private val root: SourceRoot
|
|
) : Iterable<CompilationUnit> {
|
|
private val units = mutableMapOf<String, CompilationUnit>()
|
|
|
|
init {
|
|
for (unit in root.compilationUnits) {
|
|
val name = unit.primaryType.get().fullyQualifiedName.get()
|
|
units[name] = unit
|
|
}
|
|
}
|
|
|
|
public operator fun get(name: String): CompilationUnit? {
|
|
return units[name]
|
|
}
|
|
|
|
override fun iterator(): Iterator<CompilationUnit> {
|
|
return units.values.iterator()
|
|
}
|
|
|
|
public fun save() {
|
|
logger.info { "Saving root ${root.root}" }
|
|
root.saveAll()
|
|
}
|
|
|
|
public companion object {
|
|
private val logger = InlineLogger()
|
|
|
|
private val PC_ANNOTATION_REGEX = Regex("@Pc\\(([0-9]+)\\)\\s+")
|
|
|
|
private val printer = Function<CompilationUnit, String>(
|
|
DefaultPrettyPrinter(
|
|
DefaultPrinterConfiguration()
|
|
.addOption(DefaultConfigurationOption(INDENTATION, Indentation(TABS_WITH_SPACE_ALIGN, 1)))
|
|
.addOption(DefaultConfigurationOption(INDENT_CASE_IN_SWITCH, false))
|
|
.addOption(DefaultConfigurationOption(ORDER_IMPORTS, true))
|
|
)::print
|
|
).andThen(::stripNewlineAfterPcAnnotation)
|
|
|
|
public fun parse(module: Module): Library {
|
|
logger.info { "Parsing root ${module.sources}" }
|
|
|
|
val solver = CombinedTypeSolver(
|
|
ClassLoaderTypeSolver(ClassLoader.getPlatformClassLoader()),
|
|
JavaParserTypeSolver(module.sources)
|
|
)
|
|
for (dependency in module.transitiveDependencies) {
|
|
solver.add(JavaParserTypeSolver(dependency.sources))
|
|
}
|
|
|
|
val config = ParserConfiguration()
|
|
.setLanguageLevel(ParserConfiguration.LanguageLevel.JAVA_11)
|
|
.setSymbolResolver(JavaSymbolSolver(solver))
|
|
|
|
val root = SourceRoot(module.sources, config)
|
|
root.printer = printer
|
|
|
|
val results = root.tryToParseParallelized()
|
|
for (result in results) {
|
|
require(result.isSuccessful) { result }
|
|
}
|
|
|
|
return Library(module.name, root)
|
|
}
|
|
|
|
private fun stripNewlineAfterPcAnnotation(s: String): String {
|
|
return s.replace(PC_ANNOTATION_REGEX, "@Pc($1) ")
|
|
}
|
|
}
|
|
}
|
|
|