From 6d817fbbcaa8497afb25a39e4793ac0b9ed8692d Mon Sep 17 00:00:00 2001 From: Tomasz Godzik Date: Thu, 12 Jun 2025 07:37:21 +0200 Subject: [PATCH] improvement: Improve efficiency of completions (#23355) 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 [Cherry-picked 99543c58470896f22341ff5931c7784af1cd02e4] --- .../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 c841184675fc..227b4b520236 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -332,7 +332,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 d7b3cf2ae50e..0389d3fa2fab 100644 --- a/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala +++ b/presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala @@ -590,7 +590,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)") )