From 1f7cae435593fb8a3045e49ed8cbeb9f39d45654 Mon Sep 17 00:00:00 2001 From: Michal Pawlik Date: Thu, 30 Jan 2025 18:04:37 +0100 Subject: [PATCH] Fix extracting values for fewer braces --- .../codeactions/ExtractValueCodeAction.scala | 24 +++++++++---- .../codeactions/ExtractValueLspSuite.scala | 34 +++++++++++++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/metals/src/main/scala/scala/meta/internal/metals/codeactions/ExtractValueCodeAction.scala b/metals/src/main/scala/scala/meta/internal/metals/codeactions/ExtractValueCodeAction.scala index a590063f2a4..c0850559fac 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/codeactions/ExtractValueCodeAction.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/codeactions/ExtractValueCodeAction.scala @@ -50,9 +50,9 @@ class ExtractValueCodeAction( term <- allTrees names = MetalsNames(term, "newValue") stats <- lastEnclosingStatsList(term) - argument <- findRangeEnclosing(term, range) + extractedValue <- findRangeEnclosing(term, range) // avoid extracting lambdas (this needs actual type information) - if isNotLambda(argument) + if isNotLambda(extractedValue) stat <- stats.find(stat => stat.pos.encloses(term.pos)) name = names.createNewName() source <- buffers.get(path) @@ -65,13 +65,17 @@ class ExtractValueCodeAction( val replacementText = term match { case apply: Term.Apply - if argument.is[Term.Block] && !applyHasParens(apply) => + if extractedValue.is[Term.Block] && !applyHasParens(apply) => s"($name)" case _ => name } - val valueText = s"$keyword$name = ${argument.toString()}" + + val redactedValue = ExtractValueCodeAction.removeFewerBracesBlock( + extractedValue.toString() + ) + val valueText = s"$keyword$name = ${redactedValue}" val replacedArgument = - new l.TextEdit(argument.pos.toLsp, replacementText) + new l.TextEdit(extractedValue.pos.toLsp, replacementText) // we will insert `val newValue = ???` before the existing statement containing apply ( withInsertNewValueDef( @@ -81,7 +85,7 @@ class ExtractValueCodeAction( blank, replacedArgument, ), - argument.toString(), + extractedValue.toString(), ) } @@ -94,6 +98,7 @@ class ExtractValueCodeAction( } } + private def applyArgument(argument: Term): Term = argument match { // named parameter @@ -350,9 +355,14 @@ class ExtractValueCodeAction( object ExtractValueCodeAction { def title(expr: String): String = { - val trimmed = expr.trim.stripPrefix("{").stripSuffix("}").trim() + val trimmed = removeFewerBracesBlock.andThen(stripBraces)(expr.trim) if (trimmed.length <= 10) s"Extract `$trimmed` as value" else s"Extract `${trimmed.take(10)}` ... as value" } + private def removeFewerBracesBlock(extractedValue: String): String = + extractedValue.toString().dropWhile(_ == ' ').stripPrefix(":") + + private def stripBraces(input: String): String = + input.stripPrefix("{").stripSuffix("}").trim() } diff --git a/tests/unit/src/test/scala/tests/codeactions/ExtractValueLspSuite.scala b/tests/unit/src/test/scala/tests/codeactions/ExtractValueLspSuite.scala index 404b9793e77..32ea897eda7 100644 --- a/tests/unit/src/test/scala/tests/codeactions/ExtractValueLspSuite.scala +++ b/tests/unit/src/test/scala/tests/codeactions/ExtractValueLspSuite.scala @@ -453,5 +453,39 @@ class ExtractValueLspSuite | ) |}""".stripMargin, ) + check( + "extract-value-fewer-braces", + """|import scala.util.Try + | + |def main = + | val x = Try: + | So<>e(new Exception)""".stripMargin, + s"""${ExtractValueCodeAction.title("Some(new E` ... as value")}""", + """|import scala.util.Try + | + |def main = + | val newValue = + | Some(new Exception) + | val x = Try(newValue)""".stripMargin, + scalaVersion = "3.3.4", + ) + check( + "extract-value-fewer-braces-multiline", + """|import scala.util.Try + | + |def main = + | val x = Try: + | println("hello") + | So<>e(new Exception)""".stripMargin, + s"""${ExtractValueCodeAction.title("println(\"h` ... as value")}""", + """|import scala.util.Try + | + |def main = + | val newValue = + | println("hello") + | Some(new Exception) + | val x = Try(newValue)""".stripMargin, + scalaVersion = "3.3.4", + ) }