From 5a7f69aa1d01a3f81afaa6592ae4ed95218489ab Mon Sep 17 00:00:00 2001 From: Tomasz Godzik Date: Wed, 11 Jun 2025 15:44:31 +0200 Subject: [PATCH] improvement: Improve efficiency of completions There are two improvements here: - isAbsent(force = false) which is already used in the codebase when we care about performance - we don't search for extension or implicit methods on empty query, as we would have inverseSemanticdb invoked on every possible extension method and it's quite inefficient --- .../dotty/tools/dotc/interactive/Completion.scala | 2 +- .../dotty/tools/pc/completions/Completions.scala | 2 +- .../tests/completion/CompletionExtensionSuite.scala | 13 +++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index b2dab9606a9d..63aa4dcbde2b 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -335,7 +335,7 @@ object Completion: (sym.companionClass.exists && sym.companionClass.is(Enum)) sym.exists && - !sym.isAbsent() && + !sym.isAbsent(canForce = false) && !sym.isPrimaryConstructor && sym.sourceSymbol.exists && (!sym.is(Package) || sym.is(ModuleClass)) && diff --git a/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala b/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala index 6e79f5a293e5..a07f501eedbb 100644 --- a/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala +++ b/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala @@ -588,7 +588,7 @@ class Completions( else false, ) Some(search.search(query, buildTargetIdentifier, visitor).nn) - else if completionMode.is(Mode.Member) then + else if completionMode.is(Mode.Member) && query.nonEmpty then val visitor = new CompilerSearchVisitor(sym => def isExtensionMethod = sym.is(ExtensionMethod) && qualType.widenDealias <:< sym.extensionParam.info.widenDealias diff --git a/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionExtensionSuite.scala b/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionExtensionSuite.scala index e67c31329c1c..b41084af4a8e 100644 --- a/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionExtensionSuite.scala +++ b/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionExtensionSuite.scala @@ -228,6 +228,10 @@ class CompletionExtensionSuite extends BaseCompletionSuite: |""".stripMargin ) + /** + * For optimization, we don't show any completions here as it would bring + * every extension method into the completion list. + */ @Test def `simple-empty` = check( """|package example @@ -238,11 +242,13 @@ class CompletionExtensionSuite extends BaseCompletionSuite: | |def main = 100.@@ |""".stripMargin, - """|incr: Int (extension) - |""".stripMargin, + "", filter = _.contains("(extension)") ) + /** + * Some as above, but for implicit completions. + */ @Test def `simple-empty-old` = check( """|package example @@ -253,8 +259,7 @@ class CompletionExtensionSuite extends BaseCompletionSuite: | |def main = 100.@@ |""".stripMargin, - """|testOps(b: Int): String (implicit) - |""".stripMargin, + "", filter = _.contains("(implicit)") )