Skip to content

Commit 6308afd

Browse files
committed
Store cycleSym in all relevant errors
Tests pass, and have the correct expectations both for `tree.name` and `cycleSym.name`, tho right now `tree.name` (what is shown) is less accurate.
1 parent 3de76ea commit 6308afd

File tree

3 files changed

+38
-30
lines changed

3 files changed

+38
-30
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ class CyclicReference private (val denot: SymDenotation, var inImplicitSearch: B
112112
cx.tree match {
113113
case tree: untpd.ValOrDefDef if inImplicitSearch && !tree.tpt.typeOpt.exists =>
114114
// Can happen in implicit defs (#4709) or outside (#3253).
115-
TermMemberNeedsNeedsResultTypeForImplicitSearch(cycleSym)
115+
TermMemberNeedsNeedsResultTypeForImplicitSearch(tree.name, cycleSym)
116116
case tree: untpd.DefDef if !tree.tpt.typeOpt.exists =>
117-
OverloadedOrRecursiveMethodNeedsResultType(tree.name)
117+
OverloadedOrRecursiveMethodNeedsResultType(tree.name, cycleSym)
118118
case tree: untpd.ValDef if !tree.tpt.typeOpt.exists =>
119-
RecursiveValueNeedsResultType(tree.name)
119+
RecursiveValueNeedsResultType(tree.name, cycleSym)
120120
case _ =>
121121
errorMsg(cx.outer)
122122
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,27 +1260,27 @@ object messages {
12601260
|""".stripMargin
12611261
}
12621262

1263-
case class OverloadedOrRecursiveMethodNeedsResultType(method: Names.Name)(implicit ctx: Context)
1263+
case class OverloadedOrRecursiveMethodNeedsResultType(methodName: Names.TermName, cycleSym: Symbol)(implicit ctx: Context)
12641264
extends Message(OverloadedOrRecursiveMethodNeedsResultTypeID) {
12651265
val kind = "Syntax"
1266-
val msg = hl"""overloaded or recursive method ${method} needs return type"""
1266+
val msg = hl"""overloaded or recursive method ${methodName} needs return type"""
12671267
val explanation =
1268-
hl"""Case 1: ${method} is overloaded
1269-
|If there are multiple methods named `${method}` and at least one definition of
1268+
hl"""Case 1: ${methodName} is overloaded
1269+
|If there are multiple methods named `${methodName}` and at least one definition of
12701270
|it calls another, you need to specify the calling method's return type.
12711271
|
1272-
|Case 2: ${method} is recursive
1273-
|If `${method}` calls itself on any path (even through mutual recursion), you need to specify the return type
1274-
|of `${method}` or of a definition it's mutually recursive with.
1272+
|Case 2: ${methodName} is recursive
1273+
|If `${methodName}` calls itself on any path (even through mutual recursion), you need to specify the return type
1274+
|of `${methodName}` or of a definition it's mutually recursive with.
12751275
|""".stripMargin
12761276
}
12771277

1278-
case class RecursiveValueNeedsResultType(value: Names.TermName)(implicit ctx: Context)
1278+
case class RecursiveValueNeedsResultType(valName: Names.TermName, cycleSym: Symbol)(implicit ctx: Context)
12791279
extends Message(RecursiveValueNeedsResultTypeID) {
12801280
val kind = "Syntax"
1281-
val msg = hl"""recursive value ${value} needs type"""
1281+
val msg = hl"""recursive value ${valName} needs type"""
12821282
val explanation =
1283-
hl"""The definition of `${value}` is recursive and you need to specify its type.
1283+
hl"""The definition of `${valName}` is recursive and you need to specify its type.
12841284
|""".stripMargin
12851285
}
12861286

@@ -2111,7 +2111,7 @@ object messages {
21112111
}
21122112

21132113
// Relative of CyclicReferenceInvolvingImplicit and RecursiveValueNeedsResultType
2114-
case class TermMemberNeedsNeedsResultTypeForImplicitSearch(cycleSym: Symbol)(implicit ctx: Context)
2114+
case class TermMemberNeedsNeedsResultTypeForImplicitSearch(memberName: Names.TermName, cycleSym: Symbol)(implicit ctx: Context)
21152115
extends Message(TermMemberNeedsNeedsResultTypeForImplicitSearchID) {
21162116
val kind = "Syntax"
21172117
val msg = hl"""$cycleSym needs result type because its right-hand side attempts implicit search"""

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

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
207207
implicit val ctx: Context = ictx
208208

209209
assertMessageCount(1, messages)
210-
val OverloadedOrRecursiveMethodNeedsResultType(tree) :: Nil = messages
211-
assertEquals("foo", tree.show)
210+
val OverloadedOrRecursiveMethodNeedsResultType(methodName, cycleSym) :: Nil = messages
211+
assertEquals("foo", methodName.show)
212+
assertEquals("foo", cycleSym.name.show)
212213
}
213214

214215
@Test def recursiveMethodNeedsReturnType =
@@ -223,8 +224,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
223224
implicit val ctx: Context = ictx
224225

225226
assertMessageCount(1, messages)
226-
val OverloadedOrRecursiveMethodNeedsResultType(tree) :: Nil = messages
227-
assertEquals("i", tree.show)
227+
val OverloadedOrRecursiveMethodNeedsResultType(methodName, cycleSym) :: Nil = messages
228+
assertEquals("i", methodName.show)
229+
assertEquals("i", cycleSym.name.show)
228230
}
229231

230232
@Test def recursiveValueNeedsReturnType =
@@ -239,8 +241,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
239241
implicit val ctx: Context = ictx
240242

241243
assertMessageCount(1, messages)
242-
val RecursiveValueNeedsResultType(tree) :: Nil = messages
243-
assertEquals("i", tree.show)
244+
val RecursiveValueNeedsResultType(valName, cycleSym) :: Nil = messages
245+
assertEquals("i", valName.show)
246+
assertEquals("i", cycleSym.name.show)
244247
}
245248

246249
@Test def cyclicReferenceInvolving =
@@ -290,8 +293,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
290293
implicit val ctx: Context = ictx
291294

292295
assertMessageCount(1, messages)
293-
val OverloadedOrRecursiveMethodNeedsResultType(name) :: Nil = messages
294-
assertEquals("even", name.show)
296+
val OverloadedOrRecursiveMethodNeedsResultType(methodName, cycleSym) :: Nil = messages
297+
assertEquals("even", methodName.show)
298+
assertEquals("odd", cycleSym.name.show)
295299
}
296300

297301
@Test def mutualRecursion_i2001a =
@@ -312,9 +316,10 @@ class ErrorMessagesTests extends ErrorMessagesTest {
312316
implicit val ctx: Context = ictx
313317

314318
assertMessageCount(1, messages)
315-
val OverloadedOrRecursiveMethodNeedsResultType(denot) :: Nil = messages
319+
val OverloadedOrRecursiveMethodNeedsResultType(methodName, cycleSym) :: Nil = messages
316320
// Not ideal behavior
317-
assertEquals("foo", denot.show)
321+
assertEquals("foo", methodName.show)
322+
assertEquals("odd", cycleSym.name.show)
318323
}
319324

320325

@@ -334,8 +339,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
334339
implicit val ctx: Context = ictx
335340

336341
assertMessageCount(1, messages)
337-
val TermMemberNeedsNeedsResultTypeForImplicitSearch(tree) :: Nil = messages
338-
assertEquals("x", tree.name.show)
342+
val TermMemberNeedsNeedsResultTypeForImplicitSearch(memberName, cycleSym) :: Nil = messages
343+
assertEquals("x", cycleSym.name.show)
344+
assertEquals("x", memberName.show)
339345
}
340346

341347
@Test def implicitSearchForcesImplicitRetType_i4709 =
@@ -359,8 +365,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
359365
implicit val ctx: Context = ictx
360366

361367
assertMessageCount(1, messages)
362-
val TermMemberNeedsNeedsResultTypeForImplicitSearch(tree) :: Nil = messages
363-
assertEquals("ctx", tree.name.show)
368+
val TermMemberNeedsNeedsResultTypeForImplicitSearch(memberName, cycleSym) :: Nil = messages
369+
assertEquals("ctx", memberName.show)
370+
assertEquals("ctx", cycleSym.name.show)
364371
}
365372

366373
@Test def implicitSearchForcesNonImplicitRetTypeOnExplicitImport_i3253 =
@@ -377,8 +384,9 @@ class ErrorMessagesTests extends ErrorMessagesTest {
377384
implicit val ctx: Context = ictx
378385

379386
assertMessageCount(1, messages)
380-
val TermMemberNeedsNeedsResultTypeForImplicitSearch(tree) :: Nil = messages
381-
assertEquals("test", tree.name.show)
387+
val TermMemberNeedsNeedsResultTypeForImplicitSearch(memberName, cycleSym) :: Nil = messages
388+
assertEquals("test", memberName.show)
389+
assertEquals("test", cycleSym.name.show)
382390
}
383391

384392
@Test def superQualMustBeParent =

0 commit comments

Comments
 (0)