Skip to content

Commit 64352ef

Browse files
jkcieslukWojciechMazur
authored andcommitted
bugfix: Named args completions with default values
[Cherry-picked 6f43fee]
1 parent bebc331 commit 64352ef

File tree

2 files changed

+118
-4
lines changed

2 files changed

+118
-4
lines changed

presentation-compiler/src/main/dotty/tools/pc/completions/NamedArgCompletions.scala

+13-4
Original file line numberDiff line numberDiff line change
@@ -237,15 +237,24 @@ object NamedArgCompletions:
237237
.getOrElse(baseArgs)
238238
.filterNot(isUselessLiteral)
239239

240+
@tailrec
241+
def isDefaultArg(t: Tree): Boolean = t match
242+
// default args
243+
case Ident(name) => name.is(DefaultGetterName)
244+
// default args for methods defined in object
245+
case Select(_, name) =>
246+
name.is(DefaultGetterName)
247+
// default args in not-first parameter list
248+
// eg. def m(fst: Int)(snd: Int)(arg1: Int, arg2: Int = 123) = ???
249+
case Apply(fun, _) => isDefaultArg(fun)
250+
case _ => false
251+
240252
val isNamed: Set[Name] = args.iterator
241253
.zip(baseParams.iterator)
242254
// filter out synthesized args and default arg getters
243255
.filterNot {
244256
case (arg, _) if arg.symbol.denot.is(Flags.Synthetic) => true
245-
case (Ident(name), _) => name.is(DefaultGetterName) // default args
246-
case (Select(Ident(_), name), _) =>
247-
name.is(DefaultGetterName) // default args for apply method
248-
case _ => false
257+
case (arg, _) => isDefaultArg(arg)
249258
}
250259
.map {
251260
case (NamedArg(name, _), _) => name

presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionArgSuite.scala

+105
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,111 @@ class CompletionArgSuite extends BaseCompletionSuite:
238238
""
239239
)
240240

241+
@Test def `default-args` =
242+
check(
243+
s"""|object Main {
244+
| def foo() = {
245+
| def deployment(
246+
| fst: Option[String],
247+
| snd: Int = 1,
248+
| ): Option[Int] = ???
249+
| val abc = deployment(@@)
250+
| }
251+
|}
252+
|""".stripMargin,
253+
"""|fst = : Option[String]
254+
|snd = : Int
255+
|""".stripMargin,
256+
topLines = Some(2),
257+
)
258+
@Test def `default-args2` =
259+
check(
260+
s"""|object Main {
261+
| def deployment(
262+
| fst: Option[String],
263+
| snd: Int = 1,
264+
| ): Option[Int] = ???
265+
| val abc = deployment(@@)
266+
|}
267+
|""".stripMargin,
268+
"""|fst = : Option[String]
269+
|snd = : Int
270+
|""".stripMargin,
271+
topLines = Some(2),
272+
)
273+
274+
@Test def `default-args3` =
275+
check(
276+
s"""|object Main {
277+
| def deployment(str: String)(
278+
| fst: Option[String],
279+
| snd: Int = 1,
280+
| ): Option[Int] = ???
281+
| val abc = deployment("str")(
282+
| @@
283+
| )
284+
|}
285+
|""".stripMargin,
286+
"""|fst = : Option[String]
287+
|snd = : Int
288+
|""".stripMargin,
289+
topLines = Some(2),
290+
)
291+
292+
@Test def `default-args4` =
293+
check(
294+
s"""|object Main {
295+
| def deployment(str: String)(opt: Option[Int])(
296+
| fst: Option[String],
297+
| snd: Int = 1,
298+
| ): Option[Int] = ???
299+
| val abc = deployment("str")(None)(
300+
| @@
301+
| )
302+
|}
303+
|""".stripMargin,
304+
"""|fst = : Option[String]
305+
|snd = : Int
306+
|""".stripMargin,
307+
topLines = Some(2),
308+
)
309+
310+
@Test def `default-args5` =
311+
check(
312+
s"""|object Main {
313+
| def deployment(str: String)(opt: Option[Int] = None)(
314+
| fst: Option[String],
315+
| snd: Int = 1,
316+
| ): Option[Int] = ???
317+
| val abc = deployment("str")(
318+
| @@
319+
| )
320+
|}
321+
|""".stripMargin,
322+
"""|opt = : Option[Int]
323+
|""".stripMargin,
324+
topLines = Some(1),
325+
)
326+
327+
@Test def `default-args6` =
328+
check(
329+
s"""|object Main {
330+
| def deployment(using str: String)(
331+
| fst: Option[String],
332+
| snd: Int = 1,
333+
| ): Option[Int] = ???
334+
| val abc = deployment(using "str")(
335+
| @@
336+
| )
337+
|}
338+
|""".stripMargin,
339+
"""|fst = : Option[String]
340+
|snd = : Int
341+
|""".stripMargin,
342+
topLines = Some(2),
343+
)
344+
345+
241346
// @Test def `explicit-dollar` =
242347
// checkSnippet( // see: https://github.com/scalameta/metals/issues/2400
243348
// """

0 commit comments

Comments
 (0)