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
]]>