-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Compiler version
Scala code runner version 3.1.3-RC1-bin-SNAPSHOT-git-aa59abe -- Copyright 2002-2022, LAMP/EPFL
Minimized code
import scala.util.chaining.given
class C:
def op: Unit = throw new RuntimeException("a").tap(_ => println("throw a"))
def handler: Unit = throw new RuntimeException("b").tap(_ => println("throw b"))
def test: Unit =
try op
catch case _: NullPointerException =>
handler
end test
def test1: Unit =
try op
//catch case _: NullPointerException =>
catch
case _: NullPointerException =>
end try
handler
end test1
@main def test() = println {
val c = new C()
c.test
//c.test1
}Compilation output
def test: Unit =
try op catch {
{
case _:NullPointerException => handler
}
}
def test1: Unit =
{
try op catch {
{
case _:NullPointerException =>
<empty>
}
}
handler
}Expectation
In test, the call to handler is in the case, as opposed to following it as in test1.
This is probably because ExprCaseClause must consume an Expr.
The single line catch case in test1 is not allowed with an empty body before end try.
That may be a feature, but the doc for new control syntax says it must "follow on a single line"; maybe that wording just needs to be tweaked to say "start on the same line".
However, it's also very confusing to read. It doesn't conform to intuitions acquired from optional braces (which doesn't govern this syntax). Normally, the aligned token that is not case incurs the outdent. (And now I see that is not only when the case is aligned with match.)
def f(x: Int): Int =
x match
case 1 =>
println("no") ; 42
case _ => 27I love single line catch case quiet syntax, but would love it more on a single line.
Sample in the wild where it's not obvious what was intended.