Skip to content

Commit 210d7f6

Browse files
committed
#84 Pass the URI of the file as a Source to the parser
#85 Register a separate shadow task to avoid conflicting with the base one
1 parent bba63ae commit 210d7f6

2 files changed

Lines changed: 54 additions & 18 deletions

File tree

library/src/main/kotlin/com/strumenta/kolasu/languageserver/KolasuServer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.strumenta.kolasu.model.Node
55
import com.strumenta.kolasu.model.Point
66
import com.strumenta.kolasu.model.PossiblyNamed
77
import com.strumenta.kolasu.model.ReferenceByName
8+
import com.strumenta.kolasu.model.URLSource
89
import com.strumenta.kolasu.model.children
910
import com.strumenta.kolasu.model.kReferenceByNameProperties
1011
import com.strumenta.kolasu.parsing.ASTParser
@@ -269,7 +270,7 @@ open class KolasuServer<T : Node>(
269270
text: String
270271
) {
271272

272-
val parsingResult = parser?.parse(text) ?: return
273+
val parsingResult = parser?.parse(text, source = URLSource(URI.create(uri).toURL())) ?: return
273274
files[uri] = parsingResult
274275

275276
val tree = parsingResult.root ?: return

plugin/src/main/kotlin/com/strumenta/kolasu/languageserver/plugin/LanguageServerPlugin.kt

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.strumenta.kolasu.languageserver.plugin
22

3+
import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin
34
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
45
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
56
import org.gradle.api.Action
67
import org.gradle.api.Plugin
78
import org.gradle.api.Project
9+
import org.gradle.api.Task
10+
import org.gradle.api.logging.Logger
11+
import org.gradle.api.logging.Logging
12+
import org.gradle.api.plugins.JavaPluginExtension
13+
import org.gradle.api.tasks.TaskProvider
814
import org.gradle.configurationcache.extensions.capitalized
15+
import org.gradle.jvm.tasks.Jar
916
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin
1017
import org.jetbrains.kotlin.konan.file.File
1118
import java.nio.file.Files
@@ -14,7 +21,9 @@ import java.nio.file.StandardCopyOption
1421
import java.util.Locale
1522

1623
class LanguageServerPlugin : Plugin<Project?> {
24+
private val logger: Logger = Logging.getLogger(javaClass)
1725
private lateinit var configuration: Configuration
26+
val SHADOW_JAR_TASK_NAME = "kolasuLanguageServerJar"
1827

1928
override fun apply(project: Project?) {
2029
if (project == null) return
@@ -49,7 +58,7 @@ class LanguageServerPlugin : Plugin<Project?> {
4958
configuration.fileExtensions = mutableListOf(language)
5059
configuration.editor = "code"
5160
configuration.textmateGrammarScope = "main"
52-
configuration.serverJarPath = Paths.get(projectPath, "build", "libs", "$language.jar")
61+
configuration.serverJarPath = Paths.get(projectPath, "build", "libs", "$language-server.jar")
5362
configuration.examplesPath = Paths.get(project.rootDir.toString(), "examples")
5463
configuration.entryPointPath =
5564
Paths.get(
@@ -74,22 +83,48 @@ class LanguageServerPlugin : Plugin<Project?> {
7483
configuration.debugPort = null
7584
configuration.suspendExecutionUntilDebuggerAttached = false
7685

77-
val shadowJar = project.tasks.getByName("shadowJar") as ShadowJar
78-
shadowJar.manifest.attributes["Main-Class"] = "com.strumenta.$language.languageserver.MainKt"
79-
shadowJar.manifest.attributes["Multi-Release"] = "true"
80-
shadowJar.manifest.attributes["Class-Path"] =
81-
"lucene-core-${BuildConfig.LUCENE_VERSION}.jar lucene-codecs-${BuildConfig.LUCENE_VERSION}.jar"
82-
shadowJar.archiveFileName.set("$language.jar")
83-
shadowJar.excludes.add("org/apache/lucene/**/*")
86+
val shadowJar = configureShadowTask(project, language)
8487

8588
val testTask = project.tasks.getByName("test") as org.gradle.api.tasks.testing.Test
8689
testTask.useJUnitPlatform()
8790

88-
addCreateVscodeExtensionTask(project)
89-
addLaunchVscodeEditorTask(project)
91+
val createVscodeExtensionTask = addCreateVscodeExtensionTask(project, shadowJar)
92+
addLaunchVscodeEditorTask(project, createVscodeExtensionTask)
9093
}
9194

92-
private fun addLaunchVscodeEditorTask(project: Project) {
95+
protected fun configureShadowTask(project: Project, language: String): TaskProvider<ShadowJar?> {
96+
val convention = project.extensions.getByType(JavaPluginExtension::class.java)
97+
val shadowJar = project.tasks.register(SHADOW_JAR_TASK_NAME, ShadowJar::class.java) { shadowJar ->
98+
// Adapted from ShadowJavaPlugin.configureShadowTask
99+
shadowJar.description = "Create a combined JAR of project and runtime dependencies"
100+
val jarTask = project.tasks.getByName("jar") as Jar
101+
shadowJar.manifest.inheritFrom(jarTask.manifest)
102+
shadowJar.manifest.attributes["Main-Class"] = "com.strumenta.$language.languageserver.MainKt"
103+
shadowJar.manifest.attributes["Multi-Release"] = "true"
104+
shadowJar.manifest.attributes["Class-Path"] =
105+
"lucene-core-${BuildConfig.LUCENE_VERSION}.jar lucene-codecs-${BuildConfig.LUCENE_VERSION}.jar"
106+
shadowJar.archiveFileName.set("$language-server.jar")
107+
shadowJar.excludes.add("org/apache/lucene/**/*")
108+
shadowJar.archiveClassifier.set("all")
109+
shadowJar.from(convention.sourceSets.getByName("main").output)
110+
shadowJar.configurations = listOf(
111+
project.configurations.findByName("runtimeClasspath") ?: project.configurations.findByName("runtime")
112+
)
113+
114+
shadowJar.exclude(
115+
"META-INF/INDEX.LIST",
116+
"META-INF/*.SF",
117+
"META-INF/*.DSA",
118+
"META-INF/*.RSA",
119+
"module-info.class",
120+
)
121+
shadowJar.dependencies { d -> d.exclude(d.dependency(project.dependencies.gradleApi())) }
122+
}
123+
project.artifacts.add(ShadowBasePlugin.CONFIGURATION_NAME, shadowJar)
124+
return shadowJar
125+
}
126+
127+
private fun addLaunchVscodeEditorTask(project: Project, createVscodeExtensionTask: Task) {
93128
project.tasks.create("launchVscodeEditor").apply {
94129
group = "language server"
95130
description = "Launch the configured vscode editor with the language server installed (defaults to code)"
@@ -104,7 +139,7 @@ class LanguageServerPlugin : Plugin<Project?> {
104139
}
105140
}
106141
)
107-
dependsOn(project.tasks.getByName("createVscodeExtension"))
142+
dependsOn(createVscodeExtensionTask)
108143
}
109144
}
110145

@@ -117,8 +152,8 @@ class LanguageServerPlugin : Plugin<Project?> {
117152
).directory(project.projectDir).start().waitFor()
118153
}
119154

120-
private fun addCreateVscodeExtensionTask(project: Project) {
121-
project.tasks.create("createVscodeExtension").apply {
155+
private fun addCreateVscodeExtensionTask(project: Project, shadowJarTask: TaskProvider<*>): Task {
156+
return project.tasks.create("createVscodeExtension").apply {
122157
group = "language server"
123158
description = "Create language server extension folder for vscode under build/vscode"
124159
actions =
@@ -132,7 +167,7 @@ class LanguageServerPlugin : Plugin<Project?> {
132167
}
133168
}
134169
)
135-
dependsOn(project.tasks.getByName("shadowJar"))
170+
dependsOn(shadowJarTask)
136171
inputs.files(
137172
configuration.entryPointPath,
138173
configuration.textmateGrammarPath,
@@ -147,11 +182,11 @@ class LanguageServerPlugin : Plugin<Project?> {
147182
}
148183

149184
fun isWindows(): Boolean {
150-
return System.getProperty("os.name").toLowerCase().contains("win")
185+
return System.getProperty("os.name").lowercase().contains("win")
151186
}
152187

153188
private fun createVscodeExtension(project: Project) {
154-
val shadowJar = project.tasks.getByName("shadowJar") as ShadowJar
189+
val shadowJar = project.tasks.getByName(SHADOW_JAR_TASK_NAME) as ShadowJar
155190
val entryPoint = shadowJar.manifest.attributes["Main-Class"] as String
156191
if (entryPoint == "com.strumenta.${configuration.language}.languageserver.MainKt") {
157192
if (!Files.exists(configuration.entryPointPath)) {

0 commit comments

Comments
 (0)