Skip to content

Commit 6398448

Browse files
authored
Merge pull request #3407 from allanrenucci/err-msg-missing-empty-arg-list
Add error message for missing () argument list
2 parents 13c5455 + 0af2bd8 commit 6398448

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import util.Property
1717
import collection.mutable
1818
import ast.tpd._
1919
import reporting.trace
20+
import reporting.diagnostic.Message
2021

2122
trait TypeOps { this: Context => // TODO: Make standalone object.
2223

@@ -315,7 +316,7 @@ trait TypeOps { this: Context => // TODO: Make standalone object.
315316
def dynamicsEnabled =
316317
featureEnabled(defn.LanguageModuleClass, nme.dynamics)
317318

318-
def testScala2Mode(msg: => String, pos: Position, rewrite: => Unit = ()) = {
319+
def testScala2Mode(msg: => Message, pos: Position, rewrite: => Unit = ()) = {
319320
if (scala2Mode) {
320321
migrationWarning(msg, pos)
321322
rewrite

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ public enum ErrorMessageID {
106106
ClassAndCompanionNameClashID,
107107
TailrecNotApplicableID,
108108
FailureToEliminateExistentialID,
109-
OnlyFunctionsCanBeFollowedByUnderscoreID
109+
OnlyFunctionsCanBeFollowedByUnderscoreID,
110+
MissingEmptyArgumentListID
110111
;
111112

112113
public int errorNumber() {

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,4 +1847,22 @@ object messages {
18471847
hl"""The syntax ${"x _"} is no longer supported if ${"x"} is not a function.
18481848
|To convert to a function value, you need to explicitly write ${"() => x"}"""
18491849
}
1850+
1851+
case class MissingEmptyArgumentList(method: Symbol)(implicit ctx: Context)
1852+
extends Message(MissingEmptyArgumentListID) {
1853+
val kind = "Syntax"
1854+
val msg = hl"$method must be called with ${"()"} argument"
1855+
val explanation = {
1856+
val codeExample =
1857+
"""def next(): T = ...
1858+
|next // is expanded to next()"""
1859+
1860+
hl"""Previously an empty argument list () was implicitly inserted when calling a nullary method without arguments. E.g.
1861+
|
1862+
|$codeExample
1863+
|
1864+
|In Dotty, this idiom is an error. The application syntax has to follow exactly the parameter syntax.
1865+
|Excluded from this rule are methods that are defined in Java or that override methods defined in Java."""
1866+
}
1867+
}
18501868
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,7 +1908,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
19081908
def methodStr = err.refStr(methPart(tree).tpe)
19091909

19101910
def missingArgs(mt: MethodType) = {
1911-
ctx.error(em"missing arguments for $methodStr", tree.pos)
1911+
ctx.error(MissingEmptyArgumentList(methPart(tree).symbol), tree.pos)
19121912
tree.withType(mt.resultType)
19131913
}
19141914

@@ -2076,7 +2076,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
20762076
def isAutoApplied(sym: Symbol): Boolean = {
20772077
sym.isConstructor ||
20782078
sym.matchNullaryLoosely ||
2079-
ctx.testScala2Mode(em"${sym.showLocated} requires () argument", tree.pos,
2079+
ctx.testScala2Mode(MissingEmptyArgumentList(sym), tree.pos,
20802080
patch(tree.pos.endPos, "()"))
20812081
}
20822082

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,4 +1069,23 @@ class ErrorMessagesTests extends ErrorMessagesTest {
10691069
val OnlyFunctionsCanBeFollowedByUnderscore(pt) :: Nil = messages
10701070
assertEquals("String(n)", pt.show)
10711071
}
1072+
1073+
@Test def missingEmptyArgumentList =
1074+
checkMessagesAfter("frontend") {
1075+
"""
1076+
|class Test {
1077+
| def greet(): String = "Hello"
1078+
| def main(args: Array[String]): Unit = {
1079+
| greet
1080+
| }
1081+
|}
1082+
""".stripMargin
1083+
}
1084+
.expect { (ictx, messages) =>
1085+
implicit val ctx: Context = ictx
1086+
1087+
assertMessageCount(1, messages)
1088+
val MissingEmptyArgumentList(method) :: Nil = messages
1089+
assertEquals("method greet", method.show)
1090+
}
10721091
}

0 commit comments

Comments
 (0)