Skip to content

Commit

Permalink
Extract declaration of top level provider
Browse files Browse the repository at this point in the history
  • Loading branch information
efoerster committed Mar 8, 2019
1 parent 8a95546 commit 9d2980d
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 125 deletions.
147 changes: 22 additions & 125 deletions src/main/kotlin/texlab/LatexLanguageServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -122,88 +106,9 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS
LatexLanguageServerConfig.SYMBOL_DATABASE_DIRECTORY)
}

private val completionProvider: FeatureProvider<CompletionParams, List<CompletionItem>> =
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<DocumentSymbolParams, List<DocumentSymbol>> =
FeatureProvider.concat(
LatexCommandSymbolProvider,
LatexEnvironmentSymbolProvider,
LatexLabelSymbolProvider,
LatexCitationSymbolProvider,
BibtexEntrySymbolProvider)

private val renameProvider: FeatureProvider<RenameParams, WorkspaceEdit?> =
FeatureProvider.choice(
LatexCommandRenamer,
LatexEnvironmentRenamer,
LatexLabelRenamer,
BibtexEntryRenamer)

private val foldingProvider: FeatureProvider<FoldingRangeRequestParams, List<FoldingRange>> =
FeatureProvider.concat(
LatexEnvironmentFoldingProvider,
LatexSectionFoldingProvider,
BibtexDeclarationFoldingProvider)

private val linkProvider: FeatureProvider<DocumentLinkParams, List<DocumentLink>> =
FeatureProvider.concat(LatexIncludeLinkProvider)

private val definitionProvider: FeatureProvider<TextDocumentPositionParams, List<Location>> =
FeatureProvider.concat(
LatexLabelDefinitionProvider,
BibtexEntryDefinitionProvider)

private val highlightProvider: FeatureProvider<TextDocumentPositionParams, List<DocumentHighlight>> =
FeatureProvider.concat(LatexLabelHighlightProvider)

private val hoverProvider: FeatureProvider<TextDocumentPositionParams, Hover?> =
FeatureProvider.choice(
LatexComponentHoverProvider,
LatexCitationHoverProvider,
LatexMathEnvironmentHoverProvider,
LatexMathEquationHoverProvider,
LatexMathInlineHoverProvider,
DeferredProvider(::LatexCommandHoverProvider, componentDatabase, null),
BibtexEntryTypeHoverProvider,
BibtexFieldHoverProvider)

private val referenceProvider: FeatureProvider<ReferenceParams, List<Location>> =
FeatureProvider.concat(
LatexLabelReferenceProvider,
BibtexEntryReferenceProvider)

private val buildDiagnosticsProvider: ManualDiagnosticsProvider = ManualDiagnosticsProvider()
private val latexDiagnosticsProvider: LatexDiagnosticsProvider = LatexDiagnosticsProvider()

private val diagnosticsProvider: FeatureProvider<Unit, List<Diagnostic>> =
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
Expand Down Expand Up @@ -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() } }

Expand Down Expand Up @@ -354,30 +259,22 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS

override fun documentSymbol(params: DocumentSymbolParams)
: CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> = future {
runFeature(symbolProvider, params.textDocument, params)
runFeature(SymbolProvider, params.textDocument, params)
.map { Either.forRight<SymbolInformation, DocumentSymbol>(it) }
}

override fun rename(params: RenameParams): CompletableFuture<WorkspaceEdit?> = future {
runFeature(renameProvider, params.textDocument, params)
runFeature(RenameProvider, params.textDocument, params)
}

override fun documentLink(params: DocumentLinkParams)
: CompletableFuture<List<DocumentLink>> = future {
runFeature(linkProvider, params.textDocument, params)
runFeature(LatexIncludeLinkProvider, params.textDocument, params)
}

override fun completion(params: CompletionParams)
: CompletableFuture<Either<List<CompletionItem>, 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
Expand Down Expand Up @@ -420,12 +317,12 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS

override fun foldingRange(params: FoldingRangeRequestParams)
: CompletableFuture<List<FoldingRange>> = future {
runFeature(foldingProvider, params.textDocument, params)
runFeature(FoldingProvider, params.textDocument, params)
}

override fun definition(params: TextDocumentPositionParams)
: CompletableFuture<List<Location>> = future {
runFeature(definitionProvider, params.textDocument, params)
runFeature(DefinitionProvider, params.textDocument, params)
}

override fun hover(params: TextDocumentPositionParams)
Expand All @@ -450,12 +347,12 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS

override fun references(params: ReferenceParams)
: CompletableFuture<List<Location>> = future {
runFeature(referenceProvider, params.textDocument, params)
runFeature(ReferenceProvider, params.textDocument, params)
}

override fun documentHighlight(params: TextDocumentPositionParams)
: CompletableFuture<List<DocumentHighlight>> = future {
runFeature(highlightProvider, params.textDocument, params)
runFeature(LatexLabelHighlightProvider, params.textDocument, params)
}

override fun build(params: BuildParams): CompletableFuture<BuildResult> = future {
Expand Down Expand Up @@ -517,9 +414,9 @@ class LatexLanguageServer : LanguageServer, LatexTextDocumentService, WorkspaceS
private suspend fun runLinter(uri: URI, text: String) {
val config = client.configuration<LatexLinterConfig>("latex.lint", uri)
if (config.onSave) {
latexDiagnosticsProvider.update(uri, text)
diagnosticsProvider.latexProvider.update(uri, text)
} else {
latexDiagnosticsProvider.clear(uri)
diagnosticsProvider.latexProvider.clear(uri)
}
}

Expand Down
56 changes: 56 additions & 0 deletions src/main/kotlin/texlab/completion/CompletionProvider.kt
Original file line number Diff line number Diff line change
@@ -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<LatexResolver>,
componentDatabase: Deferred<LatexComponentDatabase>,
symbolDatabase: Deferred<LatexSymbolDatabase>)
: FeatureProvider<CompletionParams, List<CompletionItem>> {
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<CompletionParams>): List<CompletionItem> {
val qualityEvaluator = MatchQualityEvaluator(request.document, request.params.position)
return provider.get(request)
.distinctBy { it.label }
.sortedByDescending { qualityEvaluator.evaluate(it) }
.take(LatexLanguageServerConfig.COMPLETION_LIMIT)
}
}
10 changes: 10 additions & 0 deletions src/main/kotlin/texlab/definition/DefinitionProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package texlab.definition

import org.eclipse.lsp4j.Location
import org.eclipse.lsp4j.TextDocumentPositionParams
import texlab.provider.FeatureProvider

object DefinitionProvider : FeatureProvider<TextDocumentPositionParams, List<Location>>
by FeatureProvider.concat(
LatexLabelDefinitionProvider,
BibtexEntryDefinitionProvider)
19 changes: 19 additions & 0 deletions src/main/kotlin/texlab/diagnostics/DiagnosticsProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package texlab.diagnostics

import org.eclipse.lsp4j.Diagnostic
import texlab.provider.FeatureProvider
import texlab.provider.FeatureRequest

class DiagnosticsProvider : FeatureProvider<Unit, List<Diagnostic>> {
val buildProvider = ManualDiagnosticsProvider()
val latexProvider = LatexDiagnosticsProvider()

private val provider = FeatureProvider.concat(
buildProvider,
BibtexEntryDiagnosticsProvider,
latexProvider)

override suspend fun get(request: FeatureRequest<Unit>): List<Diagnostic> {
return provider.get(request)
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/texlab/folding/FoldingProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package texlab.folding

import org.eclipse.lsp4j.FoldingRange
import org.eclipse.lsp4j.FoldingRangeRequestParams
import texlab.provider.FeatureProvider

object FoldingProvider : FeatureProvider<FoldingRangeRequestParams, List<FoldingRange>> by
FeatureProvider.concat(
LatexEnvironmentFoldingProvider,
LatexSectionFoldingProvider,
BibtexDeclarationFoldingProvider)
21 changes: 21 additions & 0 deletions src/main/kotlin/texlab/hover/HoverProvider.kt
Original file line number Diff line number Diff line change
@@ -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<LatexComponentDatabase>)
: FeatureProvider<TextDocumentPositionParams, Hover?> by FeatureProvider.choice(
LatexComponentHoverProvider,
LatexCitationHoverProvider,
LatexMathEnvironmentHoverProvider,
LatexMathEquationHoverProvider,
LatexMathInlineHoverProvider,
DeferredProvider(::LatexCommandHoverProvider, componentDatabase, null),
BibtexEntryTypeHoverProvider,
BibtexFieldHoverProvider)
10 changes: 10 additions & 0 deletions src/main/kotlin/texlab/references/ReferenceProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package texlab.references

import org.eclipse.lsp4j.Location
import org.eclipse.lsp4j.ReferenceParams
import texlab.provider.FeatureProvider

object ReferenceProvider : FeatureProvider<ReferenceParams, List<Location>> by
FeatureProvider.concat(
LatexLabelReferenceProvider,
BibtexEntryReferenceProvider)
12 changes: 12 additions & 0 deletions src/main/kotlin/texlab/rename/RenameProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package texlab.rename

import org.eclipse.lsp4j.RenameParams
import org.eclipse.lsp4j.WorkspaceEdit
import texlab.provider.FeatureProvider

object RenameProvider : FeatureProvider<RenameParams, WorkspaceEdit?> by
FeatureProvider.choice(
LatexCommandRenamer,
LatexEnvironmentRenamer,
LatexLabelRenamer,
BibtexEntryRenamer)
13 changes: 13 additions & 0 deletions src/main/kotlin/texlab/symbol/SymbolProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package texlab.symbol

import org.eclipse.lsp4j.DocumentSymbol
import org.eclipse.lsp4j.DocumentSymbolParams
import texlab.provider.FeatureProvider

object SymbolProvider : FeatureProvider<DocumentSymbolParams, List<DocumentSymbol>> by
FeatureProvider.concat(
LatexCommandSymbolProvider,
LatexEnvironmentSymbolProvider,
LatexLabelSymbolProvider,
LatexCitationSymbolProvider,
BibtexEntrySymbolProvider)

0 comments on commit 9d2980d

Please sign in to comment.