/
CodeLensProvider.scala
36 lines (32 loc) 路 1.28 KB
/
CodeLensProvider.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package scala.meta.internal.metals
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.meta.internal.implementation.TextDocumentWithPath
import scala.meta.internal.metals.codelenses.CodeLens
import scala.meta.internal.mtags.Semanticdbs
import scala.meta.io.AbsolutePath
import org.eclipse.{lsp4j => l}
final class CodeLensProvider(
codeLensProviders: List[CodeLens],
semanticdbs: Semanticdbs,
stacktraceAnalyzer: StacktraceAnalyzer,
)(implicit val ec: ExecutionContext) {
// code lenses will be refreshed after compilation or when workspace gets indexed
def findLenses(path: AbsolutePath): Future[Seq[l.CodeLens]] = {
if (stacktraceAnalyzer.isStackTraceFile(path)) {
Future(stacktraceAnalyzer.stacktraceLenses(path))
} else {
val enabledCodelenses = codeLensProviders.filter(_.isEnabled)
val semanticdbCodeLenses = semanticdbs
.textDocument(path)
.documentIncludingStale
.map { textDocument =>
val doc = TextDocumentWithPath(textDocument, path)
enabledCodelenses.map(_.codeLenses(doc))
}
.getOrElse(Seq.empty)
val otherCodeLenses = enabledCodelenses.map(_.codeLenses(path))
Future.sequence(semanticdbCodeLenses ++ otherCodeLenses).map(_.flatten)
}
}
}