Skip to content

Commit f6345da

Browse files
author
Nadezhda Balashova
committed
Add error message for only functional erased or implicit types
1 parent 77ec689 commit f6345da

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,9 +1423,9 @@ object Parsers {
14231423
case FORSOME => syntaxError(ExistentialTypesNoLongerSupported()); t
14241424
case _ =>
14251425
if (imods.isOneOf(GivenOrImplicit) && !t.isInstanceOf[FunctionWithMods])
1426-
syntaxError("Types with implicit keyword can only be function types `implicit (...) => ...`", implicitKwPos(start))
1426+
syntaxError(ImplicitTypesCanOnlyBeFunctionTypes())
14271427
if (imods.is(Erased) && !t.isInstanceOf[FunctionWithMods])
1428-
syntaxError("Types with erased keyword can only be function types `erased (...) => ...`", implicitKwPos(start))
1428+
syntaxError(ErasedTypesCanOnlyBeFunctionTypes())
14291429
t
14301430
}
14311431
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,9 @@ enum ErrorMessageID extends java.lang.Enum[ErrorMessageID] {
148148
IllegalSuperAccessorID,
149149
TraitParameterUsedAsParentPrefixID,
150150
UnknownNamedEnclosingClassOrObjectID,
151-
IllegalCyclicTypeReferenceID
151+
IllegalCyclicTypeReferenceID,
152+
ImplicitTypesCanOnlyBeFunctionTypesID,
153+
ErasedTypesCanOnlyBeFunctionTypesID
152154

153155
def errorNumber = ordinal - 2
154156
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,4 +2401,18 @@ object messages {
24012401
val msg: String = i"illegal cyclic type reference: ${where} ${hl(lastChecked.show)} of $sym refers back to the type itself"
24022402
val explanation: String = ""
24032403
}
2404+
2405+
case class ImplicitTypesCanOnlyBeFunctionTypes()(implicit val ctx: Context)
2406+
extends Message(ImplicitTypesCanOnlyBeFunctionTypesID) {
2407+
val kind: String = "Syntax"
2408+
val msg: String = "Types with implicit keyword can only be function types `given (...) => ...`"
2409+
val explanation: String = ""
2410+
}
2411+
2412+
case class ErasedTypesCanOnlyBeFunctionTypes()(implicit val ctx: Context)
2413+
extends Message(ErasedTypesCanOnlyBeFunctionTypesID) {
2414+
val kind: String = "Syntax"
2415+
val msg: String = "Types with erased keyword can only be function types `erased (...) => ...`"
2416+
val explanation: String = ""
2417+
}
24042418
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,4 +1687,30 @@ class ErrorMessagesTests extends ErrorMessagesTest {
16871687
assertEquals("alias", where)
16881688
assertEquals("List[X]", lastChecked.show)
16891689
}
1690+
1691+
@Test def implicitTypesCanOnlyBeFunctionTypesSuccess() =
1692+
checkMessagesAfter(RefChecks.name) ("def foo(f: (given Int) => Int): Int = 1")
1693+
.expectNoErrors
1694+
1695+
@Test def erasedTypesCanOnlyBeFunctionTypesSuccess() =
1696+
checkMessagesAfter(FrontEnd.name) ("def foo(f: (erased Int) => Int): Int = 1")
1697+
.expectNoErrors
1698+
1699+
@Test def implicitTypesCanOnlyBeFunctionTypesFailed() =
1700+
checkMessagesAfter(FrontEnd.name) ("def foo(f: (given Int)): Int = 1")
1701+
.expect { (ictx, messages) =>
1702+
implicit val ctx: Context = ictx
1703+
assertMessageCount(1, messages)
1704+
val ImplicitTypesCanOnlyBeFunctionTypes() :: Nil = messages
1705+
assertEquals("Types with implicit keyword can only be function types `given (...) => ...`", messages.head.msg)
1706+
}
1707+
1708+
@Test def erasedTypesCanOnlyBeFunctionTypesFailed() =
1709+
checkMessagesAfter(FrontEnd.name) ("def foo(f: (erased Int)): Int = 1")
1710+
.expect { (ictx, messages) =>
1711+
implicit val ctx: Context = ictx
1712+
assertMessageCount(1, messages)
1713+
val ErasedTypesCanOnlyBeFunctionTypes() :: Nil = messages
1714+
assertEquals("Types with erased keyword can only be function types `erased (...) => ...`", messages.head.msg)
1715+
}
16901716
}

0 commit comments

Comments
 (0)