Skip to content

Commit faf0ebc

Browse files
committed
Fix #4127: Fix mods string of FunctionTypeNeedsNonEmptyParameterList
1 parent 99f1fd3 commit faf0ebc

File tree

3 files changed

+47
-4
lines changed

3 files changed

+47
-4
lines changed

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,10 +1715,11 @@ object messages {
17151715
}
17161716
}
17171717

1718-
case class FunctionTypeNeedsNonEmptyParameterList(isImplicit: Boolean = true, isErased: Boolean = true)(implicit ctx: Context)
1718+
case class FunctionTypeNeedsNonEmptyParameterList(isImplicit: Boolean, isErased: Boolean)(implicit ctx: Context)
17191719
extends Message(FunctionTypeNeedsNonEmptyParameterListID) {
1720+
assert(isImplicit || isErased)
17201721
val kind = "Syntax"
1721-
val mods = ((isImplicit, "implicit") :: (isErased, "erased") :: Nil).filter(_._1).mkString(" ")
1722+
val mods = ((isErased, "erased") :: (isImplicit, "implicit") :: Nil).collect { case (true, mod) => mod }.mkString(" ")
17221723
val msg = mods + " function type needs non-empty parameter list"
17231724
val explanation = {
17241725
val code1 = s"type Transactional[T] = $mods Transaction => T"

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ class Typer extends Namer
764764
case tree: untpd.NonEmptyFunction =>
765765
if (args.nonEmpty) (tree.mods.is(Implicit), tree.mods.is(Erased))
766766
else {
767-
ctx.error(FunctionTypeNeedsNonEmptyParameterList(), tree.pos)
767+
ctx.error(FunctionTypeNeedsNonEmptyParameterList(tree.mods.is(Implicit), tree.mods.is(Erased)), tree.pos)
768768
(false, false)
769769
}
770770
case _ => (false, false)

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ class ErrorMessagesTests extends ErrorMessagesTest {
881881
implicit val ctx: Context = ictx
882882

883883
assertMessageCount(2, messages)
884-
messages.foreach(assertEquals(_, FunctionTypeNeedsNonEmptyParameterList()))
884+
messages.foreach(assertEquals(_, FunctionTypeNeedsNonEmptyParameterList(isImplicit = true, isErased = false)))
885885
}
886886

887887
@Test def wrongNumberOfParameters =
@@ -1306,4 +1306,46 @@ class ErrorMessagesTests extends ErrorMessagesTest {
13061306
val DoubleDeclaration(symbol, previousSymbol) :: Nil = messages
13071307
assertEquals(symbol.name.mangledString, "a")
13081308
}
1309+
1310+
@Test def i4127a =
1311+
checkMessagesAfter("frontend") {
1312+
"""
1313+
|class Foo {
1314+
| val x: implicit () => Int = () => 1
1315+
|}
1316+
""".stripMargin
1317+
}.expect { (ictx, messages) =>
1318+
implicit val ctx: Context = ictx
1319+
assertMessageCount(1, messages)
1320+
val (msg @ FunctionTypeNeedsNonEmptyParameterList(_, _)) :: Nil = messages
1321+
assertEquals(msg.mods, "implicit")
1322+
}
1323+
1324+
@Test def i4127b =
1325+
checkMessagesAfter("frontend") {
1326+
"""
1327+
|class Foo {
1328+
| val x: erased () => Int = () => 1
1329+
|}
1330+
""".stripMargin
1331+
}.expect { (ictx, messages) =>
1332+
implicit val ctx: Context = ictx
1333+
assertMessageCount(1, messages)
1334+
val (msg @ FunctionTypeNeedsNonEmptyParameterList(_, _)) :: Nil = messages
1335+
assertEquals(msg.mods, "erased")
1336+
}
1337+
1338+
@Test def i4127c =
1339+
checkMessagesAfter("frontend") {
1340+
"""
1341+
|class Foo {
1342+
| val x: erased implicit () => Int = () => 1
1343+
|}
1344+
""".stripMargin
1345+
}.expect { (ictx, messages) =>
1346+
implicit val ctx: Context = ictx
1347+
assertMessageCount(1, messages)
1348+
val (msg @ FunctionTypeNeedsNonEmptyParameterList(_, _)) :: Nil = messages
1349+
assertEquals(msg.mods, "erased implicit")
1350+
}
13091351
}

0 commit comments

Comments
 (0)