diff --git a/src/Microsoft.AspNetCore.Razor.Evolution/Legacy/CSharpCodeParser.cs b/src/Microsoft.AspNetCore.Razor.Evolution/Legacy/CSharpCodeParser.cs index 16098b483a..373f2af6ea 100644 --- a/src/Microsoft.AspNetCore.Razor.Evolution/Legacy/CSharpCodeParser.cs +++ b/src/Microsoft.AspNetCore.Razor.Evolution/Legacy/CSharpCodeParser.cs @@ -1568,6 +1568,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution.Legacy { case DirectiveDescriptorKind.SingleLine: Optional(CSharpSymbolType.Semicolon); + AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true)); if (At(CSharpSymbolType.NewLine)) { diff --git a/test/Microsoft.AspNetCore.Razor.Evolution.Test/Legacy/CSharpDirectivesTest.cs b/test/Microsoft.AspNetCore.Razor.Evolution.Test/Legacy/CSharpDirectivesTest.cs index 31ca99f5c0..348a0739a5 100644 --- a/test/Microsoft.AspNetCore.Razor.Evolution.Test/Legacy/CSharpDirectivesTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Evolution.Test/Legacy/CSharpDirectivesTest.cs @@ -218,6 +218,27 @@ namespace Microsoft.AspNetCore.Razor.Evolution.Legacy expectedErorr); } + [Fact] + public void DirectiveDescriptor_NoErrorsSemicolonAfterDirective() + { + // Arrange + var descriptor = DirectiveDescriptorBuilder.Create("custom").AddString().Build(); + + // Act & Assert + ParseCodeBlockTest( + "@custom hello ; ", + new[] { descriptor }, + new DirectiveBlock( + new DirectiveChunkGenerator(descriptor), + Factory.CodeTransition(), + Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), + Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), + Factory.Span(SpanKind.Markup, "hello", markup: false) + .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) + .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Markup, " ; ", markup: false).Accepts(AcceptedCharacters.WhiteSpace))); + } + [Fact] public void DirectiveDescriptor_ErrorsExtraContentAfterDirective() {