Skip to content

Commit e86fe29

Browse files
committed
Use resolveCodeAction instead of codeAction; unignore test case for nightly
1 parent 0d0d81d commit e86fe29

File tree

4 files changed

+38
-48
lines changed

4 files changed

+38
-48
lines changed

metals/src/main/scala/scala/meta/internal/metals/ServerCommands.scala

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -661,20 +661,6 @@ object ServerCommands {
661661
|""".stripMargin,
662662
)
663663

664-
final case class ConvertToNamedLambdaParametersRequest(
665-
position: TextDocumentPositionParams
666-
)
667-
val ConvertToNamedLambdaParameters =
668-
new ParametrizedCommand[ConvertToNamedLambdaParametersRequest](
669-
"convert-to-named-lambda-parameters",
670-
"Convert wildcard lambda parameters to named parameters",
671-
"""|Whenever a user chooses code action to convert to named lambda parameters, this command is later run to
672-
|rewrite the lambda to use named parameters.
673-
|""".stripMargin,
674-
"""|Object with [TextDocumentPositionParams](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocumentPositionParams) of the target lambda
675-
|""".stripMargin,
676-
)
677-
678664
val GotoLog = new Command(
679665
"goto-log",
680666
"Check logs",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ final class CodeActionProvider(
4949
new ConvertCommentCodeAction(buffers),
5050
new RemoveInvalidImportQuickFix(trees, buildTargets),
5151
new SourceRemoveInvalidImports(trees, buildTargets, diagnostics),
52-
new ConvertToNamedLambdaParameters(trees, compilers, languageClient),
52+
new ConvertToNamedLambdaParameters(trees, compilers),
5353
)
5454

5555
def actionsForParams(params: l.CodeActionParams): List[CodeAction] = {

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

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import scala.concurrent.Future
55

66
import scala.meta.Term
77
import scala.meta.internal.metals.Compilers
8+
import scala.meta.internal.metals.JsonParser
9+
import scala.meta.internal.metals.JsonParser.XtensionSerializableToJson
810
import scala.meta.internal.metals.MetalsEnrichments._
9-
import scala.meta.internal.metals.ServerCommands
10-
import scala.meta.internal.metals.clients.language.MetalsLanguageClient
1111
import scala.meta.internal.metals.codeactions.CodeAction
1212
import scala.meta.internal.metals.codeactions.CodeActionBuilder
1313
import scala.meta.internal.metals.logging
@@ -26,39 +26,42 @@ import org.eclipse.{lsp4j => l}
2626
class ConvertToNamedLambdaParameters(
2727
trees: Trees,
2828
compilers: Compilers,
29-
languageClient: MetalsLanguageClient,
3029
) extends CodeAction {
3130

3231
override val kind: String = l.CodeActionKind.RefactorRewrite
3332

34-
override type CommandData =
35-
ServerCommands.ConvertToNamedLambdaParametersRequest
33+
private val parser = new JsonParser.Of[ConvertToNamedLambdaParametersParams]
3634

37-
override def command: Option[ActionCommand] = Some(
38-
ServerCommands.ConvertToNamedLambdaParameters
35+
private case class ConvertToNamedLambdaParametersParams(
36+
position: l.TextDocumentPositionParams
3937
)
4038

41-
override def handleCommand(
42-
data: ServerCommands.ConvertToNamedLambdaParametersRequest,
39+
override def resolveCodeAction(
40+
codeAction: l.CodeAction,
4341
token: CancelToken,
44-
)(implicit ec: ExecutionContext): Future[Unit] = {
45-
val uri = data.position.getTextDocument().getUri()
46-
for {
47-
edits <- compilers.codeAction(
48-
data.position,
49-
token,
50-
CodeActionId.ConvertToNamedLambdaParameters,
51-
None,
52-
)
53-
_ = logging.logErrorWhen(
54-
edits.isEmpty(),
55-
s"Could not convert lambda at position ${data.position} to named lambda",
56-
)
57-
workspaceEdit = new l.WorkspaceEdit(Map(uri -> edits).asJava)
58-
_ <- languageClient
59-
.applyEdit(new l.ApplyWorkspaceEditParams(workspaceEdit))
60-
.asScala
61-
} yield ()
42+
)(implicit ec: ExecutionContext): Option[Future[l.CodeAction]] = {
43+
val data = codeAction.getData()
44+
data match {
45+
case parser.Jsonized(data) =>
46+
Some {
47+
val uri = data.position.getTextDocument().getUri()
48+
for {
49+
edits <- compilers.codeAction(
50+
data.position,
51+
token,
52+
CodeActionId.ConvertToNamedLambdaParameters,
53+
None,
54+
)
55+
_ = logging.logErrorWhen(
56+
edits.isEmpty(),
57+
s"Could not convert lambda at position ${data.position} to named lambda",
58+
)
59+
workspaceEdit = new l.WorkspaceEdit(Map(uri -> edits).asJava)
60+
_ = codeAction.setEdit(workspaceEdit)
61+
} yield codeAction
62+
}
63+
case _ => None
64+
}
6265
}
6366

6467
override def contribute(
@@ -75,14 +78,14 @@ class ConvertToNamedLambdaParameters(
7578
params.getTextDocument(),
7679
new l.Position(lambda.pos.startLine, lambda.pos.startColumn),
7780
)
78-
val command =
79-
ServerCommands.ConvertToNamedLambdaParameters.toLsp(
80-
ServerCommands.ConvertToNamedLambdaParametersRequest(position)
81+
val data =
82+
ConvertToNamedLambdaParametersParams(
83+
position = position
8184
)
8285
val codeAction = CodeActionBuilder.build(
8386
title = ConvertToNamedLambdaParameters.title,
8487
kind = kind,
85-
command = Some(command),
88+
data = Some(data.toJsonObject),
8689
)
8790
Future.successful(Seq(codeAction))
8891
}

tests/slow/src/test/scala/tests/feature/Scala3CodeActionLspSuite.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -773,15 +773,15 @@ class Scala3CodeActionLspSuite
773773
)
774774

775775
check(
776-
"wildcard lambda".ignore,
776+
"wildcard lambda",
777777
"""|package a
778778
|
779779
|object A {
780780
| val l = List(1, 2, 3)
781781
| l.map(_ + <<1>>)
782782
|}
783783
|""".stripMargin,
784-
s"""|${ConvertToNamedArguments.title("l.map(...)")}
784+
s"""|${ConvertToNamedArguments.title("map(...)")}
785785
|${ConvertToNamedLambdaParameters.title}
786786
|""".stripMargin,
787787
"""|package a
@@ -792,6 +792,7 @@ class Scala3CodeActionLspSuite
792792
|}
793793
|""".stripMargin,
794794
selectedActionIndex = 1,
795+
scalaVersion = "3.7.1-RC1-bin-20250501-83ffe00-NIGHTLY",
795796
)
796797

797798
private def getPath(name: String) = s"a/src/main/scala/a/$name"

0 commit comments

Comments
 (0)