From b3260c135a6bc1e42e05e229d756a50e4cac337d Mon Sep 17 00:00:00 2001 From: rochala Date: Thu, 19 May 2022 16:29:12 +0200 Subject: [PATCH 1/3] fix completions to properly contain public fields if they were shadowed by private ones --- .../src/dotty/tools/dotc/interactive/Completion.scala | 6 +++++- .../test/dotty/tools/languageserver/CompletionTest.scala | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index 133e366ff199..1a1c05b69922 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -481,7 +481,11 @@ object Completion { private def accessibleMembers(site: Type)(using Context): Seq[SingleDenotation] = { def appendMemberSyms(name: Name, buf: mutable.Buffer[SingleDenotation]): Unit = try - buf ++= site.member(name).alternatives + val member = site.member(name) + if member.symbol.isAccessibleFrom(site) then + buf ++= member.alternatives + else + buf ++= site.nonPrivateMember(name).alternatives catch case ex: TypeError => diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index fd6b4c958278..92d793bf73fd 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -1275,4 +1275,13 @@ class CompletionTest { .noCompletions() } + @Test def singleDenotNoCompletions: Unit = { + val expected = Set(("symbol", Field, "Int")) + code"""class Test(val symbol: Int) + |class BetterTest(symbol: Int) extends Test(symbol) + |object O: + | def t(test: BetterTest) = test.symb$m1""" + .completion(m1, expected) + } + } From 6e5d5a2ffc4ad1da1c5822e3749a5e4700025b1b Mon Sep 17 00:00:00 2001 From: rochala Date: Thu, 19 May 2022 16:44:24 +0200 Subject: [PATCH 2/3] make it a bit faster, as it is only allowed in constructor --- compiler/src/dotty/tools/dotc/interactive/Completion.scala | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index 1a1c05b69922..9fda94cb08d4 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -23,7 +23,6 @@ import dotty.tools.dotc.util.SourcePosition import scala.collection.mutable import scala.util.control.NonFatal -import dotty.tools.dotc.core.Types.TypeRef /** * One of the results of a completion query. @@ -482,10 +481,10 @@ object Completion { def appendMemberSyms(name: Name, buf: mutable.Buffer[SingleDenotation]): Unit = try val member = site.member(name) - if member.symbol.isAccessibleFrom(site) then - buf ++= member.alternatives - else + if member.symbol.is(ParamAccessor) && !member.symbol.isAccessibleFrom(site) then buf ++= site.nonPrivateMember(name).alternatives + else + buf ++= member.alternatives catch case ex: TypeError => From be173b0f7f673d4b1e32232c2ffc20ec3d03e527 Mon Sep 17 00:00:00 2001 From: rochala Date: Thu, 19 May 2022 16:56:20 +0200 Subject: [PATCH 3/3] extend tests to check for regression --- .../dotty/tools/languageserver/CompletionTest.scala | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index 92d793bf73fd..730025a40434 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -1276,12 +1276,13 @@ class CompletionTest { } @Test def singleDenotNoCompletions: Unit = { - val expected = Set(("symbol", Field, "Int")) - code"""class Test(val symbol: Int) - |class BetterTest(symbol: Int) extends Test(symbol) + code"""class Test(val symbol: String) + |class BetterTest(symbol: Int) extends Test(symbol.toString): + | symb$m1 |object O: - | def t(test: BetterTest) = test.symb$m1""" - .completion(m1, expected) + | def t(test: BetterTest) = test.symb$m2""" + .completion(m1, ("symbol", Field, "Int")) + .completion(m2, ("symbol", Field, "String")) } }