diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts
index 3886bcbabc0a..dec56cbb145b 100644
--- a/packages/compiler/src/ml_parser/lexer.ts
+++ b/packages/compiler/src/ml_parser/lexer.ts
@@ -805,12 +805,41 @@ class _Tokenizer {
return [prefix, name];
}
- private _consumeSingleLineComment() {
+ private _consumeSingleLineComment(start: CharacterCursor) {
+ const contentStart = this._cursor.clone();
this._attemptCharCodeUntilFn((code) => chars.isNewLine(code) || code === chars.$EOF);
+
+ const originalEnd = this._cursor.clone();
+ const content = originalEnd.getChars(contentStart);
+
+ let trimmedStart = 0;
+ while (trimmedStart < content.length && chars.isWhitespace(content.charCodeAt(trimmedStart))) {
+ trimmedStart++;
+ }
+
+ let trimmedEnd = content.length;
+ while (trimmedEnd > trimmedStart && chars.isWhitespace(content.charCodeAt(trimmedEnd - 1))) {
+ trimmedEnd--;
+ }
+
+ let spanStart = contentStart.clone();
+ for (let i = 0; i < trimmedStart; i++) {
+ spanStart.advance();
+ }
+
+ let spanEnd = contentStart.clone();
+ for (let i = 0; i < trimmedEnd; i++) {
+ spanEnd.advance();
+ }
+
+ this._beginToken(TokenType.IN_ELEMENT_COMMENT, spanStart);
+ this._endToken([content.trim()], spanEnd);
+
this._attemptCharCodeUntilFn(isNotWhitespace);
}
- private _consumeMultiLineComment() {
+ private _consumeMultiLineComment(start: CharacterCursor) {
+ const contentStart = this._cursor.clone();
this._attemptCharCodeUntilFn((code) => {
if (code === chars.$EOF) {
return true;
@@ -822,9 +851,35 @@ class _Tokenizer {
}
return false;
});
+
+ const content = this._cursor.getChars(contentStart);
+
+ let trimmedStart = 0;
+ while (trimmedStart < content.length && chars.isWhitespace(content.charCodeAt(trimmedStart))) {
+ trimmedStart++;
+ }
+
+ let trimmedEnd = content.length;
+ while (trimmedEnd > trimmedStart && chars.isWhitespace(content.charCodeAt(trimmedEnd - 1))) {
+ trimmedEnd--;
+ }
+
+ let spanStart = contentStart.clone();
+ for (let i = 0; i < trimmedStart; i++) {
+ spanStart.advance();
+ }
+
+ let spanEnd = contentStart.clone();
+ for (let i = 0; i < trimmedEnd; i++) {
+ spanEnd.advance();
+ }
+
if (this._attemptStr('*/')) {
this._attemptCharCodeUntilFn(isNotWhitespace);
}
+
+ this._beginToken(TokenType.IN_ELEMENT_COMMENT, spanStart);
+ this._endToken([content.trim()], spanEnd);
}
private _consumeTagOpen(start: CharacterCursor) {
@@ -864,13 +919,15 @@ class _Tokenizer {
}
while (true) {
+ const singleLineCommentStart = this._cursor.clone();
if (this._attemptStr('//')) {
- this._consumeSingleLineComment();
+ this._consumeSingleLineComment(singleLineCommentStart);
continue;
}
+ const multilineCommentStart = this._cursor.clone();
if (this._attemptStr('/*')) {
- this._consumeMultiLineComment();
+ this._consumeMultiLineComment(multilineCommentStart);
continue;
}
diff --git a/packages/compiler/src/ml_parser/parser.ts b/packages/compiler/src/ml_parser/parser.ts
index a0a697191656..e1e50065691a 100644
--- a/packages/compiler/src/ml_parser/parser.ts
+++ b/packages/compiler/src/ml_parser/parser.ts
@@ -31,6 +31,7 @@ import {
IncompleteComponentOpenToken,
IncompleteLetToken,
IncompleteTagOpenToken,
+ InElementCommentToken,
InterpolatedAttributeToken,
InterpolatedTextToken,
LetEndToken,
@@ -517,12 +518,16 @@ class _TreeBuilder {
) {
while (
this._peek.type === TokenType.ATTR_NAME ||
- this._peek.type === TokenType.DIRECTIVE_NAME
+ this._peek.type === TokenType.DIRECTIVE_NAME ||
+ this._peek.type === TokenType.IN_ELEMENT_COMMENT
) {
if (this._peek.type === TokenType.DIRECTIVE_NAME) {
directivesResult.push(this._consumeDirective(this._peek));
- } else {
+ } else if (this._peek.type === TokenType.ATTR_NAME) {
attributesResult.push(this._consumeAttr(this._advance