Skip to content

Commit 5c4d2a7

Browse files
committed
perf: migrate to codeAction/resolve
1 parent 6ba8f47 commit 5c4d2a7

File tree

1 file changed

+48
-11
lines changed

1 file changed

+48
-11
lines changed

metals/src/main/scala/scala/meta/internal/metals/codeactions/FilterMapToCollectCodeAction.scala

+48-11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import scala.concurrent.ExecutionContext
44
import scala.concurrent.Future
55

66
import scala.meta._
7+
import scala.meta.internal.metals.JsonParser._
78
import scala.meta.internal.metals.MetalsEnrichments._
89
import scala.meta.internal.metals.codeactions.CodeAction
910
import scala.meta.internal.metals.codeactions.CodeActionBuilder
@@ -16,19 +17,62 @@ import org.eclipse.{lsp4j => l}
1617
class FilterMapToCollectCodeAction(trees: Trees) extends CodeAction {
1718
override def kind: String = l.CodeActionKind.RefactorRewrite
1819

20+
private case class FilterMapCollectParams(
21+
param: l.TextDocumentIdentifier,
22+
pos: l.Position,
23+
)
24+
25+
override def resolveCodeAction(codeAction: l.CodeAction, token: CancelToken)(
26+
implicit ec: ExecutionContext
27+
): Option[Future[l.CodeAction]] = {
28+
println(codeAction.getData.toJson)
29+
val edits = for {
30+
data <- codeAction.getData.toJson.as[FilterMapCollectParams].toOption
31+
params = data.param
32+
uri = params.getUri()
33+
path = uri.toAbsolutePath
34+
} yield trees
35+
.findLastEnclosingAt[Term.Apply](path, data.pos)
36+
.flatMap(findFilterMapChain)
37+
.map(toTextEdit(_))
38+
.map(edit => List(uri -> List(edit)))
39+
.getOrElse(Nil)
40+
41+
edits match {
42+
case None | (Some(Nil)) => None
43+
case Some(xs) => {
44+
val workspaceEdit = new l.WorkspaceEdit(
45+
xs.map { case (uri, edits) => uri -> edits.asJava }.toMap.asJava
46+
)
47+
codeAction.setEdit(workspaceEdit)
48+
Some(Future.successful(codeAction))
49+
}
50+
}
51+
}
52+
1953
override def contribute(params: CodeActionParams, token: CancelToken)(implicit
2054
ec: ExecutionContext
2155
): Future[Seq[l.CodeAction]] = Future {
2256
val uri = params.getTextDocument().getUri()
2357

2458
val path = uri.toAbsolutePath
25-
val range = params.getRange()
59+
val start = params.getRange.getStart
2660

2761
trees
28-
.findLastEnclosingAt[Term.Apply](path, range.getStart())
62+
.findLastEnclosingAt[Term.Apply](path, start)
2963
.flatMap(findFilterMapChain)
30-
.map(toTextEdit(_))
31-
.map(toCodeAction(uri, _))
64+
.map(_ => {
65+
val data =
66+
FilterMapCollectParams(
67+
params.getTextDocument(),
68+
start,
69+
)
70+
CodeActionBuilder.build(
71+
title = FilterMapToCollectCodeAction.title,
72+
kind = this.kind,
73+
data = Some(data.toJsonObject),
74+
)
75+
})
3276
.toSeq
3377
}
3478

@@ -66,13 +110,6 @@ class FilterMapToCollectCodeAction(trees: Trees) extends CodeAction {
66110
new l.TextEdit(chain.pos.toLsp, indented)
67111
}
68112

69-
private def toCodeAction(uri: String, textEdit: l.TextEdit): l.CodeAction =
70-
CodeActionBuilder.build(
71-
title = FilterMapToCollectCodeAction.title,
72-
kind = this.kind,
73-
changes = List(uri.toAbsolutePath -> List(textEdit)),
74-
)
75-
76113
private implicit class FunctionOps(fn: Term.Function) {
77114
def renameParam(to: Term.Name): Term = {
78115
val fnParamName = fn.params.head.name.value

0 commit comments

Comments
 (0)