@@ -4,6 +4,7 @@ import scala.concurrent.ExecutionContext
4
4
import scala .concurrent .Future
5
5
6
6
import scala .meta ._
7
+ import scala .meta .internal .metals .JsonParser ._
7
8
import scala .meta .internal .metals .MetalsEnrichments ._
8
9
import scala .meta .internal .metals .codeactions .CodeAction
9
10
import scala .meta .internal .metals .codeactions .CodeActionBuilder
@@ -16,19 +17,62 @@ import org.eclipse.{lsp4j => l}
16
17
class FilterMapToCollectCodeAction (trees : Trees ) extends CodeAction {
17
18
override def kind : String = l.CodeActionKind .RefactorRewrite
18
19
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
+
19
53
override def contribute (params : CodeActionParams , token : CancelToken )(implicit
20
54
ec : ExecutionContext
21
55
): Future [Seq [l.CodeAction ]] = Future {
22
56
val uri = params.getTextDocument().getUri()
23
57
24
58
val path = uri.toAbsolutePath
25
- val range = params.getRange()
59
+ val start = params.getRange.getStart
26
60
27
61
trees
28
- .findLastEnclosingAt[Term .Apply ](path, range.getStart() )
62
+ .findLastEnclosingAt[Term .Apply ](path, start )
29
63
.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
+ })
32
76
.toSeq
33
77
}
34
78
@@ -66,13 +110,6 @@ class FilterMapToCollectCodeAction(trees: Trees) extends CodeAction {
66
110
new l.TextEdit (chain.pos.toLsp, indented)
67
111
}
68
112
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
-
76
113
private implicit class FunctionOps (fn : Term .Function ) {
77
114
def renameParam (to : Term .Name ): Term = {
78
115
val fnParamName = fn.params.head.name.value
0 commit comments