Skip to content

Commit 37ec52c

Browse files
committed
Also hide implicit parameter lists made of DummyImplicit
This is more legitimate than hiding CanBuildFrom since there's never any reason to pass a DummyImplicit instance explicitly, and DummyImplicit is used in the 2.13 standard library to avoid erased signature clashes between overloads.
1 parent 804c31c commit 37ec52c

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,18 @@ class Definitions {
355355
lazy val Predef_undefinedR: TermRef = ScalaPredefModule.requiredMethodRef(nme.???)
356356
def Predef_undefined(implicit ctx: Context): Symbol = Predef_undefinedR.symbol
357357

358-
def SubTypeClass(implicit ctx: Context): Symbol =
358+
def SubTypeClass(implicit ctx: Context): ClassSymbol =
359359
if (isNewCollections)
360360
ctx.requiredClass("scala.<:<")
361361
else
362362
ScalaPredefModule.requiredClass("<:<")
363363

364+
def DummyImplicitClass(implicit ctx: Context): ClassSymbol =
365+
if (isNewCollections)
366+
ctx.requiredClass("scala.DummyImplicit")
367+
else
368+
ScalaPredefModule.requiredClass("DummyImplicit")
369+
364370
lazy val ScalaRuntimeModuleRef: TermRef = ctx.requiredModuleRef("scala.runtime.ScalaRunTime")
365371
def ScalaRuntimeModule(implicit ctx: Context): Symbol = ScalaRuntimeModuleRef.symbol
366372
def ScalaRuntimeClass(implicit ctx: Context): ClassSymbol = ScalaRuntimeModule.moduleClass.asClass

compiler/src/dotty/tools/dotc/util/Signatures.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,13 @@ object Signatures {
8484
def toParamss(tp: MethodType)(implicit ctx: Context): List[List[Param]] = {
8585
val rest = tp.resType match {
8686
case res: MethodType =>
87-
// HACK: Hide parameter lists consisting only of CanBuildFrom,
88-
// remove this once we switch to the 2.13 standard library.
87+
// Hide parameter lists consisting only of CanBuildFrom or DummyImplicit,
88+
// we can remove the CanBuildFrom special-case once we switch to the 2.13 standard library.
8989
if (res.resultType.isParameterless &&
9090
res.isImplicitMethod &&
91-
res.paramInfos.forall(_.classSymbol.fullName.toString == "scala.collection.generic.CanBuildFrom"))
91+
res.paramInfos.forall(info =>
92+
info.classSymbol.fullName.toString == "scala.collection.generic.CanBuildFrom" ||
93+
info.classSymbol.derivesFrom(ctx.definitions.DummyImplicitClass)))
9294
Nil
9395
else
9496
toParamss(res)

language-server/test/dotty/tools/languageserver/SignatureHelpTest.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,34 @@ class SignatureHelpTest {
3030
.signatureHelp(m2, List(mapSig), Some(0), 0)
3131
}
3232

33+
/** Implicit parameter lists consisting solely of DummyImplicits are hidden. */
34+
@Test def hiddenDummyParams: Unit = {
35+
val foo1Sig =
36+
S("foo1", Nil, List(List(P("param0", "Int"))), Some("Int"))
37+
val foo2Sig =
38+
S("foo2", Nil, List(List(P("param0", "Int"))), Some("Int"))
39+
val foo3Sig =
40+
S("foo3", Nil, List(List(P("param0", "Int")),
41+
List(P("dummy", "DummyImplicit"))), Some("Int"))
42+
val foo4Sig =
43+
S("foo4", Nil, List(List(P("param0", "Int")),
44+
List(P("x", "Int", isImplicit = true), P("dummy", "DummyImplicit", isImplicit = true))), Some("Int"))
45+
code"""object O {
46+
def foo1(param0: Int)(implicit dummy: DummyImplicit): Int = ???
47+
def foo2(param0: Int)(implicit dummy1: DummyImplicit, dummy2: DummyImplicit): Int = ???
48+
def foo3(param0: Int)(dummy: DummyImplicit): Int = ???
49+
def foo4(param0: Int)(implicit x: Int, dummy: DummyImplicit): Int = ???
50+
foo1($m1)
51+
foo2($m2)
52+
foo3($m3)
53+
foo4($m4)
54+
}""".withSource
55+
.signatureHelp(m1, List(foo1Sig), Some(0), 0)
56+
.signatureHelp(m2, List(foo2Sig), Some(0), 0)
57+
.signatureHelp(m3, List(foo3Sig), Some(0), 0)
58+
.signatureHelp(m4, List(foo4Sig), Some(0), 0)
59+
}
60+
3361
@Test def singleParam: Unit = {
3462
val signature =
3563
S("foo", Nil, List(List(P("param0", "Int"))), Some("Int"))

0 commit comments

Comments
 (0)