From 2333135cba6dd3dc1c1890dfa352b81b0af2d3a7 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 11 Feb 2025 18:09:30 +0100 Subject: [PATCH] fix: Only fallback to the definition of a synthetic valdef if it is zero extent (#22551) closes scalameta/metals#7038 closes scalameta/metals#7191 fixes the reproduction issue from #22217 Co-authored-by: Katarzyna Marek <26606662+kasiaMarek@users.noreply.github.com> [Cherry-picked 37206cc4a7e8a6ab60f0b54b4716bc65b9333940] --- .../tools/pc/completions/CompletionProvider.scala | 4 ++-- .../tools/pc/tests/completion/CompletionSuite.scala | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/presentation-compiler/src/main/dotty/tools/pc/completions/CompletionProvider.scala b/presentation-compiler/src/main/dotty/tools/pc/completions/CompletionProvider.scala index 8c8dd09c8c15..2a63d6a92a81 100644 --- a/presentation-compiler/src/main/dotty/tools/pc/completions/CompletionProvider.scala +++ b/presentation-compiler/src/main/dotty/tools/pc/completions/CompletionProvider.scala @@ -99,9 +99,9 @@ class CompletionProvider( * 4| $1$.sliding@@[Int](size, step) * */ - if qual.symbol.is(Flags.Synthetic) && qual.symbol.name.isInstanceOf[DerivedName] => + if qual.symbol.is(Flags.Synthetic) && qual.span.isZeroExtent && qual.symbol.name.isInstanceOf[DerivedName] => qual.symbol.defTree match - case valdef: ValDef => Select(valdef.rhs, name) :: tail + case valdef: ValDef if !valdef.rhs.isEmpty => Select(valdef.rhs, name) :: tail case _ => tpdPath0 case _ => tpdPath0 diff --git a/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala b/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala index a3217f64d856..27aa3f505b80 100644 --- a/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala +++ b/presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala @@ -2134,3 +2134,14 @@ class CompletionSuite extends BaseCompletionSuite: """|build: Unit |""".stripMargin, ) + + @Test def i7191 = + check( + """|val x = Some(3).map(_.@@) + |""".stripMargin, + """|!=(x: Byte): Boolean + |!=(x: Char): Boolean + |!=(x: Double): Boolean + |""".stripMargin, + topLines = Some(3) + )