diff --git a/src/main/kotlin/texlab/LatexLanguageServer.kt b/src/main/kotlin/texlab/LatexLanguageServer.kt index ae034834f..0e00eea07 100644 --- a/src/main/kotlin/texlab/LatexLanguageServer.kt +++ b/src/main/kotlin/texlab/LatexLanguageServer.kt @@ -12,49 +12,33 @@ import org.eclipse.lsp4j.services.WorkspaceService import org.slf4j.Logger import org.slf4j.LoggerFactory import texlab.build.* -import texlab.completion.MatchQualityEvaluator +import texlab.completion.CompletionProvider import texlab.completion.bibtex.BibtexCitationActor -import texlab.completion.bibtex.BibtexEntryTypeProvider -import texlab.completion.bibtex.BibtexFieldNameProvider -import texlab.completion.bibtex.BibtexKernelCommandProvider -import texlab.completion.latex.* import texlab.completion.latex.data.LatexComponentDatabase -import texlab.completion.latex.data.symbols.LatexArgumentSymbolProvider -import texlab.completion.latex.data.symbols.LatexCommandSymbolProvider import texlab.completion.latex.data.symbols.LatexSymbolDatabase -import texlab.definition.BibtexEntryDefinitionProvider -import texlab.definition.LatexLabelDefinitionProvider -import texlab.diagnostics.BibtexEntryDiagnosticsProvider -import texlab.diagnostics.LatexDiagnosticsProvider +import texlab.definition.DefinitionProvider +import texlab.diagnostics.DiagnosticsProvider import texlab.diagnostics.LatexLinterConfig -import texlab.diagnostics.ManualDiagnosticsProvider -import texlab.folding.BibtexDeclarationFoldingProvider -import texlab.folding.LatexEnvironmentFoldingProvider -import texlab.folding.LatexSectionFoldingProvider +import texlab.folding.FoldingProvider import texlab.formatting.BibtexFormatter import texlab.formatting.BibtexFormatterConfig import texlab.highlight.LatexLabelHighlightProvider -import texlab.hover.* +import texlab.hover.HoverProvider import texlab.link.LatexIncludeLinkProvider import texlab.metadata.BibtexEntryTypeMetadataProvider import texlab.metadata.LatexComponentMetadataProvider import texlab.metadata.MetadataProvider -import texlab.provider.DeferredProvider import texlab.provider.FeatureProvider import texlab.provider.FeatureRequest -import texlab.references.BibtexEntryReferenceProvider -import texlab.references.LatexLabelReferenceProvider -import texlab.rename.BibtexEntryRenamer -import texlab.rename.LatexCommandRenamer -import texlab.rename.LatexEnvironmentRenamer -import texlab.rename.LatexLabelRenamer +import texlab.references.ReferenceProvider +import texlab.rename.RenameProvider import texlab.resolver.InvalidTexDistributionException import texlab.resolver.LatexResolver import texlab.resolver.TexDistributionError import texlab.search.ForwardSearchConfig import texlab.search.ForwardSearchResult import texlab.search.ForwardSearchTool -import texlab.symbol.* +import texlab.symbol.SymbolProvider import texlab.syntax.BibtexSyntaxTree import texlab.syntax.LatexSyntaxTree import texlab.syntax.bibtex.BibtexDeclarationSyntax @@ -122,88 +106,9 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS LatexLanguageServerConfig.SYMBOL_DATABASE_DIRECTORY) } - private val completionProvider: FeatureProvider> = - FeatureProvider.concat( - LatexIncludeProvider, - DeferredProvider(::LatexClassImportProvider, resolver, emptyList()), - DeferredProvider(::LatexPackageImportProvider, resolver, emptyList()), - PgfLibraryProvider, - TikzLibraryProvider, - LatexCitationProvider, - LatexColorProvider, - DefineColorModelProvider, - DefineColorSetModelProvider, - LatexLabelProvider, - LatexBeginCommandProvider, - DeferredProvider(::LatexComponentEnvironmentProvider, componentDatabase, emptyList()), - LatexKernelEnvironmentProvider, - LatexUserEnvironmentProvider, - DeferredProvider(::LatexArgumentSymbolProvider, symbolDatabase, emptyList()), - DeferredProvider(::LatexCommandSymbolProvider, symbolDatabase, emptyList()), - DeferredProvider(::TikzCommandProvider, componentDatabase, emptyList()), - DeferredProvider(::LatexComponentCommandProvider, componentDatabase, emptyList()), - LatexKernelCommandProvider, - LatexUserCommandProvider, - BibtexEntryTypeProvider, - BibtexFieldNameProvider, - BibtexKernelCommandProvider) - - private val symbolProvider: FeatureProvider> = - FeatureProvider.concat( - LatexCommandSymbolProvider, - LatexEnvironmentSymbolProvider, - LatexLabelSymbolProvider, - LatexCitationSymbolProvider, - BibtexEntrySymbolProvider) - - private val renameProvider: FeatureProvider = - FeatureProvider.choice( - LatexCommandRenamer, - LatexEnvironmentRenamer, - LatexLabelRenamer, - BibtexEntryRenamer) - - private val foldingProvider: FeatureProvider> = - FeatureProvider.concat( - LatexEnvironmentFoldingProvider, - LatexSectionFoldingProvider, - BibtexDeclarationFoldingProvider) - - private val linkProvider: FeatureProvider> = - FeatureProvider.concat(LatexIncludeLinkProvider) - - private val definitionProvider: FeatureProvider> = - FeatureProvider.concat( - LatexLabelDefinitionProvider, - BibtexEntryDefinitionProvider) - - private val highlightProvider: FeatureProvider> = - FeatureProvider.concat(LatexLabelHighlightProvider) - - private val hoverProvider: FeatureProvider = - FeatureProvider.choice( - LatexComponentHoverProvider, - LatexCitationHoverProvider, - LatexMathEnvironmentHoverProvider, - LatexMathEquationHoverProvider, - LatexMathInlineHoverProvider, - DeferredProvider(::LatexCommandHoverProvider, componentDatabase, null), - BibtexEntryTypeHoverProvider, - BibtexFieldHoverProvider) - - private val referenceProvider: FeatureProvider> = - FeatureProvider.concat( - LatexLabelReferenceProvider, - BibtexEntryReferenceProvider) - - private val buildDiagnosticsProvider: ManualDiagnosticsProvider = ManualDiagnosticsProvider() - private val latexDiagnosticsProvider: LatexDiagnosticsProvider = LatexDiagnosticsProvider() - - private val diagnosticsProvider: FeatureProvider> = - FeatureProvider.concat( - buildDiagnosticsProvider, - BibtexEntryDiagnosticsProvider, - latexDiagnosticsProvider) + private val completionProvider = CompletionProvider(resolver, componentDatabase, symbolDatabase) + private val hoverProvider = HoverProvider(componentDatabase) + private val diagnosticsProvider = DiagnosticsProvider() @JsonDelegate override fun getTextDocumentService(): LatexTextDocumentService = this @@ -282,7 +187,7 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS } val allErrors = BuildErrorParser.parse(texUri, log) - buildDiagnosticsProvider.diagnosticsByUri = allErrors + diagnosticsProvider.buildProvider.diagnosticsByUri = allErrors .groupBy { it.uri } .mapValues { errors -> errors.value.map { it.toDiagnostic() } } @@ -354,30 +259,22 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS override fun documentSymbol(params: DocumentSymbolParams) : CompletableFuture>> = future { - runFeature(symbolProvider, params.textDocument, params) + runFeature(SymbolProvider, params.textDocument, params) .map { Either.forRight(it) } } override fun rename(params: RenameParams): CompletableFuture = future { - runFeature(renameProvider, params.textDocument, params) + runFeature(RenameProvider, params.textDocument, params) } override fun documentLink(params: DocumentLinkParams) : CompletableFuture> = future { - runFeature(linkProvider, params.textDocument, params) + runFeature(LatexIncludeLinkProvider, params.textDocument, params) } override fun completion(params: CompletionParams) : CompletableFuture, CompletionList>> = future { - val uri = URIHelper.parse(params.textDocument.uri) - val items = workspaceActor.withWorkspace { workspace -> - val request = FeatureRequest(uri, workspace, params, logger) - val qualityEvaluator = MatchQualityEvaluator(request.document, params.position) - completionProvider.get(request) - .distinctBy { it.label } - .sortedByDescending { qualityEvaluator.evaluate(it) } - .take(LatexLanguageServerConfig.COMPLETION_LIMIT) - } + val items = runFeature(completionProvider, params.textDocument, params) val allIncludes = items.all { it.kind == CompletionItemKind.Folder || it.kind == CompletionItemKind.File @@ -420,12 +317,12 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS override fun foldingRange(params: FoldingRangeRequestParams) : CompletableFuture> = future { - runFeature(foldingProvider, params.textDocument, params) + runFeature(FoldingProvider, params.textDocument, params) } override fun definition(params: TextDocumentPositionParams) : CompletableFuture> = future { - runFeature(definitionProvider, params.textDocument, params) + runFeature(DefinitionProvider, params.textDocument, params) } override fun hover(params: TextDocumentPositionParams) @@ -450,12 +347,12 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS override fun references(params: ReferenceParams) : CompletableFuture> = future { - runFeature(referenceProvider, params.textDocument, params) + runFeature(ReferenceProvider, params.textDocument, params) } override fun documentHighlight(params: TextDocumentPositionParams) : CompletableFuture> = future { - runFeature(highlightProvider, params.textDocument, params) + runFeature(LatexLabelHighlightProvider, params.textDocument, params) } override fun build(params: BuildParams): CompletableFuture = future { @@ -517,9 +414,9 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS private suspend fun runLinter(uri: URI, text: String) { val config = client.configuration("latex.lint", uri) if (config.onSave) { - latexDiagnosticsProvider.update(uri, text) + diagnosticsProvider.latexProvider.update(uri, text) } else { - latexDiagnosticsProvider.clear(uri) + diagnosticsProvider.latexProvider.clear(uri) } } diff --git a/src/main/kotlin/texlab/completion/CompletionProvider.kt b/src/main/kotlin/texlab/completion/CompletionProvider.kt new file mode 100644 index 000000000..532861e25 --- /dev/null +++ b/src/main/kotlin/texlab/completion/CompletionProvider.kt @@ -0,0 +1,56 @@ +package texlab.completion + +import kotlinx.coroutines.Deferred +import org.eclipse.lsp4j.CompletionItem +import org.eclipse.lsp4j.CompletionParams +import texlab.LatexLanguageServerConfig +import texlab.completion.bibtex.BibtexEntryTypeProvider +import texlab.completion.bibtex.BibtexFieldNameProvider +import texlab.completion.bibtex.BibtexKernelCommandProvider +import texlab.completion.latex.* +import texlab.completion.latex.data.LatexComponentDatabase +import texlab.completion.latex.data.symbols.LatexArgumentSymbolProvider +import texlab.completion.latex.data.symbols.LatexCommandSymbolProvider +import texlab.completion.latex.data.symbols.LatexSymbolDatabase +import texlab.provider.DeferredProvider +import texlab.provider.FeatureProvider +import texlab.provider.FeatureRequest +import texlab.resolver.LatexResolver + +class CompletionProvider(resolver: Deferred, + componentDatabase: Deferred, + symbolDatabase: Deferred) + : FeatureProvider> { + private val provider = FeatureProvider.concat( + LatexIncludeProvider, + DeferredProvider(::LatexClassImportProvider, resolver, emptyList()), + DeferredProvider(::LatexPackageImportProvider, resolver, emptyList()), + PgfLibraryProvider, + TikzLibraryProvider, + LatexCitationProvider, + LatexColorProvider, + DefineColorModelProvider, + DefineColorSetModelProvider, + LatexLabelProvider, + LatexBeginCommandProvider, + DeferredProvider(::LatexComponentEnvironmentProvider, componentDatabase, emptyList()), + LatexKernelEnvironmentProvider, + LatexUserEnvironmentProvider, + DeferredProvider(::LatexArgumentSymbolProvider, symbolDatabase, emptyList()), + DeferredProvider(::LatexCommandSymbolProvider, symbolDatabase, emptyList()), + DeferredProvider(::TikzCommandProvider, componentDatabase, emptyList()), + DeferredProvider(::LatexComponentCommandProvider, componentDatabase, emptyList()), + LatexKernelCommandProvider, + LatexUserCommandProvider, + BibtexEntryTypeProvider, + BibtexFieldNameProvider, + BibtexKernelCommandProvider) + + override suspend fun get(request: FeatureRequest): List { + val qualityEvaluator = MatchQualityEvaluator(request.document, request.params.position) + return provider.get(request) + .distinctBy { it.label } + .sortedByDescending { qualityEvaluator.evaluate(it) } + .take(LatexLanguageServerConfig.COMPLETION_LIMIT) + } +} diff --git a/src/main/kotlin/texlab/definition/DefinitionProvider.kt b/src/main/kotlin/texlab/definition/DefinitionProvider.kt new file mode 100644 index 000000000..16ff42d75 --- /dev/null +++ b/src/main/kotlin/texlab/definition/DefinitionProvider.kt @@ -0,0 +1,10 @@ +package texlab.definition + +import org.eclipse.lsp4j.Location +import org.eclipse.lsp4j.TextDocumentPositionParams +import texlab.provider.FeatureProvider + +object DefinitionProvider : FeatureProvider> +by FeatureProvider.concat( + LatexLabelDefinitionProvider, + BibtexEntryDefinitionProvider) diff --git a/src/main/kotlin/texlab/diagnostics/DiagnosticsProvider.kt b/src/main/kotlin/texlab/diagnostics/DiagnosticsProvider.kt new file mode 100644 index 000000000..e3f76c38e --- /dev/null +++ b/src/main/kotlin/texlab/diagnostics/DiagnosticsProvider.kt @@ -0,0 +1,19 @@ +package texlab.diagnostics + +import org.eclipse.lsp4j.Diagnostic +import texlab.provider.FeatureProvider +import texlab.provider.FeatureRequest + +class DiagnosticsProvider : FeatureProvider> { + val buildProvider = ManualDiagnosticsProvider() + val latexProvider = LatexDiagnosticsProvider() + + private val provider = FeatureProvider.concat( + buildProvider, + BibtexEntryDiagnosticsProvider, + latexProvider) + + override suspend fun get(request: FeatureRequest): List { + return provider.get(request) + } +} diff --git a/src/main/kotlin/texlab/folding/FoldingProvider.kt b/src/main/kotlin/texlab/folding/FoldingProvider.kt new file mode 100644 index 000000000..54af33477 --- /dev/null +++ b/src/main/kotlin/texlab/folding/FoldingProvider.kt @@ -0,0 +1,11 @@ +package texlab.folding + +import org.eclipse.lsp4j.FoldingRange +import org.eclipse.lsp4j.FoldingRangeRequestParams +import texlab.provider.FeatureProvider + +object FoldingProvider : FeatureProvider> by +FeatureProvider.concat( + LatexEnvironmentFoldingProvider, + LatexSectionFoldingProvider, + BibtexDeclarationFoldingProvider) diff --git a/src/main/kotlin/texlab/hover/HoverProvider.kt b/src/main/kotlin/texlab/hover/HoverProvider.kt new file mode 100644 index 000000000..bdbfc855c --- /dev/null +++ b/src/main/kotlin/texlab/hover/HoverProvider.kt @@ -0,0 +1,21 @@ +package texlab.hover + +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.ObsoleteCoroutinesApi +import org.eclipse.lsp4j.Hover +import org.eclipse.lsp4j.TextDocumentPositionParams +import texlab.completion.latex.data.LatexComponentDatabase +import texlab.provider.DeferredProvider +import texlab.provider.FeatureProvider + +@ObsoleteCoroutinesApi +class HoverProvider(componentDatabase: Deferred) + : FeatureProvider by FeatureProvider.choice( + LatexComponentHoverProvider, + LatexCitationHoverProvider, + LatexMathEnvironmentHoverProvider, + LatexMathEquationHoverProvider, + LatexMathInlineHoverProvider, + DeferredProvider(::LatexCommandHoverProvider, componentDatabase, null), + BibtexEntryTypeHoverProvider, + BibtexFieldHoverProvider) diff --git a/src/main/kotlin/texlab/references/ReferenceProvider.kt b/src/main/kotlin/texlab/references/ReferenceProvider.kt new file mode 100644 index 000000000..b84d4a931 --- /dev/null +++ b/src/main/kotlin/texlab/references/ReferenceProvider.kt @@ -0,0 +1,10 @@ +package texlab.references + +import org.eclipse.lsp4j.Location +import org.eclipse.lsp4j.ReferenceParams +import texlab.provider.FeatureProvider + +object ReferenceProvider : FeatureProvider> by +FeatureProvider.concat( + LatexLabelReferenceProvider, + BibtexEntryReferenceProvider) diff --git a/src/main/kotlin/texlab/rename/RenameProvider.kt b/src/main/kotlin/texlab/rename/RenameProvider.kt new file mode 100644 index 000000000..0e0460602 --- /dev/null +++ b/src/main/kotlin/texlab/rename/RenameProvider.kt @@ -0,0 +1,12 @@ +package texlab.rename + +import org.eclipse.lsp4j.RenameParams +import org.eclipse.lsp4j.WorkspaceEdit +import texlab.provider.FeatureProvider + +object RenameProvider : FeatureProvider by +FeatureProvider.choice( + LatexCommandRenamer, + LatexEnvironmentRenamer, + LatexLabelRenamer, + BibtexEntryRenamer) diff --git a/src/main/kotlin/texlab/symbol/SymbolProvider.kt b/src/main/kotlin/texlab/symbol/SymbolProvider.kt new file mode 100644 index 000000000..4b5af2e61 --- /dev/null +++ b/src/main/kotlin/texlab/symbol/SymbolProvider.kt @@ -0,0 +1,13 @@ +package texlab.symbol + +import org.eclipse.lsp4j.DocumentSymbol +import org.eclipse.lsp4j.DocumentSymbolParams +import texlab.provider.FeatureProvider + +object SymbolProvider : FeatureProvider> by +FeatureProvider.concat( + LatexCommandSymbolProvider, + LatexEnvironmentSymbolProvider, + LatexLabelSymbolProvider, + LatexCitationSymbolProvider, + BibtexEntrySymbolProvider)