Skip to content

Commit 972e515

Browse files
committed
bugfix: Don't check scope members if not needed
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. [Cherry-picked 14a8cc5]
1 parent 52ee0c3 commit 972e515

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
@@ -51,9 +51,9 @@ object Completion:
5151
val completionContext = Interactive.contextOfPath(tpdPath).withPhase(Phases.typerPhase)
5252
inContext(completionContext):
5353
val untpdPath = Interactive.resolveTypedOrUntypedPath(tpdPath, pos)
54-
val mode = completionMode(untpdPath, pos, forSymbolSearch = true)
5554
val rawPrefix = completionPrefix(untpdPath, pos)
56-
val completer = new Completer(mode, pos, untpdPath, _ => true)
55+
// Lazy mode is to avoid too many checks as it's mostly for printing types
56+
val completer = new Completer(Mode.Lazy, pos, untpdPath, _ => true)
5757
completer.scopeCompletions
5858

5959
/** Get possible completions from tree at `pos`
@@ -96,7 +96,7 @@ object Completion:
9696
*
9797
* Otherwise, provide no completion suggestion.
9898
*/
99-
def completionMode(path: List[untpd.Tree], pos: SourcePosition, forSymbolSearch: Boolean = false): Mode = path match
99+
def completionMode(path: List[untpd.Tree], pos: SourcePosition): Mode = path match
100100
// Ignore `package foo@@` and `package foo.bar@@`
101101
case ((_: tpd.Select) | (_: tpd.Ident)):: (_ : tpd.PackageDef) :: _ => Mode.None
102102
case GenericImportSelector(sel) =>
@@ -109,14 +109,9 @@ object Completion:
109109
case untpd.Literal(Constants.Constant(_: String)) :: _ => Mode.Term | Mode.Scope // literal completions
110110
case (ref: untpd.RefTree) :: _ =>
111111
val maybeSelectMembers = if ref.isInstanceOf[untpd.Select] then Mode.Member else Mode.Scope
112-
if (forSymbolSearch) then Mode.Term | Mode.Type | maybeSelectMembers
113-
else if (ref.name.isTermName) Mode.Term | maybeSelectMembers
112+
if (ref.name.isTermName) Mode.Term | maybeSelectMembers
114113
else if (ref.name.isTypeName) Mode.Type | maybeSelectMembers
115114
else Mode.None
116-
117-
case (_: tpd.TypeTree | _: tpd.MemberDef) :: _ if forSymbolSearch => Mode.Type | Mode.Term
118-
case (_: tpd.CaseDef) :: _ if forSymbolSearch => Mode.Type | Mode.Term
119-
case Nil if forSymbolSearch => Mode.Type | Mode.Term
120115
case _ => Mode.None
121116

122117
/** When dealing with <errors> in varios palces we check to see if they are
@@ -623,7 +618,7 @@ object Completion:
623618
private def include(denot: SingleDenotation, nameInScope: Name)(using Context): Boolean =
624619
matches(nameInScope) &&
625620
completionsFilter(NoType, nameInScope) &&
626-
isValidCompletionSymbol(denot.symbol, mode, isNew)
621+
(mode.is(Mode.Lazy) || isValidCompletionSymbol(denot.symbol, mode, isNew))
627622

628623
private def extractRefinements(site: Type)(using Context): Seq[SingleDenotation] =
629624
site match
@@ -653,7 +648,7 @@ object Completion:
653648

654649
val members = site.memberDenots(completionsFilter, appendMemberSyms).collect {
655650
case mbr if include(mbr, mbr.name)
656-
&& mbr.symbol.isAccessibleFrom(site) => mbr
651+
&& (mode.is(Mode.Lazy) || mbr.symbol.isAccessibleFrom(site)) => mbr
657652
}
658653
val refinements = extractRefinements(site).filter(mbr => include(mbr, mbr.name))
659654

@@ -716,3 +711,5 @@ object Completion:
716711

717712
val Member: Mode = new Mode(16)
718713

714+
val Lazy: Mode = new Mode(32)
715+

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)