[!IMPORTANT]
There is now an official language server, so this project can be considered deprecated.
Kotlin Language Server
A language server that provides smart code completion, diagnostics, hover, document symbols, definition lookup, method signature help and more for Kotlin.
Any editor conforming to LSP is supported, including VSCode and Atom.
The original author created this project while he was considering using Kotlin in his work. He ended up deciding not to and is not really using Kotlin these days though this is a pretty fully-functional language server that just needs someone to use it every day for a while and iron out the last few pesky bugs.
There are two hard parts of implementing a language server:
Dependencies are determined by the DefaultClassPathResolver.kt, which invokes Maven or Gradle to get a list of classpath JARs. Alternatively, projects can also ‘manually’ provide a list of dependencies through a shell script, located either at [project root]/kls-classpath or [config root]/kotlin-language-server/classpath, which outputs a list of JARs. Depending on your platform, the scripts also can be suffixed with .{sh,bat,cmd}.
Example of the ~/.config/kotlin-language-server/classpath on Linux:
Example of the %HOMEPATH%\.config\kotlin-language-server\classpath.bat on Windows:
@echo off
echo C:\my\path\kotlin-compiler-1.4.10\lib\kotlin-stdlib.jar;C:\my\path\my-lib.jar
Incrementally re-compiling as the user types
I get incremental compilation at the file-level by keeping the same KotlinCoreEnvironment alive between compilations in Compiler.kt. There is a performance benchmark in OneFilePerformance.kt that verifies this works.
Getting incremental compilation at the expression level is a bit more complicated:
val compile: BindingContext Additional information about the AST from typechecking
After the user edits the file:
Find the smallest section the encompasses all the user changes
Get the LexicalScope encompassing this region from the BindingContext that was generated by the full-compile
Create a fake, in-memory .kt file with just the expression we want to re-compile
Add space at the top of the file so the line numbers match up
Re-compile this tiny fake file
The incremental expression compilation logic is all in CompiledFile.kt. The Kotlin AST has a built-in repair API, which seems to be how IntelliJ works, but as far as I can tell this API does not work if the surrounding IntelliJ machinery is not present. Hence I created the “fake tiny file” incremental-compilation mechanism, which seems to be quite fast and predictable.
There is an extensive suite of behavioral tests, which are all implemented in terms of the language server protocol, so you should be able to refactor the code any way you like and the tests should still work.
Modules
Name
Description
server
The language server executable
shared
Classpath resolution and utilities
Scripts
Name
Command
Description
release_version.py
python3 scripts/release_version.py
Creates a tag for the current version and bumps the development version
Protocol Extensions
The Kotlin language server supports some non-standard requests through LSP. See KotlinProtocolExtensions for a description of the interface. The general syntax for these methods is kotlin/someCustomMethod.
Initialization Options
The Kotlin language server supports some custom initialization options via the initializationOptions property in the initialize request parameters. See InitializationOptions in Configuration for a list of supported properties.
Kotlin Language Server
A language server that provides smart code completion, diagnostics, hover, document symbols, definition lookup, method signature help and more for Kotlin.
Any editor conforming to LSP is supported, including VSCode and Atom.
Getting Started
Packaging
This repository needs your help!
The original author created this project while he was considering using Kotlin in his work. He ended up deciding not to and is not really using Kotlin these days though this is a pretty fully-functional language server that just needs someone to use it every day for a while and iron out the last few pesky bugs.
There are two hard parts of implementing a language server:
The project uses the internal APIs of the Kotlin compiler.
Figuring out the dependencies
Dependencies are determined by the DefaultClassPathResolver.kt, which invokes Maven or Gradle to get a list of classpath JARs. Alternatively, projects can also ‘manually’ provide a list of dependencies through a shell script, located either at
[project root]/kls-classpathor[config root]/kotlin-language-server/classpath, which outputs a list of JARs. Depending on your platform, the scripts also can be suffixed with.{sh,bat,cmd}.Example of the
~/.config/kotlin-language-server/classpathon Linux:Example of the
%HOMEPATH%\.config\kotlin-language-server\classpath.baton Windows:Incrementally re-compiling as the user types
I get incremental compilation at the file-level by keeping the same
KotlinCoreEnvironmentalive between compilations in Compiler.kt. There is a performance benchmark in OneFilePerformance.kt that verifies this works.Getting incremental compilation at the expression level is a bit more complicated:
val content: StringA snapshot of the source codeval parse: KtFileThe parsed ASTval compile: BindingContextAdditional information about the AST from typecheckingLexicalScopeencompassing this region from theBindingContextthat was generated by the full-compileThe incremental expression compilation logic is all in CompiledFile.kt. The Kotlin AST has a built-in repair API, which seems to be how IntelliJ works, but as far as I can tell this API does not work if the surrounding IntelliJ machinery is not present. Hence I created the “fake tiny file” incremental-compilation mechanism, which seems to be quite fast and predictable.
There is an extensive suite of behavioral tests, which are all implemented in terms of the language server protocol, so you should be able to refactor the code any way you like and the tests should still work.
Modules
Scripts
python3 scripts/release_version.pyProtocol Extensions
The Kotlin language server supports some non-standard requests through LSP. See KotlinProtocolExtensions for a description of the interface. The general syntax for these methods is
kotlin/someCustomMethod.Initialization Options
The Kotlin language server supports some custom initialization options via the
initializationOptionsproperty in theinitializerequest parameters. SeeInitializationOptionsin Configuration for a list of supported properties.Features
Autocomplete
Signature help
Hover
Go-to-definition, find all references
Document symbols
Global symbols
Authors