diff --git a/build.gradle.kts b/build.gradle.kts index fd9b13534..3b2663f07 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -343,7 +343,10 @@ val generateNbttParser by parser("NbttParser", "com/demonwav/mcdev/nbt/lang/gen" val generateLangLexer by lexer("LangLexer", "com/demonwav/mcdev/translations/lang/gen") val generateLangParser by parser("LangParser", "com/demonwav/mcdev/translations/lang/gen") -val generateTranslationTemplateLexer by lexer("TranslationTemplateLexer", "com/demonwav/mcdev/translations/lang/gen") +val generateTranslationTemplateLexer by lexer( + "TranslationTemplateLexer", + "com/demonwav/mcdev/translations/template/gen" +) val generate by tasks.registering { group = "minecraft" diff --git a/buildSrc/src/main/kotlin/JFlexExec.kt b/buildSrc/src/main/kotlin/JFlexExec.kt new file mode 100644 index 000000000..dca469daa --- /dev/null +++ b/buildSrc/src/main/kotlin/JFlexExec.kt @@ -0,0 +1,84 @@ +/* + * Minecraft Development for IntelliJ + * + * https://mcdev.io/ + * + * Copyright (C) 2024 minecraft-dev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, version 3.0 only. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import java.io.ByteArrayOutputStream +import javax.inject.Inject +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.ConfigurableFileTree +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.FileCollection +import org.gradle.api.file.FileSystemOperations +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.JavaExec +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.OutputFile + +abstract class JFlexExec : JavaExec() { + + @get:InputFile + abstract val sourceFile: RegularFileProperty + + @get:InputFiles + abstract val jflex: ConfigurableFileCollection + + @get:InputFile + abstract val skeletonFile: RegularFileProperty + + @get:OutputDirectory + abstract val destinationDirectory: DirectoryProperty + + @get:OutputFile + abstract val destinationFile: RegularFileProperty + + @get:Internal + abstract val logFile: RegularFileProperty + + @get:Inject + abstract val fs: FileSystemOperations + + init { + mainClass.set("jflex.Main") + } + + override fun exec() { + classpath = jflex + + args( + "--skel", skeletonFile.get().asFile.absolutePath, + "-d", destinationDirectory.get().asFile.absolutePath, + sourceFile.get().asFile.absolutePath + ) + + fs.delete { delete(destinationDirectory) } + + val taskOutput = ByteArrayOutputStream() + standardOutput = taskOutput + errorOutput = taskOutput + + super.exec() + + val log = logFile.get().asFile + log.parentFile.mkdirs() + log.writeBytes(taskOutput.toByteArray()) + } +} diff --git a/buildSrc/src/main/kotlin/ParserExec.kt b/buildSrc/src/main/kotlin/ParserExec.kt new file mode 100644 index 000000000..adb38256d --- /dev/null +++ b/buildSrc/src/main/kotlin/ParserExec.kt @@ -0,0 +1,88 @@ +/* + * Minecraft Development for IntelliJ + * + * https://mcdev.io/ + * + * Copyright (C) 2024 minecraft-dev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, version 3.0 only. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +import java.io.ByteArrayOutputStream +import javax.inject.Inject +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.FileSystemOperations +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.JavaExec +import org.gradle.api.tasks.OutputDirectory + +abstract class ParserExec : JavaExec() { + + @get:InputFile + abstract val sourceFile: RegularFileProperty + + @get:InputFiles + abstract val grammarKit: ConfigurableFileCollection + + @get:OutputDirectory + abstract val destinationRootDirectory: DirectoryProperty + + @get:OutputDirectory + abstract val destinationDirectory: DirectoryProperty + + @get:OutputDirectory + abstract val psiDirectory: DirectoryProperty + + @get:OutputDirectory + abstract val parserDirectory: DirectoryProperty + + @get:Internal + abstract val logFile: RegularFileProperty + + @get:Inject + abstract val fs: FileSystemOperations + + init { + mainClass.set("org.intellij.grammar.Main") + + jvmArgs( + "--add-opens", "java.base/java.lang=ALL-UNNAMED", + "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", + "--add-opens", "java.base/java.util=ALL-UNNAMED" + ) + } + + override fun exec() { + classpath = grammarKit + args( + destinationRootDirectory.get().asFile, + sourceFile.get().asFile + ) + + fs.delete { delete(psiDirectory, parserDirectory) } + + val taskOutput = ByteArrayOutputStream() + standardOutput = taskOutput + errorOutput = taskOutput + + super.exec() + + val log = logFile.get().asFile + log.parentFile.mkdirs() + log.writeBytes(taskOutput.toByteArray()) + } +} diff --git a/buildSrc/src/main/kotlin/util.kt b/buildSrc/src/main/kotlin/util.kt index 054a24cf7..7a6623b23 100644 --- a/buildSrc/src/main/kotlin/util.kt +++ b/buildSrc/src/main/kotlin/util.kt @@ -32,94 +32,42 @@ import org.gradle.kotlin.dsl.configure typealias TaskDelegate = RegisteringDomainObjectDelegateProviderWithTypeAndAction -fun Project.lexer(flex: String, pack: String): TaskDelegate { +fun Project.lexer(flex: String, pack: String): TaskDelegate { configure { exclude(pack.removeSuffix("/") + "/**") } - return tasks.registering(JavaExec::class) { - val src = layout.projectDirectory.file("src/main/grammars/$flex.flex") - val dst = layout.buildDirectory.dir("gen/$pack") - val output = layout.buildDirectory.file("gen/$pack/$flex.java") - val logOutout = layout.buildDirectory.file("logs/generate$flex.log") + return tasks.registering(JFlexExec::class) { + sourceFile.set(layout.projectDirectory.file("src/main/grammars/$flex.flex")) + destinationDirectory.set(layout.buildDirectory.dir("gen/$pack")) + destinationFile.set(layout.buildDirectory.file("gen/$pack/$flex.java")) + logFile.set(layout.buildDirectory.file("logs/generate$flex.log")) val jflex by project.configurations - val jflexSkeleton by project.configurations - - classpath = jflex - mainClass.set("jflex.Main") - - val taskOutput = ByteArrayOutputStream() - standardOutput = taskOutput - errorOutput = taskOutput - - doFirst { - args( - "--skel", jflexSkeleton.singleFile.absolutePath, - "-d", dst.get().asFile.absolutePath, - src.asFile.absolutePath - ) - - // Delete current lexer - project.delete(output) - logOutout.get().asFile.parentFile.mkdirs() - } - - doLast { - logOutout.get().asFile.writeBytes(taskOutput.toByteArray()) - } + this.jflex.setFrom(jflex) - inputs.files(src, jflexSkeleton) - outputs.file(output) + val jflexSkeleton by project.configurations + skeletonFile.set(jflexSkeleton.singleFile) } } -fun Project.parser(bnf: String, pack: String): TaskDelegate { +fun Project.parser(bnf: String, pack: String): TaskDelegate { configure { exclude(pack.removeSuffix("/") + "/**") } - return tasks.registering(JavaExec::class) { - val src = project.layout.projectDirectory.file("src/main/grammars/$bnf.bnf") - val dstRoot = project.layout.buildDirectory.dir("gen") - val dst = dstRoot.map { it.dir(pack) } - val psiDir = dst.map { it.dir("psi") } - val parserDir = dst.map { it.dir("parser") } - val logOutout = layout.buildDirectory.file("logs/generate$bnf.log") + return tasks.registering(ParserExec::class) { + val destRoot = project.layout.buildDirectory.dir("gen") + val dest = destRoot.map { it.dir(pack) } + sourceFile.set(project.layout.projectDirectory.file("src/main/grammars/$bnf.bnf")) + destinationRootDirectory.set(destRoot) + destinationDirectory.set(dest) + psiDirectory.set(dest.map { it.dir("psi") }) + parserDirectory.set(dest.map { it.dir("parser") }) + logFile.set(layout.buildDirectory.file("logs/generate$bnf.log")) val grammarKit by project.configurations - - val taskOutput = ByteArrayOutputStream() - standardOutput = taskOutput - errorOutput = taskOutput - - classpath = grammarKit - mainClass.set("org.intellij.grammar.Main") - - if (JavaVersion.current().isJava9Compatible) { - jvmArgs( - "--add-opens", "java.base/java.lang=ALL-UNNAMED", - "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", - "--add-opens", "java.base/java.util=ALL-UNNAMED" - ) - } - - doFirst { - project.delete(psiDir, parserDir) - args(dstRoot.get().asFile, src.asFile) - logOutout.get().asFile.parentFile.mkdirs() - } - doLast { - logOutout.get().asFile.writeBytes(taskOutput.toByteArray()) - } - - inputs.file(src) - outputs.dirs( - mapOf( - "psi" to psiDir, - "parser" to parserDir - ) - ) + this.grammarKit.setFrom(grammarKit) } } diff --git a/src/main/grammars/TranslationTemplateLexer.flex b/src/main/grammars/TranslationTemplateLexer.flex index b71ef2bc8..ba1831dcb 100644 --- a/src/main/grammars/TranslationTemplateLexer.flex +++ b/src/main/grammars/TranslationTemplateLexer.flex @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -package com.demonwav.mcdev.translations.lang.gen; +package com.demonwav.mcdev.translations.template.gen; import com.intellij.lexer.*; import com.intellij.psi.tree.IElementType; diff --git a/src/main/kotlin/translations/sorting/TranslationTemplateLexerAdapter.kt b/src/main/kotlin/translations/sorting/TranslationTemplateLexerAdapter.kt index ad69540c4..b7413c898 100644 --- a/src/main/kotlin/translations/sorting/TranslationTemplateLexerAdapter.kt +++ b/src/main/kotlin/translations/sorting/TranslationTemplateLexerAdapter.kt @@ -20,7 +20,7 @@ package com.demonwav.mcdev.translations.sorting -import com.demonwav.mcdev.translations.lang.gen.TranslationTemplateLexer +import com.demonwav.mcdev.translations.template.gen.TranslationTemplateLexer import com.intellij.lexer.FlexAdapter class TranslationTemplateLexerAdapter : FlexAdapter(TranslationTemplateLexer())