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