From e042ef0b614de2aad2cd7b130fb665694ec7e1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20F=C3=B6rster?= Date: Fri, 28 Dec 2018 16:19:02 +0100 Subject: [PATCH] Add server status protocol extension --- .../kotlin/texlab/LanguageClientExtensions.kt | 9 +++++++++ src/main/kotlin/texlab/LanguageServerImpl.kt | 20 ++++++++++++++----- src/main/kotlin/texlab/Main.kt | 4 ++-- src/main/kotlin/texlab/ServerStatus.kt | 7 +++++++ src/main/kotlin/texlab/StatusParams.kt | 3 +++ .../kotlin/texlab/TextDocumentServiceImpl.kt | 3 +-- 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/texlab/LanguageClientExtensions.kt create mode 100644 src/main/kotlin/texlab/ServerStatus.kt create mode 100644 src/main/kotlin/texlab/StatusParams.kt diff --git a/src/main/kotlin/texlab/LanguageClientExtensions.kt b/src/main/kotlin/texlab/LanguageClientExtensions.kt new file mode 100644 index 00000000..d24bf6ea --- /dev/null +++ b/src/main/kotlin/texlab/LanguageClientExtensions.kt @@ -0,0 +1,9 @@ +package texlab + +import org.eclipse.lsp4j.jsonrpc.services.JsonNotification +import org.eclipse.lsp4j.services.LanguageClient + +interface LanguageClientExtensions : LanguageClient { + @JsonNotification("window/setStatus") + fun setStatus(statusParams: StatusParams) +} diff --git a/src/main/kotlin/texlab/LanguageServerImpl.kt b/src/main/kotlin/texlab/LanguageServerImpl.kt index d49c5678..5e7dedd7 100644 --- a/src/main/kotlin/texlab/LanguageServerImpl.kt +++ b/src/main/kotlin/texlab/LanguageServerImpl.kt @@ -3,7 +3,9 @@ package texlab import org.eclipse.lsp4j.* import org.eclipse.lsp4j.jsonrpc.messages.Either import org.eclipse.lsp4j.jsonrpc.services.JsonRequest -import org.eclipse.lsp4j.services.* +import org.eclipse.lsp4j.services.LanguageServer +import org.eclipse.lsp4j.services.TextDocumentService +import org.eclipse.lsp4j.services.WorkspaceService import texlab.build.BuildConfig import texlab.build.BuildEngine import texlab.build.BuildParams @@ -16,13 +18,13 @@ import java.nio.file.Path import java.nio.file.Paths import java.util.concurrent.CompletableFuture -class LanguageServerImpl : LanguageServer, LanguageClientAware { +class LanguageServerImpl : LanguageServer { private val workspace: Workspace = Workspace() private val textDocumentService = TextDocumentServiceImpl(workspace) private val workspaceService = WorkspaceServiceImpl() - private lateinit var client: LanguageClient + private lateinit var client: LanguageClientExtensions - override fun connect(client: LanguageClient) { + fun connect(client: LanguageClientExtensions) { this.client = client this.textDocumentService.client = client } @@ -50,6 +52,10 @@ class LanguageServerImpl : LanguageServer, LanguageClientAware { } } + override fun initialized(params: InitializedParams?) { + client.setStatus(StatusParams(ServerStatus.IDLE, null)) + } + private fun loadWorkspace(root: URI) { if (root.scheme == "file") { val matcher = FileSystems.getDefault().getPathMatcher("glob:**.{tex,sty,cls,bib}") @@ -94,6 +100,9 @@ class LanguageServerImpl : LanguageServer, LanguageClientAware { .firstOrNull { it.tree.isStandalone } ?: workspace.documents.first { it.uri == childUri } + val parentName = Paths.get(parent.uri).fileName + client.setStatus(StatusParams(ServerStatus.BUILDING, parentName.toString())) + val config = client.configuration("latex.build", parent.uri) val (status, allErrors) = BuildEngine.build(parent.uri, config) @@ -106,7 +115,8 @@ class LanguageServerImpl : LanguageServer, LanguageClientAware { val diagnostics = PublishDiagnosticsParams(uri.toString(), errors.map { it.toDiagnostic() }) client.publishDiagnostics(diagnostics) } - + + client.setStatus(StatusParams(ServerStatus.IDLE)) status } } diff --git a/src/main/kotlin/texlab/Main.kt b/src/main/kotlin/texlab/Main.kt index 3bc18ddc..7eb2b3f9 100644 --- a/src/main/kotlin/texlab/Main.kt +++ b/src/main/kotlin/texlab/Main.kt @@ -1,10 +1,10 @@ package texlab -import org.eclipse.lsp4j.launch.LSPLauncher +import org.eclipse.lsp4j.jsonrpc.Launcher fun main(args: Array) { val server = LanguageServerImpl() - val launcher = LSPLauncher.createServerLauncher(server, System.`in`, System.out) + val launcher = Launcher.createLauncher(server, LanguageClientExtensions::class.java, System.`in`, System.out) server.connect(launcher.remoteProxy) launcher.startListening().get() } diff --git a/src/main/kotlin/texlab/ServerStatus.kt b/src/main/kotlin/texlab/ServerStatus.kt new file mode 100644 index 00000000..5e9bc547 --- /dev/null +++ b/src/main/kotlin/texlab/ServerStatus.kt @@ -0,0 +1,7 @@ +package texlab + +enum class ServerStatus(val value: Int) { + IDLE(0), + BUILDING(1), + INDEXING(2), +} diff --git a/src/main/kotlin/texlab/StatusParams.kt b/src/main/kotlin/texlab/StatusParams.kt new file mode 100644 index 00000000..28358c17 --- /dev/null +++ b/src/main/kotlin/texlab/StatusParams.kt @@ -0,0 +1,3 @@ +package texlab + +data class StatusParams(val status: ServerStatus, val uri: String? = null) diff --git a/src/main/kotlin/texlab/TextDocumentServiceImpl.kt b/src/main/kotlin/texlab/TextDocumentServiceImpl.kt index 2271500e..bc94ef8b 100644 --- a/src/main/kotlin/texlab/TextDocumentServiceImpl.kt +++ b/src/main/kotlin/texlab/TextDocumentServiceImpl.kt @@ -2,7 +2,6 @@ package texlab import org.eclipse.lsp4j.* import org.eclipse.lsp4j.jsonrpc.messages.Either -import org.eclipse.lsp4j.services.LanguageClient import org.eclipse.lsp4j.services.TextDocumentService import texlab.completion.AggregateCompletionProvider import texlab.completion.CompletionRequest @@ -21,7 +20,7 @@ import java.net.URI import java.util.concurrent.CompletableFuture class TextDocumentServiceImpl(private val workspace: Workspace) : TextDocumentService { - lateinit var client: LanguageClient + lateinit var client: LanguageClientExtensions private val resolver = LatexResolver.create()