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