Skip to content

Commit cf44c8a

Browse files
authored
Merge pull request #2731 from gvolpe/anonymous-function-missing-type-parameter-error-to-case-class
Moved error message to case class scheme
2 parents 0311967 + c3fc832 commit cf44c8a

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public enum ErrorMessageID {
8888
ValueClassNeedsExactlyOneValParamID,
8989
OnlyCaseClassOrCaseObjectAllowedID,
9090
ExpectedClassOrObjectDefID,
91+
AnonymousFunctionMissingParamTypeID
9192
;
9293

9394
public int errorNumber() {

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,34 @@ object messages {
176176
|Or, add an explicit `()' as a parameter list to ${cdef.name}."""
177177
}
178178

179+
case class AnonymousFunctionMissingParamType(param: untpd.ValDef,
180+
args: List[untpd.Tree],
181+
tree: untpd.Function,
182+
pt: Type)
183+
(implicit ctx: Context)
184+
extends Message(AnonymousFunctionMissingParamTypeID) {
185+
val kind = "Syntax"
186+
187+
val msg = {
188+
val ofFun =
189+
if (MethodType.syntheticParamNames(args.length + 1) contains param.name)
190+
i" of expanded function $tree"
191+
else
192+
""
193+
194+
i"missing parameter type for parameter ${param.name}$ofFun, expected = $pt"
195+
}
196+
197+
val explanation =
198+
hl"""|Anonymous functions must define a type. For example, if you define a function like this one:
199+
|
200+
|${"val f = { case xs @ List(1, 2, 3) => Some(xs) }"}
201+
|
202+
|Make sure you give it a type of what you expect to match and help the type inference system:
203+
|
204+
|${"val f: Seq[Int] => Option[List[Int]] = { case xs @ List(1, 2, 3) => Some(xs) }"} """
205+
}
206+
179207

180208
// Type Errors ------------------------------------------------------------ //
181209
case class DuplicateBind(bind: untpd.Bind, tree: untpd.CaseDef)(implicit ctx: Context)

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -762,12 +762,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
762762
}
763763
case _ =>
764764
}
765-
val ofFun =
766-
if (MethodType.syntheticParamNames(args.length + 1) contains param.name)
767-
i" of expanded function $tree"
768-
else
769-
""
770-
errorType(i"missing parameter type for parameter ${param.name}$ofFun, expected = $pt", param.pos)
765+
errorType(AnonymousFunctionMissingParamType(param, args, tree, pt), param.pos)
771766
}
772767

773768
def protoFormal(i: Int): Type =

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,5 +802,22 @@ class ErrorMessagesTests extends ErrorMessagesTest {
802802
val err :: Nil = messages
803803
assertEquals(err, ExpectedClassOrObjectDef())
804804
}
805+
@Test def anonymousFunctionMissingParamType =
806+
checkMessagesAfter("refchecks") {
807+
"""
808+
|object AnonymousF {
809+
| val f = { case l@List(1,2,3) => Some(l) }
810+
|}""".stripMargin
811+
}
812+
.expect { (ictx, messages) =>
813+
implicit val ctx: Context = ictx
814+
val defn = ictx.definitions
815+
816+
assertMessageCount(1, messages)
817+
val AnonymousFunctionMissingParamType(param, args, _, pt) :: Nil = messages
818+
assertEquals("x$1", param.show)
819+
assertEquals(s"List(ValDef(${param.show},TypeTree,EmptyTree))", args.toString)
820+
assertEquals("?", pt.show)
821+
}
805822

806823
}

0 commit comments

Comments
 (0)