[Doctools] Read source files for command ordering

This commit is contained in:
Kenzie Togami 2019-08-13 20:06:15 -07:00
parent 487da77a72
commit a0b9810c44
No known key found for this signature in database
GPG Key ID: 5D200B325E157A81
2 changed files with 17 additions and 7 deletions

View File

@ -14,4 +14,5 @@
"implementation"(project(":worldedit-libs:core:ap")) "implementation"(project(":worldedit-libs:core:ap"))
"implementation"(project(":worldedit-core")) "implementation"(project(":worldedit-core"))
"implementation"(kotlin("stdlib-jdk8")) "implementation"(kotlin("stdlib-jdk8"))
"implementation"(kotlin("reflect"))
} }

View File

@ -48,10 +48,10 @@
import java.nio.file.Paths import java.nio.file.Paths
import java.util.stream.Stream import java.util.stream.Stream
import kotlin.streams.toList import kotlin.streams.toList
import org.enginehub.piston.annotation.Command as CommandAnnotation
class DocumentationPrinter private constructor() { class DocumentationPrinter private constructor() {
private val nameRegex = Regex("name = \"(.+?)\"")
private val serializer = PlainComponentSerializer({ "" }, TranslatableComponent::key) private val serializer = PlainComponentSerializer({ "" }, TranslatableComponent::key)
private val commands = WorldEdit.getInstance().platformManager.platformCommandManager.commandManager.allCommands private val commands = WorldEdit.getInstance().platformManager.platformCommandManager.commandManager.allCommands
.map { it.name to it }.toList().toMap() .map { it.name to it }.toList().toMap()
@ -59,10 +59,19 @@ class DocumentationPrinter private constructor() {
private val permsOutput = StringBuilder() private val permsOutput = StringBuilder()
private suspend inline fun <reified T> SequenceScope<String>.yieldAllCommandsIn() { private suspend inline fun <reified T> SequenceScope<String>.yieldAllCommandsIn() {
for (method in T::class.java.methods) { val sourceFile = Paths.get("worldedit-core/src/main/java/" + T::class.qualifiedName!!.replace('.', '/') + ".java")
val cmdAnno = method.getDeclaredAnnotation(CommandAnnotation::class.java) require(Files.exists(sourceFile)) { "Source not found for ${T::class.qualifiedName}"}
if (cmdAnno != null) { Files.newBufferedReader(sourceFile).useLines { lines ->
yield(cmdAnno.name) var inCommand = false
for (line in lines) {
if (inCommand) {
when (val match = nameRegex.find(line)) {
null -> if (line.trim() == ")") inCommand = false
else -> yield(match.groupValues[1])
}
} else if (line.contains("@Command(")) {
inCommand = true
}
} }
} }
} }
@ -219,8 +228,7 @@ private fun dumpSection(title: String, addCommandNames: suspend SequenceScope<St
private fun cmdsToPerms(cmds: List<Command>, prefix: String) { private fun cmdsToPerms(cmds: List<Command>, prefix: String) {
cmds.forEach { c -> cmds.forEach { c ->
permsOutput.append(" ").append(cmdToPerm(prefix, c)).append("\n") permsOutput.append(" ").append(cmdToPerm(prefix, c)).append("\n")
c.parts.filter { p -> p is SubCommandPart } c.parts.filterIsInstance<SubCommandPart>()
.map { p -> p as SubCommandPart }
.forEach { scp -> .forEach { scp ->
cmdsToPerms(scp.commands.sortedBy { it.name }, prefix + c.name + " ") cmdsToPerms(scp.commands.sortedBy { it.name }, prefix + c.name + " ")
} }
@ -260,6 +268,7 @@ private fun writeCommandBlock(command: Command, prefix: String, parents: Stream<
cmdOutput.appendln() cmdOutput.appendln()
for ((k, v) in entries) { for ((k, v) in entries) {
val rstSafe = v.replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2)) val rstSafe = v.replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2))
.lineSequence().map { line -> line.ifBlank { "" } }.joinToString(separator = "\n")
cmdOutput.append(" ".repeat(2)) cmdOutput.append(" ".repeat(2))
.append(k) .append(k)
.append(",") .append(",")