Skip to content

Commit 91d3ec1

Browse files
bbarkerfelixmulder
authored andcommitted
Closes #1731 by fixing error message for overloaded method without re… (#2823)
* Partial fix for #1731 by fixing error message for overloaded method without return type * fixes for review in PR #2823 * fixing 'show' usage to only show name
1 parent c75c4ac commit 91d3ec1

File tree

5 files changed

+46
-15
lines changed

5 files changed

+46
-15
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ object Contexts {
127127
protected def sstate_=(sstate: SettingsState) = _sstate = sstate
128128
def sstate: SettingsState = _sstate
129129

130-
/** The current tree */
130+
/** The current compilation unit */
131131
private[this] var _compilationUnit: CompilationUnit = _
132132
protected def compilationUnit_=(compilationUnit: CompilationUnit) = _compilationUnit = compilationUnit
133133
def compilationUnit: CompilationUnit = _compilationUnit

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,20 +1215,29 @@ object messages {
12151215
|""".stripMargin
12161216
}
12171217

1218-
case class OverloadedOrRecursiveMethodNeedsResultType(tree: Names.TermName)(implicit ctx: Context)
1218+
case class OverloadedOrRecursiveMethodNeedsResultType private (termName: String)(implicit ctx: Context)
12191219
extends Message(OverloadedOrRecursiveMethodNeedsResultTypeID) {
12201220
val kind = "Syntax"
1221-
val msg = hl"""overloaded or recursive method ${tree} needs return type"""
1221+
val msg = hl"""overloaded or recursive method $termName needs return type"""
12221222
val explanation =
1223-
hl"""Case 1: ${tree} is overloaded
1224-
|If there are multiple methods named `${tree.name}` and at least one definition of
1223+
hl"""Case 1: $termName is overloaded
1224+
|If there are multiple methods named `$termName` and at least one definition of
12251225
|it calls another, you need to specify the calling method's return type.
12261226
|
1227-
|Case 2: ${tree} is recursive
1228-
|If `${tree.name}` calls itself on any path, you need to specify its return type.
1227+
|Case 2: $termName is recursive
1228+
|If `$termName` calls itself on any path, you need to specify its return type.
12291229
|""".stripMargin
12301230
}
12311231

1232+
object OverloadedOrRecursiveMethodNeedsResultType {
1233+
def apply[T >: Trees.Untyped](tree: NameTree[T])(implicit ctx: Context)
1234+
: OverloadedOrRecursiveMethodNeedsResultType =
1235+
OverloadedOrRecursiveMethodNeedsResultType(tree.name.show)(ctx)
1236+
def apply(symbol: Symbol)(implicit ctx: Context)
1237+
: OverloadedOrRecursiveMethodNeedsResultType =
1238+
OverloadedOrRecursiveMethodNeedsResultType(symbol.name.show)(ctx)
1239+
}
1240+
12321241
case class RecursiveValueNeedsResultType(tree: Names.TermName)(implicit ctx: Context)
12331242
extends Message(RecursiveValueNeedsResultTypeID) {
12341243
val kind = "Syntax"
@@ -1326,7 +1335,8 @@ object messages {
13261335
|"""
13271336
}
13281337

1329-
case class MethodDoesNotTakeParameters(tree: tpd.Tree, methPartType: Types.Type)(err: typer.ErrorReporting.Errors)(implicit ctx: Context)
1338+
case class MethodDoesNotTakeParameters(tree: tpd.Tree, methPartType: Types.Type)
1339+
(err: typer.ErrorReporting.Errors)(implicit ctx: Context)
13301340
extends Message(MethodDoesNotTakeParametersId) {
13311341
private val more = tree match {
13321342
case Apply(_, _) => " more"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object ErrorReporting {
3232
if (cx.mode is Mode.InferringReturnType) {
3333
cx.tree match {
3434
case tree: untpd.DefDef if !tree.tpt.typeOpt.exists =>
35-
OverloadedOrRecursiveMethodNeedsResultType(tree.name)
35+
OverloadedOrRecursiveMethodNeedsResultType(tree)
3636
case tree: untpd.ValDef if !tree.tpt.typeOpt.exists =>
3737
RecursiveValueNeedsResultType(tree.name)
3838
case _ =>

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1953,7 +1953,13 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
19531953
else
19541954
tree
19551955
case _ => tryInsertApplyOrImplicit(tree, pt) {
1956-
errorTree(tree, MethodDoesNotTakeParameters(tree, methPart(tree).tpe)(err))
1956+
pt.resType match {
1957+
case IgnoredProto(WildcardType(optBounds))
1958+
if (optBounds == NoType) && (pt.args.size == tree.productArity) =>
1959+
errorTree(tree, OverloadedOrRecursiveMethodNeedsResultType(tree.symbol))
1960+
case resType =>
1961+
errorTree(tree, MethodDoesNotTakeParameters(tree, methPart(tree).tpe)(err))
1962+
}
19571963
}
19581964
}
19591965

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class ErrorMessagesTests extends ErrorMessagesTest {
200200
assertTrue("expected trait", isTrait)
201201
}
202202

203-
@Test def overloadedMethodNeedsReturnType =
203+
@Test def overloadedMethodNeedsReturnType = {
204204
checkMessagesAfter("frontend") {
205205
"""
206206
|class Scope() {
@@ -214,10 +214,25 @@ class ErrorMessagesTests extends ErrorMessagesTest {
214214
val defn = ictx.definitions
215215

216216
assertMessageCount(1, messages)
217-
val OverloadedOrRecursiveMethodNeedsResultType(tree) :: Nil = messages
218-
assertEquals("foo", tree.show)
217+
val OverloadedOrRecursiveMethodNeedsResultType(treeName) :: Nil = messages
218+
assertEquals("foo", treeName)
219219
}
220220

221+
222+
checkMessagesAfter("frontend") {
223+
"""
224+
|case class Foo[T](x: T)
225+
|object Foo { def apply[T]() = Foo(null.asInstanceOf[T]) }
226+
""".stripMargin
227+
}.expect { (ictx, messages) =>
228+
implicit val ctx: Context = ictx
229+
230+
assertMessageCount(1, messages)
231+
val OverloadedOrRecursiveMethodNeedsResultType(treeName2) :: Nil = messages
232+
assertEquals("Foo", treeName2)
233+
}
234+
}
235+
221236
@Test def recursiveMethodNeedsReturnType =
222237
checkMessagesAfter("frontend") {
223238
"""
@@ -231,8 +246,8 @@ class ErrorMessagesTests extends ErrorMessagesTest {
231246
val defn = ictx.definitions
232247

233248
assertMessageCount(1, messages)
234-
val OverloadedOrRecursiveMethodNeedsResultType(tree) :: Nil = messages
235-
assertEquals("i", tree.show)
249+
val OverloadedOrRecursiveMethodNeedsResultType(treeName) :: Nil = messages
250+
assertEquals("i", treeName)
236251
}
237252

238253
@Test def recursiveValueNeedsReturnType =

0 commit comments

Comments
 (0)