From 2064c89591ad8d1c82cd4669d2e9192a81046a06 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Mon, 20 Feb 2023 23:39:00 -0800 Subject: [PATCH] Parens for params --- .../scala/tools/nsc/ast/parser/Parsers.scala | 12 ++++++++++-- src/compiler/scala/tools/nsc/settings/Warnings.scala | 2 ++ test/files/neg/parens-for-params-3.check | 4 ++++ test/files/neg/parens-for-params-3.scala | 10 ++++++++++ test/files/neg/parens-for-params.check | 6 ++++++ test/files/neg/parens-for-params.scala | 10 ++++++++++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/files/neg/parens-for-params-3.check create mode 100644 test/files/neg/parens-for-params-3.scala create mode 100644 test/files/neg/parens-for-params.check create mode 100644 test/files/neg/parens-for-params.scala diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index ab125e793582..af6443d3afca 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -777,8 +777,16 @@ self => /** Convert tree to formal parameter list. */ def convertToParams(tree: Tree): List[ValDef] = tree match { - case Parens(ts) => ts map convertToParam - case _ => List(convertToParam(tree)) + case Parens(ts) => ts.map(convertToParam) + case Typed(Ident(_), _) => + val msg = "parentheses are required around the parameter of a lambda" + val silencing = s"$msg (Or use '-Wconf:msg=$msg:s' to silence this warning)" + if (currentRun.isScala3 && settings.Wsource.value) + syntaxError(tree.pos.point, silencing) + else if (currentRun.isScala3 || settings.Wsource.value) + deprecationWarning(tree.pos.point, silencing, "2.13.11") + List(convertToParam(tree)) + case _ => List(convertToParam(tree)) } /** Convert tree to formal parameter. */ diff --git a/src/compiler/scala/tools/nsc/settings/Warnings.scala b/src/compiler/scala/tools/nsc/settings/Warnings.scala index 94f9a49c9604..d9497a0d1368 100644 --- a/src/compiler/scala/tools/nsc/settings/Warnings.scala +++ b/src/compiler/scala/tools/nsc/settings/Warnings.scala @@ -27,6 +27,8 @@ trait Warnings { // Warning semantics. val fatalWarnings = BooleanSetting("-Werror", "Fail the compilation if there are any warnings.") withAbbreviation "-Xfatal-warnings" + val Wsource = BooleanSetting("-Wsource", "Increase warnings/errors due to -Xsource.") + private val WconfDefault = List("cat=deprecation:ws", "cat=feature:ws", "cat=optimizer:ws") // Note: user-defined settings are added on the right, but the value is reversed before // it's parsed, so that later defined settings take precedence. diff --git a/test/files/neg/parens-for-params-3.check b/test/files/neg/parens-for-params-3.check new file mode 100644 index 000000000000..c4d1d99d4af9 --- /dev/null +++ b/test/files/neg/parens-for-params-3.check @@ -0,0 +1,4 @@ +parens-for-params-3.scala:5: error: parentheses are required around the parameter of a lambda (Or use '-Wconf:msg=parentheses are required around the parameter of a lambda:s' to silence this warning) + x: Int => x * 2 + ^ +1 error diff --git a/test/files/neg/parens-for-params-3.scala b/test/files/neg/parens-for-params-3.scala new file mode 100644 index 000000000000..93ac43e199cf --- /dev/null +++ b/test/files/neg/parens-for-params-3.scala @@ -0,0 +1,10 @@ +// scalac: -Werror -Wsource -Xsource:3 + +class C { + def f = { + x: Int => x * 2 + } + def g = { + (x: Int) => x * 2 + } +} diff --git a/test/files/neg/parens-for-params.check b/test/files/neg/parens-for-params.check new file mode 100644 index 000000000000..e6477fe1c727 --- /dev/null +++ b/test/files/neg/parens-for-params.check @@ -0,0 +1,6 @@ +parens-for-params.scala:5: warning: parentheses are required around the parameter of a lambda (Or use '-Wconf:msg=parentheses are required around the parameter of a lambda:s' to silence this warning) + x: Int => x * 2 + ^ +error: No warnings can be incurred under -Werror. +1 warning +1 error diff --git a/test/files/neg/parens-for-params.scala b/test/files/neg/parens-for-params.scala new file mode 100644 index 000000000000..435cb967269a --- /dev/null +++ b/test/files/neg/parens-for-params.scala @@ -0,0 +1,10 @@ +// scalac: -Werror -Wsource -Xlint + +class C { + def f = { + x: Int => x * 2 + } + def g = { + (x: Int) => x * 2 + } +}