From 494094a5555ef425c7160c1d01d56597b06afe57 Mon Sep 17 00:00:00 2001 From: Vadim Chelyshov Date: Mon, 13 Sep 2021 13:34:33 +0300 Subject: [PATCH] [Interactive] Include scope completions for synthic select tree Previously, in case if query matches on existing class member the returned completions were not returning symbols from scope. Fixes the following case: ```scala class Y { def bar: Unit = val argument: Int = 42 arg@@ // should return both `local.argument` and `this.arg` // but tree looks like select - `Select(This(Ident(Y)), Ident("arg"))` def arg: String = ??? } ``` --- .../dotty/tools/dotc/interactive/Completion.scala | 11 +++++++---- .../dotty/tools/languageserver/CompletionTest.scala | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index bc63b958f1f0..7a808aafb481 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -112,10 +112,13 @@ object Completion { val completer = new Completer(mode, prefix, pos) val completions = path match { - case Select(qual, _) :: _ => completer.selectionCompletions(qual) - case Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) - case _ => completer.scopeCompletions + // Ignore synthetic select from `This` because in code it was `Ident` + // See example in dotty.tools.languageserver.CompletionTest.syntheticThis + case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions + case Select(qual, _) :: _ => completer.selectionCompletions(qual) + case Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr) + case _ => completer.scopeCompletions } val describedCompletions = describeCompletions(completions) diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index 5aa12f425371..139c70e4c46e 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -857,4 +857,17 @@ class CompletionTest { |}""".withSource .completion(m1, Set(("show",Method, "(using x$2: x$1.reflect.Printer[x$1.reflect.Tree]): String"))) } + + @Test def syntheticThis: Unit = { + code"""|class Y() { + | def bar: Unit = + | val argument: Int = ??? + | arg${m1} + | + | def arg: String = ??? + |} + |""".withSource + .completion(m1, Set(("arg", Method, "=> String"), + ("argument", Field, "Int"))) + } }