This is fork of currently almost unmaintained upstream repo: https://github.com/fwcd/kotling-language-server
This fork is being maintained in developers' spare time. Our goal is to make this extension usable and feature complete. We do not aim for full feature parity with JetBrains ide's Kotlin support.
We do support only Linux and MacOS. Windows is not tested but still may work. Windows only issues has least priority.
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.
This project is strictly limited by Language Server Protocol capabilities. We aim to provide complete language server experience.
Some features, that our users may expect, lies outside of our responsibility. We won't deliver any features related to code and test running, project building. These tasks should be performed by other means. We offload these features to editor specific extensions.
- See CONTRIBUTION.md for development guidelines
- See Taiga board for ongoing and planed work. Core team uses it as main tool for cooperation and project's status tracking
- See BUILDING.md for build instructions
- See Editor Integration for editor-specific instructions
- See Troubleshooting for tips on troubleshooting errors
- See Kotlin Quick Start for a sample project
- See Kotlin Debug Adapter for editor-agnostic launch and debug support of Kotlin/JVM programs
- See tree-sitter-kotlin for an experimental Tree-Sitter grammar
See CONTRIBUTION.md
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 the Kotlin compiler.
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:
#!/bin/bash
echo /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.bat
on Windows:
@echo off
echo 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 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:
- Fully compile a file and store in CompiledFile:
val content: String
A snapshot of the source codeval parse: KtFile
The parsed ASTval 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 theBindingContext
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.
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. See KotlinProtocolExtensions for a description of the interface. The general syntax for these methods is kotlin/someCustomMethod
.
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.