From 05bb34c5a921d471261d901a8fe9300f7988f4b2 Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Jul 2021 21:56:52 +0200 Subject: [PATCH 1/2] Update semantic tokens asynchronously --- .../kotlin/org/javacs/kt/KotlinTextDocumentService.kt | 11 +++++++---- .../org/javacs/kt/semantictokens/SemanticTokens.kt | 9 +++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt index 5f517df31..881390410 100644 --- a/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt +++ b/server/src/main/kotlin/org/javacs/kt/KotlinTextDocumentService.kt @@ -231,9 +231,10 @@ class KotlinTextDocumentService( reportTime { val uri = parseURI(params.textDocument.uri) - val file = sp.currentVersion(uri) + val parse = sp.parsedFile(uri) + val file = sp.latestCompiledVersion(uri) - val tokens = encodedSemanticTokens(file) + val tokens = encodedSemanticTokens(parse, file.compile) LOG.info("Found {} tokens", tokens.size) SemanticTokens(tokens) @@ -245,9 +246,10 @@ class KotlinTextDocumentService( reportTime { val uri = parseURI(params.textDocument.uri) - val file = sp.currentVersion(uri) + val parse = sp.parsedFile(uri) + val file = sp.latestCompiledVersion(uri) - val tokens = encodedSemanticTokens(file, params.range) + val tokens = encodedSemanticTokens(parse, file.compile, params.range) LOG.info("Found {} tokens", tokens.size) SemanticTokens(tokens) @@ -288,6 +290,7 @@ class KotlinTextDocumentService( val context = sp.compileFiles(files) if (!cancelCallback.invoke()) { reportDiagnostics(files, context.diagnostics) + client.refreshSemanticTokens() } lintCount++ } diff --git a/server/src/main/kotlin/org/javacs/kt/semantictokens/SemanticTokens.kt b/server/src/main/kotlin/org/javacs/kt/semantictokens/SemanticTokens.kt index 717341088..e2f395590 100644 --- a/server/src/main/kotlin/org/javacs/kt/semantictokens/SemanticTokens.kt +++ b/server/src/main/kotlin/org/javacs/kt/semantictokens/SemanticTokens.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.KtSimpleNameStringTemplateEntry import org.jetbrains.kotlin.psi.KtBlockStringTemplateEntry import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext import com.intellij.psi.PsiElement import com.intellij.psi.PsiNameIdentifierOwner @@ -71,15 +72,15 @@ data class SemanticToken(val range: Range, val type: SemanticTokenType, val modi * Computes LSP-encoded semantic tokens for the given range in the * document. No range means the entire document. */ -fun encodedSemanticTokens(file: CompiledFile, range: Range? = null): List = - encodeTokens(semanticTokens(file, range)) +fun encodedSemanticTokens(parse: KtFile, bindingContext: BindingContext, range: Range? = null): List = + encodeTokens(semanticTokens(parse, bindingContext, range)) /** * Computes semantic tokens for the given range in the document. * No range means the entire document. */ -fun semanticTokens(file: CompiledFile, range: Range? = null): Sequence = - elementTokens(file.parse, file.compile, range) +fun semanticTokens(parse: KtFile, bindingContext: BindingContext, range: Range? = null): Sequence = + elementTokens(parse, bindingContext, range) fun encodeTokens(tokens: Sequence): List { val encoded = mutableListOf() From e8647014bbfb01002225c0f93f289a03d684a0a1 Mon Sep 17 00:00:00 2001 From: fwcd Date: Thu, 1 Jul 2021 22:06:39 +0200 Subject: [PATCH 2/2] Add refreshSemanticTokens stub in test client --- .../test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt index 056a811aa..375690365 100644 --- a/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt +++ b/server/src/test/kotlin/org/javacs/kt/LanguageServerTestFixture.kt @@ -137,6 +137,11 @@ abstract class LanguageServerTestFixture(relativeWorkspaceRoot: String) : Langua println(`object`.toString()) } + // We don't implement this since we are waiting for the linter to complete anyway + // before performing the semantic tokens test (and for the other tests, semantic + // tokens aren't relevant, so we can save time by not performing this request) + override fun refreshSemanticTokens(): CompletableFuture = CompletableFuture.completedFuture(null) + override fun logMessage(message: MessageParams?) = printMessage(message) override fun showMessage(message: MessageParams?) = printMessage(message)