From 34d1fb3ccabbb32d6f9d8320abff2853cf99dbf7 Mon Sep 17 00:00:00 2001 From: fwcd Date: Sun, 12 May 2019 22:42:13 +0200 Subject: [PATCH 01/14] Update the Gradle wrapper to 5.4.1 This commit updates the wrapper, but does not build correctly yet due to the way Kotlin compiler libraries are resolved. To address this issue, the previous mechanism of copying the dependent libraries into a local folder from which they are included has to be updated. Since depending on JAR files is non-ideal, a better solution would be to find the (correctly packaged) libraries on a Maven repository and include them. --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bf3de2183..f4d7b2bf6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 63cc9beff18d283daed1365e6d076840b9c86375 Mon Sep 17 00:00:00 2001 From: fwcd Date: Sun, 12 May 2019 22:58:56 +0200 Subject: [PATCH 02/14] Update Kotlin to 1.3.3x Updates the Kotlin version of the language server to 1.3.3x --- gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 96e6215c0..3f7463a8d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ teamCityUrl=https://teamcity.jetbrains.com teamCityUsername=guest teamCityPassword=guest -kotlinVersion=1.3.11 -kotlinBuildType=Kotlin_130_CompilerAllPlugins -kotlinBuild=1.3.11-release-272 -kotlinPluginBuild=1.3.11-release-IJ2018.3-1 +kotlinVersion=1.3.30 +kotlinBuildType=Kotlin_1330_CompilerAllPlugins +kotlinBuild=1.3.31-release-198 +kotlinPluginBuild=1.3.31-release-IJ2019.1-1 From 3b20ec88781dc00361111f51d25e43651d5fa952 Mon Sep 17 00:00:00 2001 From: fwcd Date: Sun, 12 May 2019 23:10:19 +0200 Subject: [PATCH 03/14] Update TeamCity plugin to 0.19 Updates the Gradle-TeamCity plugin to 0.19 for Gradle 5 support. --- server/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/build.gradle b/server/build.gradle index 781ae49ef..9933007df 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -1,6 +1,6 @@ plugins { id 'application' - id 'com.github.jk1.tcdeps' version '0.17' + id 'com.github.jk1.tcdeps' version '0.19' id 'com.jaredsburrows.license' version '0.8.42' } From 844699d47747f6183eb6591375647f018d8d840f Mon Sep 17 00:00:00 2001 From: fwcd Date: Sun, 12 May 2019 23:41:05 +0200 Subject: [PATCH 04/14] Add scripting compiler as a dependency Adds the kotlin-scripting-compiler to the classpath since CliScriptDefinitionProvider has been moved to this package. --- server/build.gradle | 1 + server/src/main/kotlin/org/javacs/kt/Compiler.kt | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index 9933007df..919768ad9 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -37,6 +37,7 @@ dependencies { implementation 'com.google.guava:guava:21.0' implementation 'org.eclipse.lsp4j:org.eclipse.lsp4j:0.5.0' implementation "org.jetbrains.kotlin:kotlin-compiler:$kotlinVersion" + implementation "org.jetbrains.kotlin:kotlin-scripting-compiler:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" implementation 'org.jetbrains:fernflower:1.0' diff --git a/server/src/main/kotlin/org/javacs/kt/Compiler.kt b/server/src/main/kotlin/org/javacs/kt/Compiler.kt index 0f223df85..665d12a2e 100644 --- a/server/src/main/kotlin/org/javacs/kt/Compiler.kt +++ b/server/src/main/kotlin/org/javacs/kt/Compiler.kt @@ -6,7 +6,7 @@ import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiFileFactory import com.intellij.mock.MockProject -import org.jetbrains.kotlin.cli.common.script.CliScriptDefinitionProvider +import org.jetbrains.kotlin.scripting.legacy.CliScriptDefinitionProvider import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles @@ -68,10 +68,10 @@ class Compiler(classPath: Set) { private val parser = KtPsiFactory(environment.project) private val localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL) - private val scripts = ScriptDefinitionProvider.getInstance(environment.project) as CliScriptDefinitionProvider + private val scripts = ScriptDefinitionProvider.getInstance(environment.project) as? CliScriptDefinitionProvider init { - scripts.setScriptDefinitions(listOf(KotlinScriptDefinition(Any::class))) + scripts?.setScriptDefinitions(listOf(KotlinScriptDefinition(Any::class))) } fun createFile(content: String, file: Path = Paths.get("dummy.kt")): KtFile { From 4df20d477587ad4a55900a25b2364c6cfcf817a5 Mon Sep 17 00:00:00 2001 From: fwcd Date: Mon, 13 May 2019 01:06:44 +0200 Subject: [PATCH 05/14] WIP: Update ScriptDefinitionProvider Updates the script (and script dependencies) provider to the most recent API. The issue that no declarators can be found for SCRIPT declarations persists however (this can be verified using the EditFunctionTest). --- gradle.properties | 2 +- server/build.gradle | 10 +++++++--- server/src/main/kotlin/org/javacs/kt/Compiler.kt | 10 ++++++++-- .../src/main/kotlin/org/javacs/kt/CompilerClassPath.kt | 4 ++-- .../src/test/kotlin/org/javacs/kt/CompiledFileTest.kt | 4 ++-- server/src/test/kotlin/org/javacs/kt/CompilerTest.kt | 4 ++-- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3f7463a8d..582e602bd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ teamCityUrl=https://teamcity.jetbrains.com teamCityUsername=guest teamCityPassword=guest -kotlinVersion=1.3.30 +kotlinVersion=1.3.31 kotlinBuildType=Kotlin_1330_CompilerAllPlugins kotlinBuild=1.3.31-release-198 kotlinPluginBuild=1.3.31-release-IJ2019.1-1 diff --git a/server/build.gradle b/server/build.gradle index 919768ad9..ef0411c7f 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -31,7 +31,8 @@ configurations { } dependencies { - def kotlinTeamCity = "$kotlinBuildType:$kotlinBuild:kotlin-plugin-${kotlinPluginBuild}.zip!/Kotlin" + def kotlinCompilerTC = "$kotlinBuildType:$kotlinBuild:kotlin-compiler-${kotlinVersion}.zip!/kotlinc" + def kotlinPluginTC = "$kotlinBuildType:$kotlinBuild:kotlin-plugin-${kotlinPluginBuild}.zip!/Kotlin" implementation project(':shared') implementation 'com.google.guava:guava:21.0' @@ -43,8 +44,11 @@ dependencies { implementation fileTree(dir: "$projectDir/lib-kotlin", include: ["*.jar"]) - kotlinJVMLib tc("$kotlinTeamCity/lib/kotlin-plugin.jar") - kotlinJVMLib tc("$kotlinTeamCity/lib/j2k.jar") + kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-impl.jar") + // TODO: The dependency above will be renamed in Kotlin 1.3.50: + // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-compiler-impl.jar") + kotlinJVMLib tc("$kotlinPluginTC/lib/kotlin-plugin.jar") + kotlinJVMLib tc("$kotlinPluginTC/lib/j2k.jar") } applicationDistribution.into('bin') { diff --git a/server/src/main/kotlin/org/javacs/kt/Compiler.kt b/server/src/main/kotlin/org/javacs/kt/Compiler.kt index 665d12a2e..5b5dfa84c 100644 --- a/server/src/main/kotlin/org/javacs/kt/Compiler.kt +++ b/server/src/main/kotlin/org/javacs/kt/Compiler.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiFileFactory import com.intellij.mock.MockProject import org.jetbrains.kotlin.scripting.legacy.CliScriptDefinitionProvider +import org.jetbrains.kotlin.scripting.legacy.CliScriptDependenciesProvider import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles @@ -30,6 +31,8 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProvid import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.script.ScriptDefinitionProvider +import org.jetbrains.kotlin.script.ScriptDependenciesProvider +import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices import org.jetbrains.kotlin.util.KotlinFrontEndException @@ -45,10 +48,11 @@ import org.javacs.kt.util.LoggingMessageCollector * Incrementally compiles files and expressions. * The basic strategy for compiling one file at-a-time is outlined in OneFilePerformance. */ -class Compiler(classPath: Set) { +class Compiler(classPath: Set, workspaceRoots: Set) { private val config = CompilerConfiguration().apply { put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, LoggingMessageCollector) + put(JVMConfigurationKeys.SCRIPT_DEFINITIONS, listOf(StandardScriptDefinition)) addJvmClasspathRoots(classPath.map { it.toFile() }) } val environment: KotlinCoreEnvironment @@ -62,6 +66,8 @@ class Compiler(classPath: Set) { ) val project = environment.project if (project is MockProject) { + project.registerService(ScriptDefinitionProvider::class.java, CliScriptDefinitionProvider()) + project.registerService(ScriptDependenciesProvider::class.java, CliScriptDependenciesProvider(project)) project.registerService(NullableNotNullManager::class.java, KotlinNullableNotNullManager(project)) } } @@ -71,7 +77,7 @@ class Compiler(classPath: Set) { private val scripts = ScriptDefinitionProvider.getInstance(environment.project) as? CliScriptDefinitionProvider init { - scripts?.setScriptDefinitions(listOf(KotlinScriptDefinition(Any::class))) + scripts?.setScriptDefinitions(listOf(StandardScriptDefinition)) } fun createFile(content: String, file: Path = Paths.get("dummy.kt")): KtFile { diff --git a/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt b/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt index 952c4182b..542fbbf2f 100644 --- a/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt +++ b/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt @@ -6,7 +6,7 @@ import java.nio.file.Path class CompilerClassPath { private val workspaceRoots = mutableSetOf() private val classPath = mutableSetOf() - var compiler = Compiler(classPath) + var compiler = Compiler(classPath, workspaceRoots) private set private fun refresh() { @@ -21,7 +21,7 @@ class CompilerClassPath { classPath.removeAll(removed) classPath.addAll(added) - compiler = Compiler(classPath) + compiler = Compiler(classPath, workspaceRoots) } } diff --git a/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt b/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt index 98a417161..6c865d5cd 100644 --- a/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt +++ b/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt @@ -9,7 +9,7 @@ class CompiledFileTest { val compiledFile = compileFile() fun compileFile(): CompiledFile { - val compiler = Compiler(setOf()) + val compiler = Compiler(setOf(), setOf()) val file = testResourcesRoot().resolve("compiledFile/CompiledFileExample.kt") val content = Files.readAllLines(file).joinToString("\n") val parse = compiler.createFile(content, file) @@ -24,4 +24,4 @@ class CompiledFileTest { assertThat(type.toString(), equalTo("Int")) } -} \ No newline at end of file +} diff --git a/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt b/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt index b9f4861c2..7f274736d 100644 --- a/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt +++ b/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt @@ -11,7 +11,7 @@ import org.junit.Test import java.nio.file.Files class CompilerTest { - val compiler = Compiler(setOf()) + val compiler = Compiler(setOf(), setOf()) val myTestResources = testResourcesRoot().resolve("compiler") val file = myTestResources.resolve("FileToEdit.kt") val editedText = """ @@ -69,4 +69,4 @@ private class FileToEdit { assertThat(target.name, hasToString("intFunction")) } -} \ No newline at end of file +} From f9f14796e4f91b896670c27359a135157be4011e Mon Sep 17 00:00:00 2001 From: fwcd Date: Wed, 31 Jul 2019 17:00:35 +0300 Subject: [PATCH 06/14] WIP: Upgrade Gradle wrapper to 5.6 Gradle 5.6 introduces interpolated version strings in the 'plugins' block which make it easier to maintain the current Kotlin version in a single place. --- build.gradle | 3 + gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 56177 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 168 +++++++++++------------ settings.gradle | 12 -- 5 files changed, 88 insertions(+), 97 deletions(-) diff --git a/build.gradle b/build.gradle index e69de29bb..39d8f4deb 100644 --- a/build.gradle +++ b/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version "$kotlinVersion" +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a86aa5fbfe90f707c3138408be7c718..29953ea141f55e3b8fc691d31b5ca8816d89fa87 100644 GIT binary patch delta 49492 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 RFWVll$ONUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle index 1a829f23e..69101a5c2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,15 +1,3 @@ -// Workaround, see https://github.com/gradle/gradle/issues/1697#issuecomment-394359260 -// TODO: Variable plugin versions will be supported in Gradle 5.6, see https://github.com/gradle/gradle/issues/1697#issuecomment-506910915 -pluginManagement { - resolutionStrategy { - eachPlugin { - if (requested.id.namespace != null && requested.id.namespace.startsWith("org.jetbrains.kotlin")) { - useVersion kotlinVersion - } - } - } -} - rootProject.name = 'KotlinLanguageServer' include( From b3b0431fe6514c2e6fd99b64670ffdc8d50045fc Mon Sep 17 00:00:00 2001 From: fwcd Date: Wed, 31 Jul 2019 17:27:16 +0300 Subject: [PATCH 07/14] Fix build --- server/build.gradle | 4 ++-- server/src/main/kotlin/org/javacs/kt/Compiler.kt | 8 ++++---- server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index 69dbb04c1..106b1e9d3 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -55,8 +55,8 @@ dependencies { kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-impl.jar") // TODO: The dependency above will be renamed in Kotlin 1.3.50: // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-compiler-impl.jar") - kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-plugin.jar") - kotlinJVMLib tc("$kotlinCompilerTC/lib/j2k.jar") + kotlinJVMLib tc("$kotlinPluginTC/lib/kotlin-plugin.jar") + kotlinJVMLib tc("$kotlinPluginTC/lib/j2k.jar") testImplementation 'org.hamcrest:hamcrest-all:1.3' testImplementation 'junit:junit:4.11' diff --git a/server/src/main/kotlin/org/javacs/kt/Compiler.kt b/server/src/main/kotlin/org/javacs/kt/Compiler.kt index 7fafc4e59..5e2273e9c 100644 --- a/server/src/main/kotlin/org/javacs/kt/Compiler.kt +++ b/server/src/main/kotlin/org/javacs/kt/Compiler.kt @@ -103,10 +103,10 @@ class Compiler(classPath: Set) { "default" -> JvmTarget.DEFAULT "1.6" -> JvmTarget.JVM_1_6 "1.8" -> JvmTarget.JVM_1_8 - "9" -> JvmTarget.JVM_9 - "10" -> JvmTarget.JVM_10 - "11" -> JvmTarget.JVM_11 - "12" -> JvmTarget.JVM_12 + // "9" -> JvmTarget.JVM_9 + // "10" -> JvmTarget.JVM_10 + // "11" -> JvmTarget.JVM_11 + // "12" -> JvmTarget.JVM_12 else -> null } diff --git a/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt b/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt index 809ccc8e9..a5665b552 100644 --- a/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt +++ b/server/src/main/kotlin/org/javacs/kt/CompilerClassPath.kt @@ -6,7 +6,7 @@ import java.nio.file.Path class CompilerClassPath(private val config: CompilerConfiguration) { private val workspaceRoots = mutableSetOf() private val classPath = mutableSetOf() - var compiler = Compiler(classPath, workspaceRoots) + var compiler = Compiler(classPath) private set init { From 752d81212aac0dc585b6138a3d6ea472610d7ead Mon Sep 17 00:00:00 2001 From: fwcd Date: Wed, 31 Jul 2019 19:28:05 +0300 Subject: [PATCH 08/14] Update gradle configuration and script imports --- gradle.properties | 8 +++---- server/build.gradle | 4 ++-- .../src/main/kotlin/org/javacs/kt/Compiler.kt | 21 ++++++++++--------- .../main/kotlin/org/javacs/kt/hover/Hovers.kt | 7 ------- .../kotlin/org/javacs/kt/CompiledFileTest.kt | 2 +- .../test/kotlin/org/javacs/kt/CompilerTest.kt | 2 +- .../kotlin/org/javacs/kt/SimpleScriptTest.kt | 6 ++++-- 7 files changed, 23 insertions(+), 27 deletions(-) diff --git a/gradle.properties b/gradle.properties index 582e602bd..678d4ebb0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ teamCityUrl=https://teamcity.jetbrains.com teamCityUsername=guest teamCityPassword=guest -kotlinVersion=1.3.31 -kotlinBuildType=Kotlin_1330_CompilerAllPlugins -kotlinBuild=1.3.31-release-198 -kotlinPluginBuild=1.3.31-release-IJ2019.1-1 +kotlinVersion=1.3.40 +kotlinBuildType=Kotlin_1340_CompilerAllPlugins +kotlinBuild=1.3.41-release-150 +kotlinPluginBuild=1.3.41-release-IJ2019.2-1 diff --git a/server/build.gradle b/server/build.gradle index 106b1e9d3..a54280919 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -52,11 +52,11 @@ dependencies { implementation 'org.jetbrains:fernflower:1.0' implementation fileTree(dir: "$projectDir/lib-kotlin", include: ["*.jar"]) - kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-impl.jar") + // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-impl.jar") // TODO: The dependency above will be renamed in Kotlin 1.3.50: // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-compiler-impl.jar") + // kotlinJVMLib tc("$kotlinPluginTC/lib/j2k.jar") kotlinJVMLib tc("$kotlinPluginTC/lib/kotlin-plugin.jar") - kotlinJVMLib tc("$kotlinPluginTC/lib/j2k.jar") testImplementation 'org.hamcrest:hamcrest-all:1.3' testImplementation 'junit:junit:4.11' diff --git a/server/src/main/kotlin/org/javacs/kt/Compiler.kt b/server/src/main/kotlin/org/javacs/kt/Compiler.kt index 5e2273e9c..6a46edf91 100644 --- a/server/src/main/kotlin/org/javacs/kt/Compiler.kt +++ b/server/src/main/kotlin/org/javacs/kt/Compiler.kt @@ -7,8 +7,6 @@ import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.openapi.vfs.VirtualFileSystem import com.intellij.psi.PsiFileFactory import com.intellij.mock.MockProject -import org.jetbrains.kotlin.scripting.legacy.CliScriptDefinitionProvider -import org.jetbrains.kotlin.scripting.legacy.CliScriptDependenciesProvider import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.jvm.compiler.CliBindingTrace import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles @@ -28,13 +26,16 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer import org.jetbrains.kotlin.resolve.TopDownAnalysisMode.TopLevelDeclarations +import org.jetbrains.kotlin.resolve.calls.components.InferenceSession import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.script.KotlinScriptDefinition -import org.jetbrains.kotlin.script.ScriptDefinitionProvider -import org.jetbrains.kotlin.script.ScriptDependenciesProvider -import org.jetbrains.kotlin.script.StandardScriptDefinition +import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDependenciesProvider +import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition +import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider +import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices import org.jetbrains.kotlin.util.KotlinFrontEndException @@ -54,7 +55,7 @@ class Compiler(classPath: Set) { val environment: KotlinCoreEnvironment private var parser: KtPsiFactory - private var scripts: CliScriptDefinitionProvider + private var scripts: ScriptDefinitionProvider private val localFileSystem: VirtualFileSystem companion object { @@ -70,7 +71,7 @@ class Compiler(classPath: Set) { configuration = KotlinCompilerConfiguration().apply { put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, LoggingMessageCollector) - put(JVMConfigurationKeys.SCRIPT_DEFINITIONS, listOf(StandardScriptDefinition)) + put(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, listOf(KotlinScriptDefinition(Any::class))) addJvmClasspathRoots(classPath.map { it.toFile() }) }, configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES @@ -84,8 +85,7 @@ class Compiler(classPath: Set) { } parser = KtPsiFactory(environment.project) - scripts = ScriptDefinitionProvider.getInstance(environment.project) as CliScriptDefinitionProvider - scripts.setScriptDefinitions(listOf(StandardScriptDefinition)) + scripts = ScriptDefinitionProvider.getInstance(environment.project)!! localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL) } @@ -186,6 +186,7 @@ class Compiler(classPath: Set) { expression, TypeUtils.NO_EXPECTED_TYPE, DataFlowInfo.EMPTY, + InferenceSession.default, trace, true) return Pair(trace.bindingContext, container) diff --git a/server/src/main/kotlin/org/javacs/kt/hover/Hovers.kt b/server/src/main/kotlin/org/javacs/kt/hover/Hovers.kt index f283fd95b..f952a4382 100644 --- a/server/src/main/kotlin/org/javacs/kt/hover/Hovers.kt +++ b/server/src/main/kotlin/org/javacs/kt/hover/Hovers.kt @@ -11,12 +11,6 @@ import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade -import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf @@ -27,7 +21,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.javacs.kt.CompiledFile import org.javacs.kt.completion.DECL_RENDERER import org.javacs.kt.position.position diff --git a/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt b/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt index 30914382a..dc2541c7a 100644 --- a/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt +++ b/server/src/test/kotlin/org/javacs/kt/CompiledFileTest.kt @@ -9,7 +9,7 @@ class CompiledFileTest { val compiledFile = compileFile() fun compileFile(): CompiledFile { - val compiler = Compiler(setOf(), setOf()) + val compiler = Compiler(setOf()) val file = testResourcesRoot().resolve("compiledFile/CompiledFileExample.kt") val content = Files.readAllLines(file).joinToString("\n") val parse = compiler.createFile(content, file) diff --git a/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt b/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt index 7f274736d..3e1c97a3c 100644 --- a/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt +++ b/server/src/test/kotlin/org/javacs/kt/CompilerTest.kt @@ -11,7 +11,7 @@ import org.junit.Test import java.nio.file.Files class CompilerTest { - val compiler = Compiler(setOf(), setOf()) + val compiler = Compiler(setOf()) val myTestResources = testResourcesRoot().resolve("compiler") val file = myTestResources.resolve("FileToEdit.kt") val editedText = """ diff --git a/server/src/test/kotlin/org/javacs/kt/SimpleScriptTest.kt b/server/src/test/kotlin/org/javacs/kt/SimpleScriptTest.kt index 7a54cee96..175f24d12 100644 --- a/server/src/test/kotlin/org/javacs/kt/SimpleScriptTest.kt +++ b/server/src/test/kotlin/org/javacs/kt/SimpleScriptTest.kt @@ -1,10 +1,12 @@ package org.javacs.kt import org.jetbrains.kotlin.cli.common.repl.* -import org.jetbrains.kotlin.cli.jvm.repl.* import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration as KotlinCompilerConfiguration -import org.jetbrains.kotlin.script.* +import org.jetbrains.kotlin.scripting.definitions.* +import org.jetbrains.kotlin.scripting.repl.* +// TODO: In the future this import will be: +// import org.jetbrains.kotlin.scripting.compiler.plugin.repl.* import com.intellij.openapi.util.* import org.jetbrains.kotlin.cli.common.messages.* import org.junit.* From 5422a1b9bbbd06eb317c82e99655094dccc4dc0d Mon Sep 17 00:00:00 2001 From: fwcd Date: Wed, 31 Jul 2019 20:30:32 +0300 Subject: [PATCH 09/14] Shutdown executor services after use --- .vscode/launch.json | 7 +++++++ .../main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt | 5 +++++ .../test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt | 5 +++++ shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt | 4 ++++ shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt | 4 ++++ 5 files changed, 25 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index db170740d..fa2cfb0b9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -32,6 +32,13 @@ "outFiles": [ "${workspaceFolder}/editors/vscode/out/test/**/*.js" ] + }, + { + "type": "java", + "name": "Debug Tests", + "request": "attach", + "hostName": "localhost", + "port": 5005 } ] } diff --git a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt index 702811453..a2def25b4 100644 --- a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt +++ b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt @@ -268,6 +268,11 @@ class KotlinTextDocumentService( private fun clearDiagnostics(file: Path) { client.publishDiagnostics(PublishDiagnosticsParams(file.toUri().toString(), listOf())) } + + fun shutdownExecutors() { + async.shutdown() + debounceLint.shutdown() + } } private inline fun reportTime(block: () -> T): T { diff --git a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt index 556fe2077..901bab8ee 100644 --- a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt +++ b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt @@ -3,6 +3,7 @@ package org.javacs.kt import org.eclipse.lsp4j.* import org.eclipse.lsp4j.services.LanguageClient import org.junit.Before +import org.junit.After import java.nio.file.Path import java.nio.file.Paths import java.util.concurrent.CompletableFuture @@ -37,6 +38,10 @@ abstract class LanguageServerTestFixture(relativeWorkspaceRoot: String) : Langua return languageServer } + + @After fun shutdownExecutors() { + languageServer.textDocumentService.shutdownExecutors() + } fun completionParams(relativePath: String, line: Int, column: Int): CompletionParams { val file = workspaceRoot.resolve(relativePath) diff --git a/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt b/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt index d183295d9..c64058f0b 100644 --- a/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt +++ b/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt @@ -21,4 +21,8 @@ class AsyncExecutor { defaultValue } }, workerThread) + + fun shutdown() { + workerThread.shutdown() + } } diff --git a/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt b/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt index b6e8d874b..9061c3e40 100644 --- a/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt +++ b/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt @@ -32,4 +32,8 @@ class Debouncer( fun waitForPendingTask() { pendingTask?.get() } + + fun shutdown() { + executor.shutdown() + } } From d7c1cf23ae6f022404608dd94ee9e95e7a8b5d4e Mon Sep 17 00:00:00 2001 From: fwcd Date: Wed, 31 Jul 2019 21:54:45 +0300 Subject: [PATCH 10/14] Add mavenCentral repository to top-level buildfile --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 39d8f4deb..70c252005 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,7 @@ plugins { id 'org.jetbrains.kotlin.jvm' version "$kotlinVersion" } + +repositories { + mavenCentral() +} From fbd1c557598ab1b5eff991e8702617cbdaeb0857 Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Aug 2019 00:03:30 +0300 Subject: [PATCH 11/14] Add flag to await executor termination --- .../kotlin/org/javacs/kt/KotlinTextDocumentService.kt | 6 +++--- .../kotlin/org/javacs/kt/LanguageServerTestFixture.kt | 2 +- .../src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt | 8 +++++++- shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt | 7 ++++++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt index a2def25b4..ee1fe4f59 100644 --- a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt +++ b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt @@ -269,9 +269,9 @@ class KotlinTextDocumentService( client.publishDiagnostics(PublishDiagnosticsParams(file.toUri().toString(), listOf())) } - fun shutdownExecutors() { - async.shutdown() - debounceLint.shutdown() + fun shutdownExecutors(awaitTermination: Boolean) { + async.shutdown(awaitTermination) + debounceLint.shutdown(awaitTermination) } } diff --git a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt index 901bab8ee..b6a24c519 100644 --- a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt +++ b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt @@ -40,7 +40,7 @@ abstract class LanguageServerTestFixture(relativeWorkspaceRoot: String) : Langua } @After fun shutdownExecutors() { - languageServer.textDocumentService.shutdownExecutors() + languageServer.textDocumentService.shutdownExecutors(awaitTermination = true) } fun completionParams(relativePath: String, line: Int, column: Int): CompletionParams { diff --git a/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt b/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt index c64058f0b..fee734bd9 100644 --- a/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt +++ b/shared/src/main/kotlin/org/javacs/kt/util/AsyncExecutor.kt @@ -1,9 +1,11 @@ package org.javacs.kt.util +import org.javacs.kt.LOG import java.time.Duration import java.util.function.Supplier import java.util.concurrent.CompletableFuture import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit private var threadCount = 0 @@ -22,7 +24,11 @@ class AsyncExecutor { } }, workerThread) - fun shutdown() { + fun shutdown(awaitTermination: Boolean) { workerThread.shutdown() + if (awaitTermination) { + LOG.info("Awaiting async termination...") + workerThread.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS) + } } } diff --git a/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt b/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt index 9061c3e40..127f6c54d 100644 --- a/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt +++ b/shared/src/main/kotlin/org/javacs/kt/util/Debouncer.kt @@ -1,5 +1,6 @@ package org.javacs.kt.util +import org.javacs.kt.LOG import java.time.Duration import java.util.function.Supplier import java.util.concurrent.ScheduledExecutorService @@ -33,7 +34,11 @@ class Debouncer( pendingTask?.get() } - fun shutdown() { + fun shutdown(awaitTermination: Boolean) { executor.shutdown() + if (awaitTermination) { + LOG.info("Awaiting debouncer termination...") + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS) + } } } From a1d5a3753ffb3b7a221a60b2e0d18851d4dccb70 Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Aug 2019 01:12:08 +0300 Subject: [PATCH 12/14] Update scripting compiler API and update test fixture logging Register a ScriptingCompilerConfigurationComponentRegistrar as described in https://youtrack.jetbrains.com/issue/KT-30679. In the LanguageServerTestFixture, output the memory usage after each test and format log messages to a single line. --- .../src/main/kotlin/org/javacs/kt/Compiler.kt | 9 ++++++--- .../org/javacs/kt/LanguageServerTestFixture.kt | 17 ++++++++++++----- .../test/resources/script/FunctionScript.kts | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/server/src/main/kotlin/org/javacs/kt/Compiler.kt b/server/src/main/kotlin/org/javacs/kt/Compiler.kt index 6a46edf91..98aeccd20 100644 --- a/server/src/main/kotlin/org/javacs/kt/Compiler.kt +++ b/server/src/main/kotlin/org/javacs/kt/Compiler.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.get +import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.* @@ -33,9 +34,11 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDependenciesProvider +import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider +import org.jetbrains.kotlin.scripting.definitions.StandardScriptDefinition import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices import org.jetbrains.kotlin.util.KotlinFrontEndException @@ -43,6 +46,7 @@ import java.nio.file.Path import java.nio.file.Paths import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock +import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration import org.javacs.kt.util.KotlinLSException import org.javacs.kt.util.KotlinNullableNotNullManager import org.javacs.kt.util.LoggingMessageCollector @@ -71,7 +75,8 @@ class Compiler(classPath: Set) { configuration = KotlinCompilerConfiguration().apply { put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, LoggingMessageCollector) - put(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, listOf(KotlinScriptDefinition(Any::class))) + add(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, ScriptingCompilerConfigurationComponentRegistrar()) + add(ScriptingConfigurationKeys.SCRIPT_DEFINITIONS, StandardScriptDefinition) addJvmClasspathRoots(classPath.map { it.toFile() }) }, configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES @@ -79,8 +84,6 @@ class Compiler(classPath: Set) { val project = environment.project if (project is MockProject) { - project.registerService(ScriptDefinitionProvider::class.java, CliScriptDefinitionProvider()) - project.registerService(ScriptDependenciesProvider::class.java, CliScriptDependenciesProvider(project)) project.registerService(NullableNotNullManager::class.java, KotlinNullableNotNullManager(project)) } diff --git a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt index b6a24c519..c1b484e71 100644 --- a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt +++ b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt @@ -42,6 +42,13 @@ abstract class LanguageServerTestFixture(relativeWorkspaceRoot: String) : Langua @After fun shutdownExecutors() { languageServer.textDocumentService.shutdownExecutors(awaitTermination = true) } + + @After fun printMemoryUsage() { + val rt = Runtime.getRuntime() + val total = rt.totalMemory().toDouble() / 1000000.0 + val free = rt.freeMemory().toDouble() / 1000000.0 + println("Memory after test: ${total - free} MB used / $total MB total") + } fun completionParams(relativePath: String, line: Int, column: Int): CompletionParams { val file = workspaceRoot.resolve(relativePath) @@ -109,12 +116,12 @@ abstract class LanguageServerTestFixture(relativeWorkspaceRoot: String) : Langua println(`object`.toString()) } - override fun logMessage(message: MessageParams?) { - println(message.toString()) - } + override fun logMessage(message: MessageParams?) = printMessage(message) - override fun showMessage(message: MessageParams?) { - println(message.toString()) + override fun showMessage(message: MessageParams?) = printMessage(message) + + private fun printMessage(message: MessageParams?) { + println("[${message?.type}] ${message?.message}") } } diff --git a/server/src/test/resources/script/FunctionScript.kts b/server/src/test/resources/script/FunctionScript.kts index 41eaf7aa0..76adf3687 100644 --- a/server/src/test/resources/script/FunctionScript.kts +++ b/server/src/test/resources/script/FunctionScript.kts @@ -1,4 +1,4 @@ fun foo() { val first = 1 val second = 2 -} \ No newline at end of file +} From 4610a3e8505de875502b6500da701eff3fd416de Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Aug 2019 01:19:51 +0300 Subject: [PATCH 13/14] Clean up server/build.gradle Remove some unused dependencies. --- server/build.gradle | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index a54280919..917928e4d 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -40,7 +40,6 @@ configurations { } dependencies { - def kotlinCompilerTC = "$kotlinBuildType:$kotlinBuild:kotlin-compiler-${kotlinVersion}.zip!/kotlinc" def kotlinPluginTC = "$kotlinBuildType:$kotlinBuild:kotlin-plugin-${kotlinPluginBuild}.zip!/Kotlin" implementation project(':shared') @@ -52,10 +51,7 @@ dependencies { implementation 'org.jetbrains:fernflower:1.0' implementation fileTree(dir: "$projectDir/lib-kotlin", include: ["*.jar"]) - // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-impl.jar") - // TODO: The dependency above will be renamed in Kotlin 1.3.50: - // kotlinJVMLib tc("$kotlinCompilerTC/lib/kotlin-scripting-compiler-impl.jar") - // kotlinJVMLib tc("$kotlinPluginTC/lib/j2k.jar") + // TODO: Isolate J2K dependency from the plugin: kotlinJVMLib tc("$kotlinPluginTC/lib/kotlin-plugin.jar") testImplementation 'org.hamcrest:hamcrest-all:1.3' From a574aac4f9875aa4c26dc40053872e08d3e73373 Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Aug 2019 01:53:26 +0300 Subject: [PATCH 14/14] Increase test heap size --- server/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/server/build.gradle b/server/build.gradle index 917928e4d..9072f798d 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -119,6 +119,7 @@ run { } test { + maxHeapSize = "1G" testLogging { events "failed" exceptionFormat "short"