- Notifications
You must be signed in to change notification settings - Fork245
Kotlin code completion, diagnostics and more for any editor/IDE using the Language Server Protocol
License
fwcd/kotlin-language-server
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Important
There is now anofficial language server, so this project can be considered deprecated.
Alanguage server that provides smart code completion, diagnostics, hover, document symbols, definition lookup, method signature help and more forKotlin.
Any editor conforming to LSP is supported, includingVSCode andAtom.
- SeeBUILDING.md for build instructions
- SeeEditor Integration for editor-specific instructions
- SeeTroubleshooting for tips on troubleshooting errors
- SeeRoadmap for features, planned additions, bugfixes and changes
- SeeKotlin Quick Start for a sample project
- SeeKotlin Debug Adapter for editor-agnostic launch and debug support of Kotlin/JVM programs
- Seetree-sitter-kotlin for an experimentalTree-Sitter grammar
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:
- Figuring out the dependencies
- Incrementally re-compiling as the user types
The project uses the internal APIs of theKotlin compiler.
Dependencies are determined by theDefaultClassPathResolver.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/classpathon Linux:
#!/bin/bashecho /my/path/kotlin-compiler-1.4.10/lib/kotlin-stdlib.jar:/my/path/my-lib.jar
- Example of the
%HOMEPATH%\.config\kotlin-language-server\classpath.baton Windows:
@echooffecho C:\my\path\kotlin-compiler-1.4.10\lib\kotlin-stdlib.jar;C:\my\path\my-lib.jar
I get incremental compilation at the file-level by keeping the sameKotlinCoreEnvironment alive between compilations inCompiler.kt. There is a performance benchmark inOneFilePerformance.kt that verifies this works.
Getting incremental compilation at the expression level is a bit more complicated:
- Fully compile a file and store inCompiledFile:
val content: StringA snapshot of the source codeval parse: KtFileThe parsed ASTval compile: BindingContextAdditional information about the AST from typechecking
- After the user edits the file:
- Find the smallest section the encompasses all the user changes
- Get the
LexicalScopeencompassing this region from theBindingContextthat 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 inCompiledFile.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 behavioraltests, 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.
| Name | Description |
|---|---|
| server | The language server executable |
| shared | Classpath resolution and utilities |
| Name | Command | Description |
|---|---|---|
| release_version.py | python3 scripts/release_version.py | Creates a tag for the current version and bumps the development version |
The Kotlin language server supports some non-standard requests through LSP. SeeKotlinProtocolExtensions for a description of the interface. The general syntax for these methods iskotlin/someCustomMethod.
The Kotlin language server supports some custom initialization options via theinitializationOptions property in theinitialize request parameters. SeeInitializationOptions inConfiguration for a list of supported properties.
About
Kotlin code completion, diagnostics and more for any editor/IDE using the Language Server Protocol
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.





