@@ -7,14 +7,24 @@ plugins {
77 alias(libs.plugins.kotlin)
88 alias(libs.plugins.serialization)
99 alias(libs.plugins.ksp)
10+ alias(libs.plugins.ktreesitter)
1011 idea
11- id(" com.github.johnrengelman. shadow" ) version " 8.1.1 "
12+ id(" com.gradleup. shadow" ) version " 9.2.0 "
1213}
1314
1415ksp { arg(" verbose" , " true" ) }
1516
17+ val grammarDir = layout.projectDirectory.dir(" tree-sitter-javascript" ).asFile
18+
19+ grammar {
20+ grammarName.set(" javascript" )
21+ baseDir.set(grammarDir)
22+ className.set(" TreeSitterJavascript" )
23+ packageName.set(" io.github.tritium_launcher.launcher.ui.project.editor.treesitter.grammar" )
24+ }
25+
1626group = " io.github.tritium_launcher.launcher"
17- version = " 0.1.5 "
27+ version = " 0.1.6 "
1828val tritiumVersion = project.version.toString()
1929
2030val os: OperatingSystem = OperatingSystem .current()
@@ -27,6 +37,8 @@ val qtOs = when {
2737 else -> " unknown"
2838}
2939
40+ dependencyLocking { lockAllConfigurations() }
41+
3042repositories {
3143 mavenCentral()
3244}
@@ -45,9 +57,17 @@ configurations.configureEach {
4557}
4658
4759dependencies {
48- // Kotlin
60+ // Serialization
4961 implementation(libs.kotlinx.serialization.json)
5062 implementation(libs.kotlinx.serialization.hocon)
63+ implementation(libs.kotlinx.serialization.properties)
64+ implementation(libs.kotlin.json5)
65+ implementation(libs.ktoml.core)
66+ implementation(libs.ktoml.file)
67+ implementation(libs.yamlkt)
68+ implementation(libs.knbt)
69+
70+ // Coroutines
5171 implementation(libs.kotlinx.coroutines.core)
5272
5373 // KSP
@@ -82,10 +102,10 @@ dependencies {
82102
83103 // MSAL4j
84104 implementation(libs.msal4j)
105+ implementation(libs.jultoslf4j)
85106
86107 // Logback
87108 implementation(libs.logback.classic)
88- implementation(libs.kotlin.reflect)
89109
90110 // LSP
91111 implementation(libs.lsp4j)
@@ -94,11 +114,88 @@ dependencies {
94114 implementation(libs.jna)
95115 implementation(libs.jna.platform)
96116
117+ // CommonMark
118+ implementation(libs.commonmark)
119+ implementation(libs.commonmark.ext.gfm.tables)
120+ implementation(libs.commonmark.ext.gfm.strikethrough)
121+ implementation(libs.commonmark.ext.task.list.items)
122+ implementation(libs.commonmark.ext.image.attributes)
123+ implementation(libs.sqlite.jdbc)
124+ implementation(libs.flatbuffers)
125+
126+ // Kotlin
127+ implementation(libs.kotlin.reflect)
128+
129+ // KTreeSitter
130+ implementation(libs.ktreesitter)
131+
97132 /* Test */
98133
99134 testImplementation(libs.bundles.test)
100135}
101136
137+ val nativeLibDir = layout.buildDirectory.dir(" native/grammar" )
138+ val generatedGrammarDir = layout.buildDirectory.dir(" generated" )
139+ val grammarCmakeLists = generatedGrammarDir.map { it.file(" CMakeLists.txt" ) }
140+ val grammarSourceDir = layout.projectDirectory.dir(" tree-sitter-javascript/src" )
141+ val nativeGrammarLibName: String = when {
142+ os.isWindows -> " ktreesitter-javascript.dll"
143+ os.isMacOsX -> " libktreesitter-javascript.dylib"
144+ else -> " libktreesitter-javascript.so"
145+ }
146+
147+ val patchCmakeLists by tasks.registering {
148+ description = " Fix CMakeLists.txt include path for tree-sitter header"
149+ dependsOn(tasks.named(" generateGrammarFiles" ))
150+ inputs.file(grammarCmakeLists)
151+ outputs.file(grammarCmakeLists)
152+ doLast {
153+ val cmakeFile = grammarCmakeLists.get().asFile
154+ val content = cmakeFile.readText().replace(' \\ ' , ' /' )
155+ val fixed = content.replace(
156+ " ../../tree-sitter-javascript/bindings/c" ,
157+ " ../../tree-sitter-javascript/bindings/c ../../tree-sitter-javascript/bindings/c/tree_sitter"
158+ )
159+ if (fixed != content) {
160+ cmakeFile.writeText(fixed)
161+ }
162+ }
163+ }
164+
165+ val compileGrammarNative by tasks.registering {
166+ description = " Compile tree-sitter JavaScript grammar via CMake"
167+ dependsOn(tasks.named(" generateGrammarFiles" ), patchCmakeLists)
168+ val cmakeBuildDir = nativeLibDir.get().asFile
169+ val srcDir = generatedGrammarDir.get().asFile
170+ inputs.dir(grammarSourceDir).optional()
171+ inputs.dir(srcDir.resolve(" src/jni" ))
172+ inputs.file(srcDir.resolve(" CMakeLists.txt" ))
173+ outputs.file(cmakeBuildDir.resolve(nativeGrammarLibName))
174+ onlyIf {
175+ grammarSourceDir.asFile.exists()
176+ }
177+ doLast {
178+ cmakeBuildDir.mkdirs()
179+ val javaHome = System .getProperty(" java.home" )
180+ val cmakeEnv = mapOf (" JAVA_HOME" to javaHome)
181+ val configure = ProcessBuilder (" cmake" , srcDir.path, " -DCMAKE_BUILD_TYPE=Release" )
182+ .directory(cmakeBuildDir)
183+ .inheritIO()
184+ .apply { environment().putAll(cmakeEnv) }
185+ .start()
186+ if (configure.waitFor() != 0 ) {
187+ throw GradleException (" cmake configuration failed for tree-sitter-javascript grammar" )
188+ }
189+ val build = ProcessBuilder (" cmake" , " --build" , " ." , " --target" , " ktreesitter-javascript" , " --parallel" )
190+ .directory(cmakeBuildDir)
191+ .inheritIO()
192+ .start()
193+ if (build.waitFor() != 0 ) {
194+ throw GradleException (" cmake build failed for tree-sitter-javascript grammar" )
195+ }
196+ }
197+ }
198+
102199sourceSets[" main" ].java.srcDirs(" src/main/kotlin" )
103200
104201idea {
@@ -113,10 +210,29 @@ tasks.test {
113210}
114211
115212tasks.processResources {
213+ dependsOn(compileGrammarNative)
214+
215+ val nativeSubdir = when {
216+ os.isWindows -> if (isArm64) " windows/arm64" else " windows/x64"
217+ os.isMacOsX -> if (isArm64) " macos/arm64" else " macos/x64"
218+ else -> if (isArm64) " linux/arm64" else " linux/x64"
219+ }
220+
221+ doFirst {
222+ val libFile = nativeLibDir.get().file(nativeGrammarLibName).asFile
223+ if (! libFile.exists()) {
224+ logger.warn(" Native grammar library not found at ${libFile} ; JS syntax highlighting disabled" )
225+ }
226+ }
227+
116228 inputs.property(" version" , tritiumVersion)
117229 filesMatching(" version.txt" ) {
118230 expand(" version" to tritiumVersion)
119231 }
232+
233+ from(nativeLibDir.map { it.file(nativeGrammarLibName) }) {
234+ into(" lib/$nativeSubdir " )
235+ }
120236}
121237
122238tasks.jar {
@@ -154,7 +270,17 @@ val preparePackageInput by tasks.registering(Sync::class) {
154270val compileKotlin: KotlinCompile by tasks
155271compileKotlin.apply {
156272 compilerOptions {
157- freeCompilerArgs.set( listOf ( " -Xcontext-parameters " ))
158- allWarningsAsErrors = true
273+ incremental = true
274+ freeCompilerArgs.set( listOf ( " -Xcontext-parameters " , " -progressive " ))
159275 }
160276}
277+
278+ val compileJava: JavaCompile by tasks
279+ compileJava.apply {
280+ options.isIncremental = true
281+ }
282+
283+ tasks.clean {
284+ delete(nativeLibDir)
285+ delete(generatedGrammarDir)
286+ }
0 commit comments