diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperParseTreeRewriter.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperParseTreeRewriter.cs index ca0bc08809..c46a0b0bab 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperParseTreeRewriter.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperParseTreeRewriter.cs @@ -221,7 +221,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy var tagName = startTag.GetTagName(); // Could not determine tag name, it can't be a TagHelper, continue on and track the element. - if (tagName == null) + if (tagName == null || tagName.StartsWith("!")) { return false; } @@ -288,7 +288,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy rewritten = null; var tagName = tagBlock.GetTagName(); // Could not determine tag name, it can't be a TagHelper, continue on and track the element. - if (tagName == null) + if (tagName == null || tagName.StartsWith("!")) { return false; } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxNodeExtensions.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxNodeExtensions.cs index 521bb4ed79..b696e221da 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxNodeExtensions.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxNodeExtensions.cs @@ -243,15 +243,33 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax throw new ArgumentNullException(nameof(tagBlock)); } - if (tagBlock.Children.Count == 0 || !(tagBlock.Children[0] is MarkupTextLiteralSyntax childLiteral)) + MarkupTextLiteralSyntax nameLiteral = null; + var isBangTag = false; + if (tagBlock.Children.Count > 0 && tagBlock.Children[0] is MarkupTextLiteralSyntax firstChild) + { + if (firstChild.GetContent().StartsWith("<") && + tagBlock.Children.Count >= 3 && + tagBlock.Children[1] is RazorMetaCodeSyntax && + tagBlock.Children[2] is MarkupTextLiteralSyntax potentialBangTagName) + { + isBangTag = true; + nameLiteral = potentialBangTagName; + } + else + { + nameLiteral = firstChild; + } + } + + if (nameLiteral == null) { return null; } SyntaxToken textToken = null; - for (var i = 0; i < childLiteral.LiteralTokens.Count; i++) + for (var i = 0; i < nameLiteral.LiteralTokens.Count; i++) { - var token = childLiteral.LiteralTokens[i]; + var token = nameLiteral.LiteralTokens[i]; if (token != null && (token.Kind == SyntaxKind.Whitespace || token.Kind == SyntaxKind.Text)) @@ -266,7 +284,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Syntax return null; } - return textToken.Kind == SyntaxKind.Whitespace ? null : textToken.Content; + var name = textToken.Kind == SyntaxKind.Whitespace ? null : textToken.Content; + if (name != null && isBangTag) + { + name = "!" + name; + } + + return name; } public static bool IsSelfClosing(this MarkupTagBlockSyntax tagBlock)