From 896806348e34381b1ca7e366fee688aa3514579c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20F=C3=B6rster?= Date: Mon, 7 Jan 2019 13:28:05 +0100 Subject: [PATCH] Implemenet document highlight request for labels --- src/main/kotlin/texlab/LanguageServerImpl.kt | 1 + .../kotlin/texlab/TextDocumentServiceImpl.kt | 20 +++++++++++ .../highlight/AggregateHighlightProvider.kt | 15 +++++++++ .../texlab/highlight/HighlightProvider.kt | 7 ++++ .../texlab/highlight/HighlightRequest.kt | 6 ++++ .../highlight/LatexLabelHighlightProvider.kt | 33 +++++++++++++++++++ 6 files changed, 82 insertions(+) create mode 100644 src/main/kotlin/texlab/highlight/AggregateHighlightProvider.kt create mode 100644 src/main/kotlin/texlab/highlight/HighlightProvider.kt create mode 100644 src/main/kotlin/texlab/highlight/HighlightRequest.kt create mode 100644 src/main/kotlin/texlab/highlight/LatexLabelHighlightProvider.kt diff --git a/src/main/kotlin/texlab/LanguageServerImpl.kt b/src/main/kotlin/texlab/LanguageServerImpl.kt index 4b3bccd9..2f380efc 100644 --- a/src/main/kotlin/texlab/LanguageServerImpl.kt +++ b/src/main/kotlin/texlab/LanguageServerImpl.kt @@ -50,6 +50,7 @@ class LanguageServerImpl : LanguageServer { hoverProvider = true documentFormattingProvider = true referencesProvider = true + documentHighlightProvider = true } return CompletableFuture.completedFuture(InitializeResult(capabilities)) diff --git a/src/main/kotlin/texlab/TextDocumentServiceImpl.kt b/src/main/kotlin/texlab/TextDocumentServiceImpl.kt index 3add6aa6..d36b11c6 100644 --- a/src/main/kotlin/texlab/TextDocumentServiceImpl.kt +++ b/src/main/kotlin/texlab/TextDocumentServiceImpl.kt @@ -17,6 +17,10 @@ import texlab.diagnostics.* import texlab.folding.* import texlab.formatting.BibtexFormatter import texlab.formatting.BibtexFormatterConfig +import texlab.highlight.AggregateHighlightProvider +import texlab.highlight.HighlightProvider +import texlab.highlight.HighlightRequest +import texlab.highlight.LatexLabelHighlightProvider import texlab.link.AggregateLinkProvider import texlab.link.LatexIncludeLinkProvider import texlab.link.LinkProvider @@ -104,6 +108,9 @@ class TextDocumentServiceImpl(private val workspace: Workspace) : TextDocumentSe LatexLabelDefinitionProvider, BibtexEntryDefinitionProvider) + private val highlightProvider: HighlightProvider = + AggregateHighlightProvider(LatexLabelHighlightProvider) + private val metadataProvider: PackageMetadataProvider = CtanPackageMetadataProvider() private val referenceProvider: ReferenceProvider = @@ -296,6 +303,19 @@ class TextDocumentServiceImpl(private val workspace: Workspace) : TextDocumentSe } } + override fun documentHighlight(params: TextDocumentPositionParams): + CompletableFuture> { + synchronized(workspace) { + val uri = URI.create(params.textDocument.uri) + val document = workspace.documents.firstOrNull { it.uri == uri } + ?: return CompletableFuture.completedFuture(null) + + val request = HighlightRequest(document, params.position) + val highlights = highlightProvider.getHighlights(request) + return CompletableFuture.completedFuture(highlights?.toMutableList()) + } + } + fun build(params: BuildParams): CompletableFuture { return CompletableFuture.supplyAsync { val childUri = URI.create(params.textDocument.uri) diff --git a/src/main/kotlin/texlab/highlight/AggregateHighlightProvider.kt b/src/main/kotlin/texlab/highlight/AggregateHighlightProvider.kt new file mode 100644 index 00000000..2e6e4c79 --- /dev/null +++ b/src/main/kotlin/texlab/highlight/AggregateHighlightProvider.kt @@ -0,0 +1,15 @@ +package texlab.highlight + +import org.eclipse.lsp4j.DocumentHighlight + +class AggregateHighlightProvider(private vararg val providers: HighlightProvider) : HighlightProvider { + override fun getHighlights(request: HighlightRequest): List? { + for (provider in providers) { + val highlights = provider.getHighlights(request) + if (highlights != null) { + return highlights + } + } + return null + } +} diff --git a/src/main/kotlin/texlab/highlight/HighlightProvider.kt b/src/main/kotlin/texlab/highlight/HighlightProvider.kt new file mode 100644 index 00000000..d3a0b7f4 --- /dev/null +++ b/src/main/kotlin/texlab/highlight/HighlightProvider.kt @@ -0,0 +1,7 @@ +package texlab.highlight + +import org.eclipse.lsp4j.DocumentHighlight + +interface HighlightProvider { + fun getHighlights(request: HighlightRequest): List? +} diff --git a/src/main/kotlin/texlab/highlight/HighlightRequest.kt b/src/main/kotlin/texlab/highlight/HighlightRequest.kt new file mode 100644 index 00000000..0824652f --- /dev/null +++ b/src/main/kotlin/texlab/highlight/HighlightRequest.kt @@ -0,0 +1,6 @@ +package texlab.highlight + +import org.eclipse.lsp4j.Position +import texlab.Document + +data class HighlightRequest(val document: Document, val position: Position) diff --git a/src/main/kotlin/texlab/highlight/LatexLabelHighlightProvider.kt b/src/main/kotlin/texlab/highlight/LatexLabelHighlightProvider.kt new file mode 100644 index 00000000..974adde6 --- /dev/null +++ b/src/main/kotlin/texlab/highlight/LatexLabelHighlightProvider.kt @@ -0,0 +1,33 @@ +package texlab.highlight + +import org.eclipse.lsp4j.DocumentHighlight +import org.eclipse.lsp4j.DocumentHighlightKind +import texlab.LatexDocument +import texlab.contains +import texlab.syntax.latex.LatexLabel + +object LatexLabelHighlightProvider : HighlightProvider { + override fun getHighlights(request: HighlightRequest): List? { + if (request.document !is LatexDocument) { + return null + } + + val label = request.document.tree.labelDefinitions + .plus(request.document.tree.labelReferences) + .firstOrNull { it.name.range.contains(request.position) } + ?: return null + + return request.document.tree.labelDefinitions + .plus(request.document.tree.labelReferences) + .filter { it.name.text == label.name.text } + .map { DocumentHighlight(it.name.range, getHighlightKind(it)) } + } + + private fun getHighlightKind(label: LatexLabel): DocumentHighlightKind { + return if (label.command.name.text == "\\label") { + DocumentHighlightKind.Write + } else { + DocumentHighlightKind.Read + } + } +}