Skip to content

Dubious parse recovery from for missing do #22306

Open
@som-snytt

Description

@som-snytt

Minimized code

//> using scala 3.6.2

def f(xs: List[Int]) =
  if x.nonEmpty then
    for x <- xs
      println(x)
  end if
end f

Output

-- [E040] Syntax Error: /home/amarki/snips/fordone.scala:7:0 -------------------
7 |  end if
  |^^^
  |'<-' expected, but 'end of statement' found
-- [E006] Not Found Error: /home/amarki/snips/fordone.scala:4:5 ----------------
4 |  if x.nonEmpty then
  |     ^
  |     Not found: x
  |

Expectation

The error on 6 is imprecise. In particular, I'd expect the correctly indented end if to "contain" the parse error.

It's not clear what the three carets correspond to. I have previously seen "encoded" names produce extra carets in messages, especially when synthetic, such as a x$1. This may be an example.

The original problem IRL was a long source file with many cascading errors due to missing definitions and subsequent errors on previous lines; the syntax error seen here was still shown first, as desired.

It looks like the precise error popped out in the middle of the cascade:

[error] 643 |        if unapplied.is(CaseClass) then
[error]     |                                   ^^^^
[error]     |                                   yield or do expected

Before that, it is still really wanting the <-:

[error] 625 |    warnings.result().sorta(_._2.span.point)
[error]     |                     ^
[error]     |                     '<-' expected, but '.' found

and

[error] 638 |        case _ =>
[error]     |               ^^
[error]     |               '<-' expected, but '=>' found

-Vprint:parser is too late to show what the for rewriting was trying to do:

package <empty> {
  def f(xs: List[Int]) =
    if x.nonEmpty then
      for x <- xs; println(x) <- _root_.scala.Predef.???;
        _ <- _root_.scala.Predef.??? do _root_.scala.Predef.???
}

To the untrained eye, it wants an arrow because everything looks like a generator.

The pun is that the past tense of for ... do is fordone.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions