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.26k stars 1.58k forks source link

dart2js -O1 breaks angular tests - then dead code fixes it O_o #44729

Open daniel-v opened 3 years ago

daniel-v commented 3 years ago

I'm not sure if it is dart2js or angular_test related issue. Due to lack of better idea, I'm pretty much duplicating https://github.com/angulardart/angular/issues/1952 here too.

Basically what I have observed is that having a bit of specially prepared dead code influences the compilation/optimization process of dart2js in such a way that it makes things work. I expect my code to work without the dead code but it doesn't. Without further ado, repro code here

Repro steps:

  1. grab a stagehand angular starter project
  2. throw in the test and the build.yaml file from gist
  3. pub run build_runner test -r -- -p chrome

-r command line argument is important. DDC works fine.

There are a number of things that must be present in order for this to happen:

  1. Component should use AsyncPipe on a special Stream
  2. The implementation of that Stream must be "mockito-like" - overriding noSuchMethod
  3. dart2js compiler must have -O1 or above optimization level

Until this point, component test fails, though I think it should pass. To fix it, there are 2 approaches:

  1. add a bit of dead code like in the gist
  2. use -O0 optimization level for dart2js

My expectation: Both reachable tests pass without dead code

What happens: Without dead code, the component test fails, though it shouldn't

Env

Uhm, so I'm wondering, is it an angular_test bug or did I stumble onto something compiler related? (There is a 3rd option: I'm a idiot and I'm missing something)

daniel-v commented 3 years ago

(hihi, had my fun, wonder if this workaround will pass CR: https://gist.github.com/daniel-v/e734a6b5f0f5ba5ead26130ddc67cb93 )