11package com.strumenta.kolasu.languageserver.plugin
22
3+ import com.github.jengelman.gradle.plugins.shadow.ShadowBasePlugin
34import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
45import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
56import org.gradle.api.Action
67import org.gradle.api.Plugin
78import 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
814import org.gradle.configurationcache.extensions.capitalized
15+ import org.gradle.jvm.tasks.Jar
916import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin
1017import org.jetbrains.kotlin.konan.file.File
1118import java.nio.file.Files
@@ -14,7 +21,9 @@ import java.nio.file.StandardCopyOption
1421import java.util.Locale
1522
1623class 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