dart-lang / sdk

The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.
https://dart.dev
BSD 3-Clause "New" or "Revised" License
10.28k stars 1.58k forks source link

Handle the new formatting style in the static error test updater #57042

Closed munificent closed 2 weeks ago

munificent commented 2 weeks ago

We have an automated tool in pkg/test_runner/tool/update_static_error_tests.dart that will automatically regenerate the test expectation comments in static error tests. That tool generally tries to indent the expectation comments at the same level as the previous line, like:

class C {
  void method() {
    some + code;
    //   ^ Some error expectation on "+".
  }
}

But if the error marker is too early in the line, it will put the comment at column zero. This was safe to do because the old formatter never indented a line comment if it was at the beginning of the line. That feature is handy here, but was basically an anti-feature everywhere else, so the new formatter doesn't do that.

That means that if you update the test expectations and then format it, expectation comments may get shifted over and point at the wrong column. We should update update_static_error_tests.dart so that it always indents the comment with the previous line and then writes an explicit column number (which the static error test already supports) if the column needs to be before where the indented // starts.

lrhn commented 1 week ago

How do we know the start of the previous line?

If I have:

  var qux = 
      fooLongName() +
          barLongName();
  // some comment about the next line, or the state after the prior line.
  baz();

the comment indentation should be that of the var qux = line. (Right?)

If I am correct, I think it means the update_static_error_test.dart file needs to be able to do some amount of expression and statement parsing to know where the prior statement started. It can't just put it relative to that last line. (Or do we just assume that tests are simple and the statement with the error is on one line? Which might very well be true.)