@@ -32,6 +32,8 @@ import dotty.tools.dotc.core.Names
32
32
import dotty .tools .dotc .core .Types
33
33
import dotty .tools .dotc .core .Symbols
34
34
import dotty .tools .dotc .core .Constants
35
+ import dotty .tools .dotc .core .TypeOps
36
+ import dotty .tools .dotc .core .StdNames
35
37
36
38
/**
37
39
* One of the results of a completion query.
@@ -200,7 +202,8 @@ object Completion:
200
202
201
203
private def computeCompletions (
202
204
pos : SourcePosition ,
203
- mode : Mode , rawPrefix : String ,
205
+ mode : Mode ,
206
+ rawPrefix : String ,
204
207
adjustedPath : List [tpd.Tree ],
205
208
untpdPath : List [untpd.Tree ],
206
209
matches : Option [Name => Boolean ]
@@ -442,9 +445,17 @@ object Completion:
442
445
def selectionCompletions (qual : tpd.Tree )(using Context ): CompletionMap =
443
446
val adjustedQual = widenQualifier(qual)
444
447
445
- implicitConversionMemberCompletions(adjustedQual) ++
446
- extensionCompletions(adjustedQual) ++
447
- directMemberCompletions(adjustedQual)
448
+ val implicitConversionMembers = implicitConversionMemberCompletions(adjustedQual)
449
+ val extensionMembers = extensionCompletions(adjustedQual)
450
+ val directMembers = directMemberCompletions(adjustedQual)
451
+ val namedTupleMembers = namedTupleCompletions(adjustedQual)
452
+
453
+ List (
454
+ implicitConversionMembers,
455
+ extensionMembers,
456
+ directMembers,
457
+ namedTupleMembers
458
+ ).reduce(_ ++ _)
448
459
449
460
/** Completions for members of `qual`'s type.
450
461
* These include inherited definitions but not members added by extensions or implicit conversions
@@ -516,6 +527,30 @@ object Completion:
516
527
.toSeq
517
528
.groupByName
518
529
530
+ /** Completions for named tuples */
531
+ private def namedTupleCompletions (qual : tpd.Tree )(using Context ): CompletionMap =
532
+ def namedTupleCompletionsFromType (tpe : Type ): CompletionMap =
533
+ val freshCtx = ctx.fresh.setExploreTyperState()
534
+ inContext(freshCtx):
535
+ tpe.namedTupleElementTypes
536
+ .map { (name, tpe) =>
537
+ val symbol = newSymbol(owner = NoSymbol , name, EmptyFlags , tpe)
538
+ val denot = SymDenotation (symbol, NoSymbol , name, EmptyFlags , tpe)
539
+ name -> denot
540
+ }
541
+ .toSeq
542
+ .filter((name, denot) => include(denot, name))
543
+ .groupByName
544
+
545
+ val qualTpe = qual.typeOpt
546
+ if qualTpe.isNamedTupleType then
547
+ namedTupleCompletionsFromType(qualTpe)
548
+ else if qualTpe.derivesFrom(defn.SelectableClass ) then
549
+ val pre = if ! TypeOps .isLegalPrefix(qualTpe) then Types .SkolemType (qualTpe) else qualTpe
550
+ val fieldsType = pre.select(StdNames .tpnme.Fields ).dealias.simplified
551
+ namedTupleCompletionsFromType(fieldsType)
552
+ else Map .empty
553
+
519
554
/** Completions from extension methods */
520
555
private def extensionCompletions (qual : tpd.Tree )(using Context ): CompletionMap =
521
556
def asDefLikeType (tpe : Type ): Type = tpe match
0 commit comments