@@ -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
@@ -75,7 +101,7 @@ object NamedArgCompletions:
75
101
ident : Option [Ident ],
76
102
apply : Apply ,
77
103
indexedContext : IndexedContext ,
78
- clientSupportsSnippets : Boolean
104
+ clientSupportsSnippets : Boolean ,
79
105
)(using context : Context ): List [CompletionValue ] =
80
106
def isUselessLiteral (arg : Tree ): Boolean =
81
107
arg match
@@ -105,6 +131,11 @@ object NamedArgCompletions:
105
131
106
132
val argss = collectArgss(apply)
107
133
134
+ def fallbackFindApply (sym : Symbol ) =
135
+ sym.info.member(nme.apply) match
136
+ case NoDenotation => Nil
137
+ case den => List (den.symbol)
138
+
108
139
// fallback for when multiple overloaded methods match the supplied args
109
140
def fallbackFindMatchingMethods () =
110
141
def maybeNameAndIndexedContext (
@@ -170,7 +201,9 @@ object NamedArgCompletions:
170
201
if foundPotential.contains(method.symbol) then foundPotential
171
202
else method.symbol :: foundPotential
172
203
else List (method.symbol)
173
- else fallbackFindMatchingMethods()
204
+ else if method.symbol.is(Method ) || method.symbol == NoSymbol then
205
+ fallbackFindMatchingMethods()
206
+ else fallbackFindApply(method.symbol)
174
207
end if
175
208
end matchingMethods
176
209
@@ -215,8 +248,13 @@ object NamedArgCompletions:
215
248
def refineParams (method : Tree , level : Int ): List [ParamSymbol ] =
216
249
method match
217
250
case Select (Apply (f, _), _) => refineParams(f, level + 1 )
218
- case Select (h, v) => getRefinedParams(h.symbol.info, level)
219
- case _ => defaultBaseParams
251
+ case Select (h, name) =>
252
+ // for Select(foo, name = apply) we want `foo.symbol`
253
+ if name == nme.apply then getRefinedParams(h.symbol.info, level)
254
+ else getRefinedParams(method.symbol.info, level)
255
+ case Apply (f, _) =>
256
+ refineParams(f, level + 1 )
257
+ case _ => getRefinedParams(method.symbol.info, level)
220
258
refineParams(method, 0 )
221
259
end baseParams
222
260
@@ -318,15 +356,15 @@ object NamedArgCompletions:
318
356
param.nameBackticked + " = " + memberName + " "
319
357
CompletionValue .namedArg(
320
358
label = editText,
321
- param
359
+ param,
322
360
)
323
361
}
324
362
}
325
363
326
364
params.map(p =>
327
365
CompletionValue .namedArg(
328
366
s " ${p.nameBackticked} = " ,
329
- p
367
+ p,
330
368
)
331
369
) ::: findPossibleDefaults() ::: fillAllFields()
332
370
end contribute
@@ -399,4 +437,4 @@ case class JustSymbol(symbol: Symbol)(using Context) extends ParamSymbol:
399
437
def info : Type = symbol.info
400
438
401
439
case class RefinedSymbol (symbol : Symbol , name : Name , info : Type )
402
- extends ParamSymbol
440
+ extends ParamSymbol
0 commit comments