angular / angular/angular

Linker compliance tests failing with source map errors

Abierto
#51,647 1 comentario 0 reacciones 0 asignados Ver en GitHub
area: compiler
Lenguaje dominante
TypeScript
Estrellas
101k
Forks
27.5k
Merge medio
1 d 19 h
PR fusionados (30 d)
288

Descripción

### Which @angular/* package(s) are the source of the bug?

compiler-cli

### Is this a regression?

Yes

### Description

Our linker compliance tests are failing with many hundreds of unmet expectations due to broken source mappings being generated. This started happening as we updated Babel via https://github.com/angular/angular/pull/49914.

Aside from other regressions in compliance output due to the tests not running, the real mapping errors surface a real issue where it's not yet quite clear whether we need to adjust or Babel introduced a bug.

I've investigated this deeply and digged into internals of Babel and have a good understanding of the source map generation when translating AST to text. Let's have a look at one failure.

```ts
i0.elementStart(<..>) // should map to `

`
```

Right now **this is broken** and the mapping points to a totally unrelated source span. At first glance, this seems magical and it's unclear why this is happening. Debugging the linker Babel ast factory and host, it turns out that we are actually properly trying to set the source map information for e.g. `CallExpressions` to `elementStart`- still with the right offsets.

An initial assumption was that we somehow regressed/broke our source map flattening in ngtsc. Something that is non-trivial to understand very easy to break. I've tried to look directly at the intermediary sources, instead of relying on the flattened source map- and the incorrect mappings were still visible. Hence the flattening is not the culprit.

Going deeper, with more reversing of Babel's generator/traversal- I've assumed that somehow the printer is not picking up our source map information. e.g. `node.loc` may no longer be correct. Turns out this is still the valid field- so our logic is correct. Going further, I noticed that the traversal and state of "current source span" (it's a shared state in the AST printer in Babel) is unexpectedly reset in node traversal. e.g.

```
CallExpression -- //


-> MemberExpression
-> i0 // some other span
-> elementStart
```

Babel basically sets the span for the call expression, but then when the call expression is printed, it goes deeper into the member expression -> then the core import. The core import then causes another span to become the "current source span" but never is reset to the parent span when the we go up the tree again (in-order printing). This then results in the mapping to be incorrect. Everything after `i0` ends up following the source span of the core import and the actual `CallExpression` source span is ignored.

This started happening with https://github.com/babel/babel/commit/4f4b450f5279947c24eae37b97dc8b5e652fcf51#diff-192a3f85cae6c8a5d19e16b083d4c421b517650b00a0e8ae10cf80cb1ce7d941R590. Previously the source spans were always reset to the previous ones, when e.g. a child node completed printing.

```
1. visit CallExpression
2. set span to `

`
3. visit MemberExpression
4. visit core import
5. set span to X
6. print core import
7. set span back to previous `
`
8. visit & print rest of member expressions)
9. visit & print arguments (all using the still active `
` mapping)
```

**Possible fixes**:

* Consider working with Babel to see if the changes actually make sense. It seems odd that a child node AST location would affect the source mappings from a higher-level source mapping that spans over the rest of children. The granularity introduced seems acceptable- but also not sure about size here. In either case the locations seem wrong.

* Ensure the import does not have a span. I determined the import always has a span because we are re-using the original AST node from the `ngImport` field of partial declarations. We **cannot** should likely not do this in the translator as that one is agnostic to e.g. Babel/TS AST.

* Keep the source span for the import, but instead make sure that the followed printed text of the call expression (`i0.elementStart(xxx)`) has the proper span to the HTML source

### Please provide a link to a minimal reproduction of the bug

Here is a reproduction showing the incorrect source mappings:

* [Click here](https://evanw.github.io/source-map-visualization/#MTg3MQBpbXBvcnQgeyBDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7CmltcG9ydCAqIGFzIGkwIGZyb20gIkBhbmd1bGFyL2NvcmUiOwpleHBvcnQgY2xhc3MgVGVzdENtcCB7fQpUZXN0Q21wLsm1ZmFjID0gZnVuY3Rpb24gVGVzdENtcF9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFRlc3RDbXApKCk7Cn07ClRlc3RDbXAuybVjbXAgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lQ29tcG9uZW50KHsKICB0eXBlOiBUZXN0Q21wLAogIHNlbGVjdG9yczogW1sidGVzdC1jbXAiXV0sCiAgZGVjbHM6IDMsCiAgdmFyczogNCwKICB0ZW1wbGF0ZTogZnVuY3Rpb24gVGVzdENtcF9UZW1wbGF0ZShyZiwgY3R4KSB7CiAgICBpZiAocmYgJiAxKSB7CiAgICAgIGkwLsm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICBpMC7Jtcm1dGV4dCgxKTsKICAgICAgaTAuybXJtXBpcGUoMiwgInBlcmNlbnQiKTsKICAgICAgaTAuybXJtWVsZW1lbnRFbmQoKTsKICAgIH0KICAgIGlmIChyZiAmIDIpIHsKICAgICAgaTAuybXJtWFkdmFuY2UoMSk7CiAgICAgIGkwLsm1ybV0ZXh0SW50ZXJwb2xhdGUoaTAuybXJtXBpcGVCaW5kMigyLCAxLCAyMDAuMywgMikpOwogICAgfQogIH0sCiAgZGVwZW5kZW5jaWVzOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gW1BlcmNlbnRQaXBlXTsKICB9LAogIGVuY2Fwc3VsYXRpb246IDIKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFRlc3RDbXAsIFt7CiAgICB0eXBlOiBDb21wb25lbnQsCiAgICBhcmdzOiBbewogICAgICBzZWxlY3RvcjogJ3Rlc3QtY21wJywKICAgICAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicKICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOwpleHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgewogIHRyYW5zZm9ybSgpIHt9Cn0KUGVyY2VudFBpcGUuybVmYWMgPSBmdW5jdGlvbiBQZXJjZW50UGlwZV9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSgpOwp9OwpQZXJjZW50UGlwZS7JtXBpcGUgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lUGlwZSh7CiAgbmFtZTogInBlcmNlbnQiLAogIHR5cGU6IFBlcmNlbnRQaXBlLAogIHB1cmU6IHRydWUKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFBlcmNlbnRQaXBlLCBbewogICAgdHlwZTogUGlwZSwKICAgIGFyZ3M6IFt7CiAgICAgIG5hbWU6ICdwZXJjZW50JwogICAgfV0KICB9XSwgbnVsbCwgbnVsbCk7Cn0pKCk7CmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge30KQXBwTW9kdWxlLsm1ZmFjID0gZnVuY3Rpb24gQXBwTW9kdWxlX0ZhY3RvcnkodCkgewogIHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOwp9OwpBcHBNb2R1bGUuybVtb2QgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lTmdNb2R1bGUoewogIHR5cGU6IEFwcE1vZHVsZQp9KTsKQXBwTW9kdWxlLsm1aW5qID0gLyogQF9fUFVSRV9fICovaTAuybXJtWRlZmluZUluamVjdG9yKHt9KTsKKGZ1bmN0aW9uICgpIHsKICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdEZXZNb2RlKSAmJiBpMC7JtXNldENsYXNzTWV0YWRhdGEoQXBwTW9kdWxlLCBbewogICAgdHlwZTogTmdNb2R1bGUsCiAgICBhcmdzOiBbewogICAgICBkZWNsYXJhdGlvbnM6IFtUZXN0Q21wLCBQZXJjZW50UGlwZV0KICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOzI2NjYAeyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGlvbl93aXRoX3BpcGUuanMiLCJzb3VyY2VzIjpbIi4uL2ludGVycG9sYXRpb25fd2l0aF9waXBlLnRzIl0sIm5hbWVzIjpbIkNvbXBvbmVudCIsIk5nTW9kdWxlIiwiUGlwZSIsImkwIiwiVGVzdENtcCIsIsm1ZmFjIiwiVGVzdENtcF9GYWN0b3J5IiwidCIsIsm1Y21wIiwiybXJtWRlZmluZUNvbXBvbmVudCIsInR5cGUiLCLJtcm1ZWxlbWVudFN0YXJ0IiwiybXJtXRleHQiLCLJtcm1cGlwZSIsIsm1ybVlbGVtZW50RW5kIiwicmYiLCLJtcm1YWR2YW5jZSIsIsm1ybV0ZXh0SW50ZXJwb2xhdGUiLCLJtcm1cGlwZUJpbmQyIiwiZGVwZW5kZW5jaWVzIiwiUGVyY2VudFBpcGUiLCJuZ0Rldk1vZGUiLCLJtXNldENsYXNzTWV0YWRhdGEiLCJhcmdzIiwic2VsZWN0b3IiLCJ0ZW1wbGF0ZSIsInRyYW5zZm9ybSIsIlBlcmNlbnRQaXBlX0ZhY3RvcnkiLCLJtXBpcGUiLCLJtcm1ZGVmaW5lUGlwZSIsIm5hbWUiLCJBcHBNb2R1bGUiLCJBcHBNb2R1bGVfRmFjdG9yeSIsIsm1bW9kIiwiybXJtWRlZmluZU5nTW9kdWxlIiwiybVpbmoiLCLJtcm1ZGVmaW5lSW5qZWN0b3IiLCJkZWNsYXJhdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQ0EsU0FBUyxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FDTSxLQUFLQyxFQUNYLE1BQU0sZUFBZTtBQUdyQixNQUFNLENBQUMsTUFBTUMsT0FBTyxDQUFDO0FBRXJCQSxPQUNNLENBQUNDLElBQUksWUFBQUMsZ0JBQUFDLENBQUE7RUFBQSxZQUFBQSxDQUFBLElBSEVIO0FBQU8sQ0FJQTtBQUFFQSxPQUFPLENBQUNJLElBQUksa0JBSS9CTCxFQUFFLENBQUFNLGlCQUFBO0VBQUFDLElBQUEsRUFSUU47Ozs7O1VBQU87TUFRakJELEVBQUUsQ0FBQVEsY0FBQSxTQVZZLENBQUM7S0FBTixDQVVUUixFQUFFLENBQUFTLE1BQUEsRUFWb0MsQ0FBQztNQVV2Q1QsRUFBRSxDQUFBVSxNQUFBO01BQUZWLEVBQUUsQ0FBQVcsWUFBQSxDQVYwQyxDQUFDO0lBQUE7SUFBQSxJQUFBQyxFQUFBLENBQUM7TUFVOUNaLEVBQUUsQ0FBQWEsU0FBQSxFQVZvQyxDQUFDO01BVXZDYixFQUFFLENBQUFjLGlCQUFBLENBQUZkLEVBQUUsQ0FBQWUsV0FBQSxnQkFWb0MsQ0FBQztJQUFBO0VBQUE7RUFBQUMsWUFBQSxXQUFBQSxDQUFBO0lBQUEsUUFNN0JDOzs7QUFBVyxFQUEyQjtBQUNsRDtFQUFBLFFBQUFDLFNBQUEsb0JBQUFBLFNBQUEsS0FHRWxCLEVBQUUsQ0FBQW1CLGlCQUFBLENBUlFsQixPQUFPLEVBR1osQ0FBQztJQUFjTSxJQUNyQixFQVJEVixTQUFTO0lBQ0N1QixJQUFJLEVBQUUsQ0FETjtNQUNUQyxRQUFRLEVBQUUsVUFBVTtNQUNwQkMsUUFBUSxFQUFFLHFDQUFxQztJQUVwQyxDQURaO0VBQ08sQ0FBQyxDQUFDO0FBQUE7QUFJVixNQUFNLENBQUMsTUFBTUwsV0FBVyxDQUFDO0VBQ3ZCTSxVQUFTLEVBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0FOLFdBQ1UsQ0FBQ2YsSUFBSSxZQUFBc0Isb0JBQUFwQixDQUFBO0VBQUEsWUFBQUEsQ0FBQSxJQUpGYTtBQUFXLENBRXZCO0FBRURBLFdBQVcsQ0FBQ1EsS0FBSyxrQkFBZHpCLEVBQUUsQ0FBQTBCLFlBQUE7RUFBQUMsSUFBQTtFQUFBcEIsSUFBQSxFQUpRVTs7QUFBVyxFQUFvQjtBQUFFO0VBQUEsUUFBQUMsU0FBQSxvQkFBQUEsU0FBQSxLQUkzQ2xCLEVBQUUsQ0FBQW1CLGlCQUFBLENBSlFGLFdBQVcsRUFBYyxDQUFDO0lBQ3RDVixJQUFJLEVBRkpSLElBQUk7SUFBY3FCLElBQUksRUFDdkIsQ0FETTtNQUFDTyxJQUFJLEVBQUUsU0FBUztJQUFDLENBQUE7RUFDZixDQUFDLENBQUM7QUFBQTtBQUtWLE1BQU0sQ0FBQyxNQUFNQyxTQUFTLENBQUM7QUFDckJBLFNBQVMsQ0FBQzFCLElBQUksWUFBQTJCLGtCQUFBekIsQ0FBQTtFQUFBLFlBQUFBLENBQUEsSUFESHdCO0FBQVMsQ0FDeUI7QUFBRUEsU0FBUyxDQUFDRSxJQUFJLGtCQUY1RDlCLEVBQUUsQ0FBQStCLGdCQUFBO0VBQUF4QixJQUFBLEVBQ1FxQjtBQUFTLEVBTE07YUFKZixPQUFPLEVBSVAsV0FBVyxqQ0FBTUEsU0FBUyxDQUFDSSxJQUFJLGtCQUl6Q2hDLEVBQUUsQ0FBQWlDLGdCQUFBLElBRUw7QUFBRTswQ0FEVyxTQUFTLGpEQUNwQixRQUFBZixTQUFBLG9CQUFBQSxTQUFBLEtBRkNsQixFQUFFLENBQUFtQixpQkFBQSxDQUNRUyxTQUFTLEVBQ1gsQ0FBQztJQUFjckIsSUFBSSxFQUY3QlQsUUFBUTtJQUFjc0IsSUFBSSxFQUFFLENBQW5CO01BQUNjLFlBQVksRUFBRSxDQUFDakMsT0FBTyxFQUFFZ0IsV0FBVyxDQUFDO0lBQUMsQ0FBQTtFQUN4QyxDQUFDLENBQUM7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBOZ01vZHVsZSwgUGlwZSwgUGlwZVRyYW5zZm9ybX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Rlc3QtY21wJyxcbiAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicsXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDbXAge1xufVxuXG5AUGlwZSh7bmFtZTogJ3BlcmNlbnQnfSlcbmV4cG9ydCBjbGFzcyBQZXJjZW50UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0oKSB7fVxufVxuXG5ATmdNb2R1bGUoe2RlY2xhcmF0aW9uczogW1Rlc3RDbXAsIFBlcmNlbnRQaXBlXX0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIHtcbn0iXX0=)
* Failures: https://gist.github.com/devversion/993e2c0eee657629185dee91365bd7a2
* PR showing failures: https://github.com/angular/angular/pull/51620
* [Possible fixed source map, by cloning the import expression without location](https://evanw.github.io/source-map-visualization/#MTg3MQBpbXBvcnQgeyBDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7CmltcG9ydCAqIGFzIGkwIGZyb20gIkBhbmd1bGFyL2NvcmUiOwpleHBvcnQgY2xhc3MgVGVzdENtcCB7fQpUZXN0Q21wLsm1ZmFjID0gZnVuY3Rpb24gVGVzdENtcF9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFRlc3RDbXApKCk7Cn07ClRlc3RDbXAuybVjbXAgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lQ29tcG9uZW50KHsKICB0eXBlOiBUZXN0Q21wLAogIHNlbGVjdG9yczogW1sidGVzdC1jbXAiXV0sCiAgZGVjbHM6IDMsCiAgdmFyczogNCwKICB0ZW1wbGF0ZTogZnVuY3Rpb24gVGVzdENtcF9UZW1wbGF0ZShyZiwgY3R4KSB7CiAgICBpZiAocmYgJiAxKSB7CiAgICAgIGkwLsm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICBpMC7Jtcm1dGV4dCgxKTsKICAgICAgaTAuybXJtXBpcGUoMiwgInBlcmNlbnQiKTsKICAgICAgaTAuybXJtWVsZW1lbnRFbmQoKTsKICAgIH0KICAgIGlmIChyZiAmIDIpIHsKICAgICAgaTAuybXJtWFkdmFuY2UoMSk7CiAgICAgIGkwLsm1ybV0ZXh0SW50ZXJwb2xhdGUoaTAuybXJtXBpcGVCaW5kMigyLCAxLCAyMDAuMywgMikpOwogICAgfQogIH0sCiAgZGVwZW5kZW5jaWVzOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gW1BlcmNlbnRQaXBlXTsKICB9LAogIGVuY2Fwc3VsYXRpb246IDIKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFRlc3RDbXAsIFt7CiAgICB0eXBlOiBDb21wb25lbnQsCiAgICBhcmdzOiBbewogICAgICBzZWxlY3RvcjogJ3Rlc3QtY21wJywKICAgICAgdGVtcGxhdGU6ICc8ZGl2Pnt7MjAwLjMgfCBwZXJjZW50IDogMiB9fTwvZGl2PicKICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOwpleHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgewogIHRyYW5zZm9ybSgpIHt9Cn0KUGVyY2VudFBpcGUuybVmYWMgPSBmdW5jdGlvbiBQZXJjZW50UGlwZV9GYWN0b3J5KHQpIHsKICByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSgpOwp9OwpQZXJjZW50UGlwZS7JtXBpcGUgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lUGlwZSh7CiAgbmFtZTogInBlcmNlbnQiLAogIHR5cGU6IFBlcmNlbnRQaXBlLAogIHB1cmU6IHRydWUKfSk7CihmdW5jdGlvbiAoKSB7CiAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nRGV2TW9kZSkgJiYgaTAuybVzZXRDbGFzc01ldGFkYXRhKFBlcmNlbnRQaXBlLCBbewogICAgdHlwZTogUGlwZSwKICAgIGFyZ3M6IFt7CiAgICAgIG5hbWU6ICdwZXJjZW50JwogICAgfV0KICB9XSwgbnVsbCwgbnVsbCk7Cn0pKCk7CmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge30KQXBwTW9kdWxlLsm1ZmFjID0gZnVuY3Rpb24gQXBwTW9kdWxlX0ZhY3RvcnkodCkgewogIHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOwp9OwpBcHBNb2R1bGUuybVtb2QgPSAvKiBAX19QVVJFX18gKi9pMC7Jtcm1ZGVmaW5lTmdNb2R1bGUoewogIHR5cGU6IEFwcE1vZHVsZQp9KTsKQXBwTW9kdWxlLsm1aW5qID0gLyogQF9fUFVSRV9fICovaTAuybXJtWRlZmluZUluamVjdG9yKHt9KTsKKGZ1bmN0aW9uICgpIHsKICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdEZXZNb2RlKSAmJiBpMC7JtXNldENsYXNzTWV0YWRhdGEoQXBwTW9kdWxlLCBbewogICAgdHlwZTogTmdNb2R1bGUsCiAgICBhcmdzOiBbewogICAgICBkZWNsYXJhdGlvbnM6IFtUZXN0Q21wLCBQZXJjZW50UGlwZV0KICAgIH1dCiAgfV0sIG51bGwsIG51bGwpOwp9KSgpOzI2NjIAeyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGlvbl93aXRoX3BpcGUuanMiLCJzb3VyY2VzIjpbIi4uL2ludGVycG9sYXRpb25fd2l0aF9waXBlLnRzIl0sIm5hbWVzIjpbIkNvbXBvbmVudCIsIk5nTW9kdWxlIiwiUGlwZSIsImkwIiwiVGVzdENtcCIsIsm1ZmFjIiwiVGVzdENtcF9GYWN0b3J5IiwidCIsIsm1Y21wIiwiybXJtWRlZmluZUNvbXBvbmVudCIsInR5cGUiLCLJtcm1ZWxlbWVudFN0YXJ0IiwiybXJtXRleHQiLCLJtcm1cGlwZSIsIsm1ybVlbGVtZW50RW5kIiwicmYiLCLJtcm1YWR2YW5jZSIsIsm1ybV0ZXh0SW50ZXJwb2xhdGUiLCLJtcm1cGlwZUJpbmQyIiwiZGVwZW5kZW5jaWVzIiwiUGVyY2VudFBpcGUiLCJuZ0Rldk1vZGUiLCLJtXNldENsYXNzTWV0YWRhdGEiLCJhcmdzIiwic2VsZWN0b3IiLCJ0ZW1wbGF0ZSIsInRyYW5zZm9ybSIsIlBlcmNlbnRQaXBlX0ZhY3RvcnkiLCLJtXBpcGUiLCLJtcm1ZGVmaW5lUGlwZSIsIm5hbWUiLCJBcHBNb2R1bGUiLCJBcHBNb2R1bGVfRmFjdG9yeSIsIsm1bW9kIiwiybXJtWRlZmluZU5nTW9kdWxlIiwiybVpbmoiLCLJtcm1ZGVmaW5lSW5qZWN0b3IiLCJkZWNsYXJhdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQ0EsU0FBUyxFQUFFQyxRQUFRLEVBQUVDLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FDTSxLQUFLQyxFQUNYLE1BQU0sZUFBZTtBQUdyQixNQUFNLENBQUMsTUFBTUMsT0FBTyxDQUFDO0FBRXJCQSxPQUNNLENBQUNDLElBQUksWUFBQUMsZ0JBQUFDLENBQUE7RUFBQSxZQUFBQSxDQUFBLElBSEVIO0FBQU8sQ0FJQTtBQUFFQSxPQUFPLENBQUNJLElBQUksa0JBQUFMLEVBQUEsQ0FBQU0saUJBQUE7RUFBQUMsSUFBQSxFQUpyQk47Ozs7O1VBQU87TUFGUEQsRUFBQSxDQUFBUSxjQUFBLFNBQUksQ0FBQztLQUFOLENBQU1SLEVBQUEsQ0FBQVMsTUFBQSxFQUF1QixDQUFDO01BQUFULEVBQUEsQ0FBQVUsTUFBQTtNQUFBVixFQUFBLENBQUFXLFlBQUEsQ0FBSyxDQUFDO0lBQUE7SUFBQSxJQUFBQyxFQUFBLENBQUM7TUFBL0JaLEVBQUEsQ0FBQWEsU0FBQSxFQUF1QixDQUFDO01BQXhCYixFQUFBLENBQUFjLGlCQUFBLENBQUFkLEVBQUEsQ0FBQWUsV0FBQSxnQkFBdUIsQ0FBQztJQUFBO0VBQUE7RUFBQUMsWUFBQSxXQUFBQSxDQUFBO0lBQUEsUUFNN0JDOzs7QUFBVyxFQUEyQjtBQUNsRDtFQUFBLFFBQUFDLFNBQUEsb0JBQUFBLFNBQUEsS0FBQWxCLEVBQUEsQ0FBQW1CLGlCQUFBLENBTFlsQixPQUFPLEVBR1osQ0FBQztJQUFjTSxJQUNyQixFQVJEVixTQUFTO0lBQ0N1QixJQUFJLEVBQUUsQ0FETjtNQUNUQyxRQUFRLEVBQUUsVUFBVTtNQUNwQkMsUUFBUSxFQUFFLHFDQUFxQztJQUVwQyxDQURaO0VBQ08sQ0FBQyxDQUFDO0FBQUE7QUFJVixNQUFNLENBQUMsTUFBTUwsV0FBVyxDQUFDO0VBQ3ZCTSxVQUFTLEVBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0FOLFdBQ1UsQ0FBQ2YsSUFBSSxZQUFBc0Isb0JBQUFwQixDQUFBO0VBQUEsWUFBQUEsQ0FBQSxJQUpGYTtBQUFXLENBRXZCO0FBRURBLFdBQVcsQ0FBQ1EsS0FBSyxrQkFBQXpCLEVBQUEsQ0FBQTBCLFlBQUE7RUFBQUMsSUFBQTtFQUFBcEIsSUFBQSxFQUpKVTs7QUFBVyxFQUFvQjtBQUFFO0VBQUEsUUFBQUMsU0FBQSxvQkFBQUEsU0FBQSxLQUFBbEIsRUFBQSxDQUFBbUIsaUJBQUEsQ0FBakNGLFdBQVcsRUFBYyxDQUFDO0lBQ3RDVixJQUFJLEVBRkpSLElBQUk7SUFBY3FCLElBQUksRUFDdkIsQ0FETTtNQUFDTyxJQUFJLEVBQUUsU0FBUztJQUFDLENBQUE7RUFDZixDQUFDLENBQUM7QUFBQTtBQUtWLE1BQU0sQ0FBQyxNQUFNQyxTQUFTLENBQUM7QUFDckJBLFNBQVMsQ0FBQzFCLElBQUksWUFBQTJCLGtCQUFBekIsQ0FBQTtFQUFBLFlBQUFBLENBQUEsSUFESHdCO0FBQVMsQ0FDeUI7QUFBRUEsU0FBUyxDQUFDRSxJQUFJLGtCQUFBOUIsRUFBQSxDQUFBK0IsZ0JBQUE7RUFBQXhCLElBQUEsRUFEbERxQjtBQUFTLEVBTE07YUFKZixPQUFPLEVBSVAsV0FBVyxqQ0FBTUEsU0FBUyxDQUFDSSxJQUFJLGtCQUFBaEMsRUFBQSxDQUFBaUMsZ0JBQUEsSUFNNUM7QUFBRTsrRUFEVyw3RUFDWCxRQUFBZixTQUFBLG9CQUFBQSxTQUFBLEtBQUFsQixFQUFBLENBQUFtQixpQkFBQSxDQURXUyxTQUFTLEVBQ1gsQ0FBQztBQURVLElBQ0lyQixJQUFJLEVBRjdCVCxRQUFRO0lBQWNzQixJQUFJLEVBQUUsQ0FBbkI7TUFBQ2MsWUFBWSxFQUFFLENBQUNqQyxPQUFPLEVBQUVnQixXQUFXLENBQUM7SUFBQyxDQUFBO0VBQ3hDLENBQUMsQ0FBQztBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE5nTW9kdWxlLCBQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGVzdC1jbXAnLFxuICB0ZW1wbGF0ZTogJzxkaXY+e3syMDAuMyB8IHBlcmNlbnQgOiAyIH19PC9kaXY+Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENtcCB7XG59XG5cbkBQaXBlKHtuYW1lOiAncGVyY2VudCd9KVxuZXhwb3J0IGNsYXNzIFBlcmNlbnRQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSgpIHt9XG59XG5cbkBOZ01vZHVsZSh7ZGVjbGFyYXRpb25zOiBbVGVzdENtcCwgUGVyY2VudFBpcGVdfSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge1xufSJdfQ==)

### Please provide the exception or error you saw

_No response_

### Please provide the environment you discovered this bug in (run `ng version`)

_No response_

### Anything else?

_No response_

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza ejecutando las pruebas de compliance del linker y comparando sus fallos de source-map con la reproducción proporcionada y PR 51620. Rastrea la traversión del printer de Babel y el manejo de los source spans para el CallExpression, MemberExpression y core import path descritos en el issue. Se considera terminado cuando los mappings generados apuntan a los template spans previstos y se cumplen las expectativas de compliance.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
angular, typescript
Área
compilers, testing
Tipo de issue
Error
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
28/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.