fix(compiler): fix Elements not making a new ParseSourceSpan (#31190)

Change the Element constructor in r3_ast to create a new ParseSourceSpan when regenerating it rather than extending an object, which does not contain the overloaded toString().

PR Close #31190
This commit is contained in:
Ayaz Hafiz 2019-06-20 18:42:44 -07:00 committed by Kara Erickson
parent 9c06af2dfc
commit 7035f225ad
2 changed files with 11 additions and 1 deletions

View File

@ -72,7 +72,7 @@ export class Element implements Node {
public endSourceSpan: ParseSourceSpan|null, public i18n?: I18nAST) { public endSourceSpan: ParseSourceSpan|null, public i18n?: I18nAST) {
// If the element is empty then the source span should include any closing tag // If the element is empty then the source span should include any closing tag
if (children.length === 0 && startSourceSpan && endSourceSpan) { if (children.length === 0 && startSourceSpan && endSourceSpan) {
this.sourceSpan = {...sourceSpan, end: endSourceSpan.end}; this.sourceSpan = new ParseSourceSpan(sourceSpan.start, endSourceSpan.end);
} }
} }
visit<Result>(visitor: Visitor<Result>): Result { return visitor.visitElement(this); } visit<Result>(visitor: Visitor<Result>): Result { return visitor.visitElement(this); }

View File

@ -95,7 +95,17 @@ function expectFromR3Nodes(nodes: t.Node[]) {
return expect(humanizer.result); return expect(humanizer.result);
} }
function expectSpanFromHtml(html: string) {
const {nodes} = parse(html);
return expect(nodes[0] !.sourceSpan.toString());
}
describe('R3 template transform', () => { describe('R3 template transform', () => {
describe('ParseSpan on nodes toString', () => {
it('should create valid text span on Element with adjacent start and end tags',
() => { expectSpanFromHtml('<div></div>').toBe('<div></div>'); });
});
describe('Nodes without binding', () => { describe('Nodes without binding', () => {
it('should parse text nodes', () => { it('should parse text nodes', () => {
expectFromHtml('a').toEqual([ expectFromHtml('a').toEqual([