diff --git a/packages/compiler/src/template_parser/binding_parser.ts b/packages/compiler/src/template_parser/binding_parser.ts index ec709ad94c..6608a5fd19 100644 --- a/packages/compiler/src/template_parser/binding_parser.ts +++ b/packages/compiler/src/template_parser/binding_parser.ts @@ -244,6 +244,10 @@ export class BindingParser { targetProps: ParsedProperty[], keySpan?: ParseSourceSpan) { if (isAnimationLabel(name)) { name = name.substring(1); + if (keySpan !== undefined) { + keySpan = moveParseSourceSpan( + keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset)); + } if (value) { this._reportError( `Assigning animation triggers via @prop="exp" attributes with an expression is invalid.` + @@ -274,9 +278,19 @@ export class BindingParser { if (name.startsWith(ANIMATE_PROP_PREFIX)) { isAnimationProp = true; name = name.substring(ANIMATE_PROP_PREFIX.length); + if (keySpan !== undefined) { + keySpan = moveParseSourceSpan( + keySpan, + new AbsoluteSourceSpan( + keySpan.start.offset + ANIMATE_PROP_PREFIX.length, keySpan.end.offset)); + } } else if (isAnimationLabel(name)) { isAnimationProp = true; name = name.substring(1); + if (keySpan !== undefined) { + keySpan = moveParseSourceSpan( + keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset)); + } } if (isAnimationProp) { @@ -424,6 +438,10 @@ export class BindingParser { if (isAnimationLabel(name)) { name = name.substr(1); + if (keySpan !== undefined) { + keySpan = moveParseSourceSpan( + keySpan, new AbsoluteSourceSpan(keySpan.start.offset + 1, keySpan.end.offset)); + } this._parseAnimationEvent(name, expression, sourceSpan, handlerSpan, targetEvents, keySpan); } else { this._parseRegularEvent( diff --git a/packages/compiler/test/render3/r3_ast_spans_spec.ts b/packages/compiler/test/render3/r3_ast_spans_spec.ts index f073904a0e..f6f03a17a9 100644 --- a/packages/compiler/test/render3/r3_ast_spans_spec.ts +++ b/packages/compiler/test/render3/r3_ast_spans_spec.ts @@ -193,6 +193,30 @@ describe('R3 AST source spans', () => { ['BoundAttribute', 'data-prop="{{v}}"', 'prop', '{{v}}'], ]); }); + + it('is correct for bound properties via @', () => { + expectFromHtml('
').toEqual([ + ['Element', '', '