From 64100512281814a84de563387b305697e3bbe3ed Mon Sep 17 00:00:00 2001 From: azerr Date: Sat, 2 Dec 2023 14:33:19 +0100 Subject: [PATCH] docs: Getting started documentation Fixes #24 Signed-off-by: azerr --- README.md | 7 +- docs/GettingStarted.md | 157 +++++++++++++++++++ docs/images/MyLanguageServerInLSPConsole.png | Bin 0 -> 11003 bytes src/main/resources/META-INF/plugin.xml | 4 +- 4 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 docs/GettingStarted.md create mode 100644 docs/images/MyLanguageServerInLSPConsole.png diff --git a/README.md b/README.md index c7fd18bff..16fb14332 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,14 @@ LSP4IJ provides: * `com.redhat.devtools.lsp4ij.languageMapping` to associate an Intellij language with a language server definition. * an `LSP Consoles view` to tracks LSP requests, responses and notifications in a console: -![LSP console](https://github.com/redhat-developer/lsp4ij/blob/HEAD/docs/images/LSPConsole.png?raw=true) +![LSP console](./docs/images/LSPConsole.png?raw=true) * a `Language Servers settings page` to configure the LSP trace level, the debug port to use to debug language server: -![Language Server settings](https://github.com/redhat-developer/lsp4ij/blob/HEAD/docs/images/LanguageServerSettings.png?raw=true) +![Language Server settings](./docs/images/LanguageServerSettings.png?raw=true) + +You can start with [Getting started](./docs/GettingStarted.md) + ## Who is using LSP4IJ? diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md new file mode 100644 index 000000000..1fafef3a1 --- /dev/null +++ b/docs/GettingStarted.md @@ -0,0 +1,157 @@ +# Getting started + +This section explains step by step how to add your own LSP language server in your IntelliJ plugin. + +## Reference LSP4IJ + +### plugin.xml + +The first step is to reference LSP4IJ. LSP4IJ uses `com.redhat.devtools.lsp4ij` as plugin Id. + +You need [to declare dependency in your plugin.xml](https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html#3-dependency-declaration-in-pluginxml) like this: + +```xml + + ... + + com.redhat.devtools.lsp4ij + + ... + +``` + +### Exclude all LSP4J dependencies + +LSP4IJ depends on [Eclipse LSP4J](https://github.com/eclipse-lsp4j/lsp4j) (Java binding for the [Language Server Protocol](https://microsoft.github.io/language-server-protocol) and the [Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol).). It uses a given version of LSPJ and their classes are loaded in the LSP4IJ plugin class loader. + +Your IntelliJ Plugin should use `the same LSP4J classes than LSP4IJ` to avoid some `ClassCastException` errors. To do that you need to `exclude all LSP4J dependencies` from your plugin. + +Here a sample used in [Quarkus Tools](https://github.com/redhat-developer/intellij-quarkus) in [build.gradle.kts](https://github.com/redhat-developer/intellij-quarkus/blob/main/build.gradle.kts) to exclude LSP4J dependency from the [Qute Language Server](https://github.com/redhat-developer/quarkus-ls/tree/master/qute.ls) which have a dependency to LSP4J: + +``` +implementation("com.redhat.microprofile:com.redhat.qute.ls:0.17.0) { + exclude("org.eclipse.lsp4j") +} +``` + +## Declare server + + +### StreamConnectionProvider Implementation + +You need to implement the [StreamConnectionProvider](https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/StreamConnectionProvider.java) API which manages: + + * start of your language server + * returns the input/error stream of LSP requests, responses, notifications. + +Generally, the language server is started with a process by using a runtime like Java, NodeJS, etc. In this case you need to extend [ProcessStreamConnectionProvider](https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/ProcessStreamConnectionProvider.java) + +Here a basic sample which starts the `path/to/my/language/server/main.js` language server written in JavaScript with NodeJS runtime "path/to/nodejs/node.exe": + +```java +package my.language.server; + +import com.redhat.devtools.lsp4ij.server.ProcessStreamConnectionProvider; + +import java.util.Arrays; +import java.util.List; + +public class MyLanguageServer extends ProcessStreamConnectionProvider { + + public MyLanguageServer() { + List commands = Arrays.asList("path/to/nodejs/node.exe", "path/to/my/language/server/main.js"); + super.setCommands(commands); + } +} +``` + +If your language server is written in Java, to build the command, you can use [JavaProcessCommandBuilder](https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/server/JavaProcessCommandBuilder.java): + +```java +package my.language.server; + +import com.intellij.openapi.project.Project; +import com.redhat.devtools.lsp4ij.server.JavaProcessCommandBuilder; +import com.redhat.devtools.lsp4ij.server.ProcessStreamConnectionProvider; + +import java.util.Arrays; +import java.util.List; + +public class MyLanguageServer extends ProcessStreamConnectionProvider { + + public MyLanguageServer(Project project) { + List commands = new JavaProcessCommandBuilder(project, "myLanguageServerId") + .setJar("path/to/my/language/server/main.java") + .create(); + super.setCommands(commands); + } +} +``` + +This builder takes care of filling command with Java runtime and generate the command with debug if the settings of the language server `myLanguageServerId` defines a debug port. + +You can see a full sample with [QuteServer](https://github.com/redhat-developer/intellij-quarkus/blob/main/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteServer.java) + +### LanguageClientImpl + +It is not required but you can override the [LanguageClientImpl](https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/client/LanguageClientImpl.java) to for instance: + + * some IJ listeners when language client is created + * override some LSP methods + +```java +package my.language.server; + +import com.intellij.openapi.project.Project; +import com.redhat.devtools.lsp4ij.client.LanguageClientImpl; + +public class MyLanguageClient extends LanguageClientImpl { + public MyLanguageClient(Project project) { + super(project); + } +} +``` + +If your language server manages custom LSP requests, it is advised to extend [IndexAwareLanguageClient](https://github.com/redhat-developer/lsp4ij/blob/main/src/main/java/com/redhat/devtools/lsp4ij/client/IndexAwareLanguageClient.java) + +You can see a full sample with [QuteLanguageClient](https://github.com/redhat-developer/intellij-quarkus/blob/main/src/main/java/com/redhat/devtools/intellij/qute/lsp/QuteLanguageClient.java) + +## Declare server with extension point + +The last step is to declare the server in your plugin.xml to use your `my.language.server.MyLanguageServer` and `my.language.server.MyLanguageClient`: + +``` + + + + + + + + + + +``` + +Once the declaration is done, your server should appear in the LSP console: + +![My LanguageServer in LSP Console](./images/MyLanguageServerInLSPConsole.png) + +## Declare language mapping with extension point + +TODO + * declare mapping + * DocumentMatcher + +## Declare IJ features + + * externalAnnotator, completion, etc are declared an language any with LSP4IJ => nothing to do + * IJ inlayHint, hover doesn't support any language, so you need to declare them in you plugin.xml + + diff --git a/docs/images/MyLanguageServerInLSPConsole.png b/docs/images/MyLanguageServerInLSPConsole.png new file mode 100644 index 0000000000000000000000000000000000000000..7286a5c915eebefc5e1872242a36975f625f8ea4 GIT binary patch literal 11003 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index a82acd686..d331b99ce 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -14,7 +14,7 @@ LSP4IJ is a free and open-source Language Server protocol (LSP) client compatible with all flavors of IntelliJ.

+

LSP4IJ is a free and open-source Language Server protocol (LSP) client compatible with all flavors of IntelliJ.

It currently doesn't provide any useful functionality on its own but is instead used as a dependency for other extensions, willing to integrate language servers with IntelliJ products.

@@ -29,6 +29,8 @@
  • An LSP Consoles view to track LSP requests, responses, and notifications in a console.
  • A Language Servers settings page to configure the LSP trace level and the debug port to use to debug the language server.
  • + +

    You can start with Getting started

    ]]>