@@ -2,6 +2,7 @@ package dotty.tools.pc.completions
2
2
3
3
import scala .util .Try
4
4
5
+ import dotty .tools .dotc .ast .NavigateAST
5
6
import dotty .tools .dotc .ast .Trees .ValDef
6
7
import dotty .tools .dotc .ast .tpd .*
7
8
import dotty .tools .dotc .core .Constants .Constant
@@ -12,7 +13,10 @@ import dotty.tools.dotc.core.Flags
12
13
import dotty .tools .dotc .core .Flags .Method
13
14
import dotty .tools .dotc .core .NameKinds .DefaultGetterName
14
15
import dotty .tools .dotc .core .Names .Name
16
+ import dotty .tools .dotc .core .StdNames .*
17
+ import dotty .tools .dotc .core .SymDenotations .NoDenotation
15
18
import dotty .tools .dotc .core .Symbols
19
+ import dotty .tools .dotc .core .Symbols .NoSymbol
16
20
import dotty .tools .dotc .core .Symbols .Symbol
17
21
import dotty .tools .dotc .core .Types .AndType
18
22
import dotty .tools .dotc .core .Types .AppliedType
@@ -34,7 +38,7 @@ object NamedArgCompletions:
34
38
pos : SourcePosition ,
35
39
path : List [Tree ],
36
40
indexedContext : IndexedContext ,
37
- clientSupportsSnippets : Boolean
41
+ clientSupportsSnippets : Boolean ,
38
42
)(using ctx : Context ): List [CompletionValue ] =
39
43
path match
40
44
case (ident : Ident ) :: ValDef (_, _, _) :: Block (_, app : Apply ) :: _
@@ -43,7 +47,7 @@ object NamedArgCompletions:
43
47
Some (ident),
44
48
app,
45
49
indexedContext,
46
- clientSupportsSnippets
50
+ clientSupportsSnippets,
47
51
)
48
52
case (ident : Ident ) :: rest =>
49
53
def getApplyForContextFunctionParam (path : List [Tree ]): Option [Apply ] =
@@ -63,9 +67,29 @@ object NamedArgCompletions:
63
67
Some (ident),
64
68
app,
65
69
indexedContext,
66
- clientSupportsSnippets
70
+ clientSupportsSnippets,
67
71
)
68
72
contribution.getOrElse(Nil )
73
+ case (app : Apply ) :: _ =>
74
+ /**
75
+ * def foo(aaa: Int, bbb: Int, ccc: Int) = ???
76
+ * val x = foo(
77
+ * bbb = 123,
78
+ * ccc = 123,
79
+ * @@
80
+ * )
81
+ * In this case, typed path doesn't contain already provided arguments
82
+ */
83
+ NavigateAST .untypedPath(pos.span) match
84
+ case (ident : Ident ) :: (app : Apply ) :: _ =>
85
+ contribute(
86
+ Some (ident),
87
+ app,
88
+ indexedContext,
89
+ clientSupportsSnippets,
90
+ )
91
+ case _ =>
92
+ Nil
69
93
case _ =>
70
94
Nil
71
95
end match
@@ -87,7 +111,7 @@ object NamedArgCompletions:
87
111
ident : Option [Ident ],
88
112
apply : Apply ,
89
113
indexedContext : IndexedContext ,
90
- clientSupportsSnippets : Boolean
114
+ clientSupportsSnippets : Boolean ,
91
115
)(using context : Context ): List [CompletionValue ] =
92
116
def isUselessLiteral (arg : Tree ): Boolean =
93
117
arg match
@@ -117,6 +141,11 @@ object NamedArgCompletions:
117
141
118
142
val argss = collectArgss(apply)
119
143
144
+ def fallbackFindApply (sym : Symbol ) =
145
+ sym.info.member(nme.apply) match
146
+ case NoDenotation => Nil
147
+ case den => List (den.symbol)
148
+
120
149
// fallback for when multiple overloaded methods match the supplied args
121
150
def fallbackFindMatchingMethods () =
122
151
def maybeNameAndIndexedContext (
@@ -182,7 +211,9 @@ object NamedArgCompletions:
182
211
if foundPotential.contains(method.symbol) then foundPotential
183
212
else method.symbol :: foundPotential
184
213
else List (method.symbol)
185
- else fallbackFindMatchingMethods()
214
+ else if method.symbol.is(Method ) || method.symbol == NoSymbol then
215
+ fallbackFindMatchingMethods()
216
+ else fallbackFindApply(method.symbol)
186
217
end if
187
218
end matchingMethods
188
219
@@ -227,8 +258,13 @@ object NamedArgCompletions:
227
258
def refineParams (method : Tree , level : Int ): List [ParamSymbol ] =
228
259
method match
229
260
case Select (Apply (f, _), _) => refineParams(f, level + 1 )
230
- case Select (h, v) => getRefinedParams(h.symbol.info, level)
231
- case _ => defaultBaseParams
261
+ case Select (h, name) =>
262
+ // for Select(foo, name = apply) we want `foo.symbol`
263
+ if name == nme.apply then getRefinedParams(h.symbol.info, level)
264
+ else getRefinedParams(method.symbol.info, level)
265
+ case Apply (f, _) =>
266
+ refineParams(f, level + 1 )
267
+ case _ => getRefinedParams(method.symbol.info, level)
232
268
refineParams(method, 0 )
233
269
end baseParams
234
270
@@ -329,15 +365,15 @@ object NamedArgCompletions:
329
365
param.nameBackticked + " = " + memberName + " "
330
366
CompletionValue .namedArg(
331
367
label = editText,
332
- param
368
+ param,
333
369
)
334
370
}
335
371
}
336
372
337
373
params.map(p =>
338
374
CompletionValue .namedArg(
339
375
s " ${p.nameBackticked} = " ,
340
- p
376
+ p,
341
377
)
342
378
) ::: findPossibleDefaults() ::: fillAllFields()
343
379
end contribute
@@ -410,4 +446,4 @@ case class JustSymbol(symbol: Symbol)(using Context) extends ParamSymbol:
410
446
def info : Type = symbol.info
411
447
412
448
case class RefinedSymbol (symbol : Symbol , name : Name , info : Type )
413
- extends ParamSymbol
449
+ extends ParamSymbol
0 commit comments