Skip to content

Commit 4fa839f

Browse files
authored
bugfix: Don't check scope members if not needed (#23384)
This was causing a significant slowdown in most cases for lichess/lila and scope completions are mostly for printing, so we don't need to check so heavily if a member is valid.
2 parents 2d11d4c + 14a8cc5 commit 4fa839f

File tree

2 files changed

+10
-14
lines changed

2 files changed

+10
-14
lines changed

compiler/src/dotty/tools/dotc/interactive/Completion.scala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ object Completion:
5353
val completionContext = Interactive.contextOfPath(tpdPath).withPhase(Phases.typerPhase)
5454
inContext(completionContext):
5555
val untpdPath = Interactive.resolveTypedOrUntypedPath(tpdPath, pos)
56-
val mode = completionMode(untpdPath, pos, forSymbolSearch = true)
5756
val rawPrefix = completionPrefix(untpdPath, pos)
58-
val completer = new Completer(mode, pos, untpdPath, _ => true)
57+
// Lazy mode is to avoid too many checks as it's mostly for printing types
58+
val completer = new Completer(Mode.Lazy, pos, untpdPath, _ => true)
5959
completer.scopeCompletions
6060

6161
/** Get possible completions from tree at `pos`
@@ -98,7 +98,7 @@ object Completion:
9898
*
9999
* Otherwise, provide no completion suggestion.
100100
*/
101-
def completionMode(path: List[untpd.Tree], pos: SourcePosition, forSymbolSearch: Boolean = false): Mode = path match
101+
def completionMode(path: List[untpd.Tree], pos: SourcePosition): Mode = path match
102102
// Ignore `package foo@@` and `package foo.bar@@`
103103
case ((_: tpd.Select) | (_: tpd.Ident)):: (_ : tpd.PackageDef) :: _ => Mode.None
104104
case GenericImportSelector(sel) =>
@@ -111,14 +111,9 @@ object Completion:
111111
case untpd.Literal(Constants.Constant(_: String)) :: _ => Mode.Term | Mode.Scope // literal completions
112112
case (ref: untpd.RefTree) :: _ =>
113113
val maybeSelectMembers = if ref.isInstanceOf[untpd.Select] then Mode.Member else Mode.Scope
114-
if (forSymbolSearch) then Mode.Term | Mode.Type | maybeSelectMembers
115-
else if (ref.name.isTermName) Mode.Term | maybeSelectMembers
114+
if (ref.name.isTermName) Mode.Term | maybeSelectMembers
116115
else if (ref.name.isTypeName) Mode.Type | maybeSelectMembers
117116
else Mode.None
118-
119-
case (_: tpd.TypeTree | _: tpd.MemberDef) :: _ if forSymbolSearch => Mode.Type | Mode.Term
120-
case (_: tpd.CaseDef) :: _ if forSymbolSearch => Mode.Type | Mode.Term
121-
case Nil if forSymbolSearch => Mode.Type | Mode.Term
122117
case _ => Mode.None
123118

124119
/** When dealing with <errors> in varios palces we check to see if they are
@@ -651,7 +646,7 @@ object Completion:
651646
private def include(denot: SingleDenotation, nameInScope: Name)(using Context): Boolean =
652647
matches(nameInScope) &&
653648
completionsFilter(NoType, nameInScope) &&
654-
isValidCompletionSymbol(denot.symbol, mode, isNew)
649+
(mode.is(Mode.Lazy) || isValidCompletionSymbol(denot.symbol, mode, isNew))
655650

656651
private def extractRefinements(site: Type)(using Context): Seq[SingleDenotation] =
657652
site match
@@ -681,7 +676,7 @@ object Completion:
681676

682677
val members = site.memberDenots(completionsFilter, appendMemberSyms).collect {
683678
case mbr if include(mbr, mbr.name)
684-
&& mbr.symbol.isAccessibleFrom(site) => mbr
679+
&& (mode.is(Mode.Lazy) || mbr.symbol.isAccessibleFrom(site)) => mbr
685680
}
686681
val refinements = extractRefinements(site).filter(mbr => include(mbr, mbr.name))
687682

@@ -744,3 +739,5 @@ object Completion:
744739

745740
val Member: Mode = new Mode(16)
746741

742+
val Lazy: Mode = new Mode(32)
743+

presentation-compiler/test/dotty/tools/pc/tests/edit/InsertInferredTypeSuite.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -657,14 +657,13 @@ class InsertInferredTypeSuite extends BaseCodeActionSuite:
657657
|object O{
658658
| val <<foo>> = A.Foo(new A.`x-x`)
659659
|}""".stripMargin,
660-
"""|import A.Foo
661-
|import A.`x-x`
660+
"""|import A.`x-x`
662661
|object A{
663662
| class `x-x`
664663
| case class Foo[A](i: A)
665664
|}
666665
|object O{
667-
| val foo: Foo[`x-x`] = A.Foo(new A.`x-x`)
666+
| val foo: A.Foo[`x-x`] = A.Foo(new A.`x-x`)
668667
|}
669668
|""".stripMargin
670669
)

0 commit comments

Comments
 (0)