Popularity
8.6
Growing
Activity
9.0
-
1,468
30
184

Programming language: Kotlin
License: MIT License
Tags: Editors    
Latest version: v1.3.1

KotlinLanguageServer alternatives and similar libraries

Based on the "Editors" category.
Alternatively, view KotlinLanguageServer alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of KotlinLanguageServer or a related project?

Add another 'Editors' Library

README

Kotlin Language Server

Release Build Downloads Chat

A language server that provides smart code completion, diagnostics, hover, document symbols, definition lookup, method signature help and more for Kotlin.

[Icon](Icon128.png)

Any editor conforming to LSP is supported, including VSCode and Atom.

Getting Started

Packaging

Packaging status

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:

  • Figuring out the dependencies
  • Incrementally re-compiling as the user types

The project uses the internal APIs of the Kotlin compiler.

Figuring out the dependencies

Dependencies are determined by the [DefaultClassPathResolver.kt](shared/src/main/kotlin/org/javacs/kt/classpath/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]/kotlinLspClasspath.{sh,bat,cmd} or [config root]/KotlinLanguageServer/classpath.{sh,bat,cmd}, which outputs a list of JARs.

  • Example of the ~/.config/KotlinLanguageServer/classpath.sh 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\KotlinLanguageServer\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](server/src/main/kotlin/org/javacs/kt/compiler/Compiler.kt). There is a performance benchmark in [OneFilePerformance.kt](server/src/test/kotlin/org/javacs/kt/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](server/src/main/kotlin/org/javacs/kt/CompiledFile.kt):
    • val content: String A snapshot of the source code
    • val parse: KtFile The parsed AST
    • 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](server/src/main/kotlin/org/javacs/kt/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](server/src/test/kotlin/org/javacs/kt), 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](server/src/main/kotlin/org/javacs/kt/KotlinProtocolExtensions.kt) for a description of the interface. The general syntax for these methods is kotlin/someCustomMethod.

Features

Autocomplete

[Autocomplete](images/Autocomplete.png)

Signature help

[Signature Help](images/SignatureHelp.png)

Hover

[Hover](images/Hover.png)

Go-to-definition, find all references

[Find all references](images/FindAllReferences.png)

Document symbols

[Document symbols](images/DocumentSymbols.png)

Global symbols

[Global symbols](images/GlobalSymbols.png)

Authors