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())