feat(compiler): Add keySpan to Variable Node (#38965)
Now that we have `keySpan` for `BoundAttribute` (implemented in https://github.com/angular/angular/pull/38898) we could do the same for `Variable`. This would allow us to distinguish the LHS and RHS from the whole source span. PR Close #38965
This commit is contained in:
parent
cf9176eb46
commit
239968d2f1
|
@ -118,7 +118,7 @@ export class Content implements Node {
|
|||
export class Variable implements Node {
|
||||
constructor(
|
||||
public name: string, public value: string, public sourceSpan: ParseSourceSpan,
|
||||
public valueSpan?: ParseSourceSpan) {}
|
||||
readonly keySpan: ParseSourceSpan, public valueSpan?: ParseSourceSpan) {}
|
||||
visit<Result>(visitor: Visitor<Result>): Result {
|
||||
return visitor.visitVariable(this);
|
||||
}
|
||||
|
|
|
@ -159,7 +159,7 @@ class HtmlAstToIvyAst implements html.Visitor {
|
|||
templateKey, templateValue, attribute.sourceSpan, absoluteValueOffset, [],
|
||||
templateParsedProperties, parsedVariables);
|
||||
templateVariables.push(...parsedVariables.map(
|
||||
v => new t.Variable(v.name, v.value, v.sourceSpan, v.valueSpan)));
|
||||
v => new t.Variable(v.name, v.value, v.sourceSpan, v.keySpan, v.valueSpan)));
|
||||
} else {
|
||||
// Check for variables, events, property bindings, interpolation
|
||||
hasBinding = this.parseAttribute(
|
||||
|
@ -356,7 +356,8 @@ class HtmlAstToIvyAst implements html.Visitor {
|
|||
} else if (bindParts[KW_LET_IDX]) {
|
||||
if (isTemplateElement) {
|
||||
const identifier = bindParts[IDENT_KW_IDX];
|
||||
this.parseVariable(identifier, value, srcSpan, attribute.valueSpan, variables);
|
||||
const keySpan = createKeySpan(srcSpan, bindParts[KW_LET_IDX], identifier);
|
||||
this.parseVariable(identifier, value, srcSpan, keySpan, attribute.valueSpan, variables);
|
||||
} else {
|
||||
this.reportError(`"let-" is only supported on ng-template elements.`, srcSpan);
|
||||
}
|
||||
|
@ -425,7 +426,7 @@ class HtmlAstToIvyAst implements html.Visitor {
|
|||
}
|
||||
|
||||
private parseVariable(
|
||||
identifier: string, value: string, sourceSpan: ParseSourceSpan,
|
||||
identifier: string, value: string, sourceSpan: ParseSourceSpan, keySpan: ParseSourceSpan,
|
||||
valueSpan: ParseSourceSpan|undefined, variables: t.Variable[]) {
|
||||
if (identifier.indexOf('-') > -1) {
|
||||
this.reportError(`"-" is not allowed in variable names`, sourceSpan);
|
||||
|
@ -433,7 +434,7 @@ class HtmlAstToIvyAst implements html.Visitor {
|
|||
this.reportError(`Variable does not have a name`, sourceSpan);
|
||||
}
|
||||
|
||||
variables.push(new t.Variable(identifier, value, sourceSpan, valueSpan));
|
||||
variables.push(new t.Variable(identifier, value, sourceSpan, keySpan, valueSpan));
|
||||
}
|
||||
|
||||
private parseReference(
|
||||
|
|
|
@ -50,8 +50,12 @@ class R3AstSourceSpans implements t.Visitor<void> {
|
|||
}
|
||||
|
||||
visitVariable(variable: t.Variable) {
|
||||
this.result.push(
|
||||
['Variable', humanizeSpan(variable.sourceSpan), humanizeSpan(variable.valueSpan)]);
|
||||
this.result.push([
|
||||
'Variable',
|
||||
humanizeSpan(variable.sourceSpan),
|
||||
humanizeSpan(variable.keySpan),
|
||||
humanizeSpan(variable.valueSpan),
|
||||
]);
|
||||
}
|
||||
|
||||
visitReference(reference: t.Reference) {
|
||||
|
@ -233,7 +237,7 @@ describe('R3 AST source spans', () => {
|
|||
'Template', '<ng-template let-a="b"></ng-template>', '<ng-template let-a="b">',
|
||||
'</ng-template>'
|
||||
],
|
||||
['Variable', 'let-a="b"', 'b'],
|
||||
['Variable', 'let-a="b"', 'a', 'b'],
|
||||
]);
|
||||
});
|
||||
|
||||
|
@ -243,7 +247,7 @@ describe('R3 AST source spans', () => {
|
|||
'Template', '<ng-template data-let-a="b"></ng-template>', '<ng-template data-let-a="b">',
|
||||
'</ng-template>'
|
||||
],
|
||||
['Variable', 'data-let-a="b"', 'b'],
|
||||
['Variable', 'data-let-a="b"', 'a', 'b'],
|
||||
]);
|
||||
});
|
||||
|
||||
|
@ -282,7 +286,7 @@ describe('R3 AST source spans', () => {
|
|||
],
|
||||
['TextAttribute', 'ngFor', '<empty>'],
|
||||
['BoundAttribute', '*ngFor="let item of items"', 'of', 'items'],
|
||||
['Variable', 'let item ', '<empty>'],
|
||||
['Variable', 'let item ', 'item', '<empty>'],
|
||||
[
|
||||
'Element', '<div *ngFor="let item of items"></div>', '<div *ngFor="let item of items">',
|
||||
'</div>'
|
||||
|
@ -314,7 +318,7 @@ describe('R3 AST source spans', () => {
|
|||
[
|
||||
'BoundAttribute', '*ngFor="let item of items; trackBy: trackByFn"', 'trackBy', 'trackByFn'
|
||||
],
|
||||
['Variable', 'let item ', '<empty>'],
|
||||
['Variable', 'let item ', 'item', '<empty>'],
|
||||
[
|
||||
'Element', '<div *ngFor="let item of items; trackBy: trackByFn"></div>',
|
||||
'<div *ngFor="let item of items; trackBy: trackByFn">', '</div>'
|
||||
|
@ -327,7 +331,7 @@ describe('R3 AST source spans', () => {
|
|||
expectFromHtml('<div *ngIf="let a=b"></div>').toEqual([
|
||||
['Template', '<div *ngIf="let a=b"></div>', '<div *ngIf="let a=b">', '</div>'],
|
||||
['TextAttribute', 'ngIf', '<empty>'],
|
||||
['Variable', 'let a=b', 'b'],
|
||||
['Variable', 'let a=b', 'a', 'b'],
|
||||
['Element', '<div *ngIf="let a=b"></div>', '<div *ngIf="let a=b">', '</div>'],
|
||||
]);
|
||||
});
|
||||
|
@ -336,7 +340,7 @@ describe('R3 AST source spans', () => {
|
|||
expectFromHtml('<div *ngIf="expr as local"></div>').toEqual([
|
||||
['Template', '<div *ngIf="expr as local"></div>', '<div *ngIf="expr as local">', '</div>'],
|
||||
['BoundAttribute', '*ngIf="expr as local"', 'ngIf', 'expr'],
|
||||
['Variable', 'ngIf="expr as local', 'ngIf'],
|
||||
['Variable', 'ngIf="expr as local', 'local', 'ngIf'],
|
||||
['Element', '<div *ngIf="expr as local"></div>', '<div *ngIf="expr as local">', '</div>'],
|
||||
]);
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue