diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs index 3017e96fa6..227c482a61 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/TokenizerBackedParser.cs @@ -168,11 +168,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy if (EndOfFile && ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure)) { Context.ErrorSink.OnError( - start, - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF( + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(start, contentLength: 1 /* { OR } */), Language.GetSample(left), - Language.GetSample(right)), - length: 1 /* { OR } */); + Language.GetSample(right))); } return Balance(mode, left, right, start); @@ -218,11 +217,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy if ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure) { Context.ErrorSink.OnError( - start, - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF( + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(start, contentLength: 1 /* { OR } */), Language.GetSample(left), - Language.GetSample(right)), - length: 1 /* { OR } */); + Language.GetSample(right))); } if ((mode & BalancingModes.BacktrackOnFailure) == BalancingModes.BacktrackOnFailure) { @@ -435,44 +433,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy return false; } - protected internal bool Required(TSymbolType expected, bool errorIfNotFound, Func errorBase) - { - var found = At(expected); - if (!found && errorIfNotFound) - { - string error; - if (Language.IsNewLine(CurrentSymbol)) - { - error = LegacyResources.ErrorComponent_Newline; - } - else if (Language.IsWhiteSpace(CurrentSymbol)) - { - error = LegacyResources.ErrorComponent_Whitespace; - } - else if (EndOfFile) - { - error = LegacyResources.ErrorComponent_EndOfFile; - } - else - { - error = LegacyResources.FormatErrorComponent_Character(CurrentSymbol.Content); - } - - int errorLength; - if (CurrentSymbol == null || CurrentSymbol.Content == null) - { - errorLength = 1; - } - else - { - errorLength = Math.Max(CurrentSymbol.Content.Length, 1); - } - - Context.ErrorSink.OnError(CurrentStart, errorBase(error), errorLength); - } - return found; - } - protected bool EnsureCurrent() { if (CurrentSymbol == null) @@ -634,9 +594,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy { errorReported = true; Context.ErrorSink.OnError( - start, - LegacyResources.ParseError_RazorComment_Not_Terminated, - length: 2 /* @* */); + RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated( + new SourceSpan(start, contentLength: 2 /* @* */))); } else { @@ -649,9 +608,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy { errorReported = true; Context.ErrorSink.OnError( - start, - LegacyResources.ParseError_RazorComment_Not_Terminated, - length: 2 /* @* */); + RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated( + new SourceSpan(start, contentLength: 2 /* @* */))); } } else diff --git a/src/Microsoft.AspNetCore.Razor.Language/RazorDiagnosticFactory.cs b/src/Microsoft.AspNetCore.Razor.Language/RazorDiagnosticFactory.cs index 2f7226fd94..c107f22135 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/RazorDiagnosticFactory.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/RazorDiagnosticFactory.cs @@ -310,6 +310,26 @@ namespace Microsoft.AspNetCore.Razor.Language return RazorDiagnostic.Create(Parsing_UnexpectedEndTag, location, tagName); } + internal static readonly RazorDiagnosticDescriptor Parsing_ExpectedCloseBracketBeforeEOF = + new RazorDiagnosticDescriptor( + $"{DiagnosticPrefix}1027", + () => LegacyResources.ParseError_Expected_CloseBracket_Before_EOF, + RazorDiagnosticSeverity.Error); + public static RazorDiagnostic CreateParsing_ExpectedCloseBracketBeforeEOF(SourceSpan location, string openBrace, string closeBrace) + { + return RazorDiagnostic.Create(Parsing_ExpectedCloseBracketBeforeEOF, location, openBrace, closeBrace); + } + + internal static readonly RazorDiagnosticDescriptor Parsing_RazorCommentNotTerminated = + new RazorDiagnosticDescriptor( + $"{DiagnosticPrefix}1028", + () => LegacyResources.ParseError_RazorComment_Not_Terminated, + RazorDiagnosticSeverity.Error); + public static RazorDiagnostic CreateParsing_RazorCommentNotTerminated(SourceSpan location) + { + return RazorDiagnostic.Create(Parsing_RazorCommentNotTerminated, location); + } + #endregion #region Semantic Errors diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs index 4ffce5e293..7d6bb982bc 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs @@ -148,10 +148,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy ImplicitExpressionTest( "Html.En(code()", "Html.En(code()", AcceptedCharactersInternal.Any, - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(8, 0, 8), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(8, 0, 8), contentLength: 1), "(", ")")); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpErrorTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpErrorTest.cs index 1629f5f15a..d7e617b00c 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpErrorTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpErrorTest.cs @@ -207,10 +207,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Code("Href(" + Environment.NewLine) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(4, 0, 4), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(4, 0, 4), contentLength: 1), "(", ")")); } [Fact] @@ -224,10 +222,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Code($"Foo(Bar(Baz){Environment.NewLine}Biz{Environment.NewLine}Boz") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(3, 0, 3), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(3, 0, 3), contentLength: 1), "(", ")")); } [Fact] @@ -243,10 +239,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Code($"Foo(Bar(Baz){Environment.NewLine}Biz{Environment.NewLine}") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(3, 0, 3), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(3, 0, 3), contentLength: 1), "(", ")")); } [Fact] @@ -260,10 +254,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Code($"Foo[Bar[Baz]{Environment.NewLine}Biz{Environment.NewLine}Boz") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("[", "]"), - new SourceLocation(3, 0, 3), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(3, 0, 3), contentLength: 1), "[", "]")); } [Fact] @@ -279,10 +271,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Code($"Foo[Bar[Baz]{Environment.NewLine}Biz{Environment.NewLine}") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("[", "]"), - new SourceLocation(3, 0, 3), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(3, 0, 3), contentLength: 1), "[", "]")); } // Simple EOF handling errors: @@ -498,10 +488,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new StatementBlock( Factory.Code("if(foo bar" + Environment.NewLine).AsStatement() ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(2, 0, 2), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(2, 0, 2), contentLength: 1), "(", ")")); } [Fact] @@ -512,10 +500,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new StatementBlock( Factory.Code("foreach(foo bar" + Environment.NewLine).AsStatement() ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(7, 0, 7), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(7, 0, 7), contentLength: 1), "(", ")")); } [Fact] @@ -526,10 +512,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new StatementBlock( Factory.Code("do { } while(foo bar" + Environment.NewLine).AsStatement() ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(12, 0, 12), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(12, 0, 12), contentLength: 1), "(", ")")); } [Fact] @@ -540,10 +524,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new StatementBlock( Factory.Code("using(foo bar" + Environment.NewLine).AsStatement() ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(5, 0, 5), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(5, 0, 5), contentLength: 1), "(", ")")); } [Fact] @@ -561,10 +543,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)), Factory.Code("}").AsStatement().Accepts(AcceptedCharactersInternal.None) ), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(2, 0, 2), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(2, 0, 2), contentLength: 1), "(", ")")); } [Fact] @@ -656,10 +636,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)), expectedErrors: new[] { - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(14, 0, 14), - length: 1)), + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(14, 0, 14), contentLength: 1), "(", ")"), }); } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs index 44e5252e9e..3a013a6ec8 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs @@ -15,21 +15,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy get { var noErrors = new RazorDiagnostic[0]; - Func missingEndParenError = (index) => - new RazorDiagnostic[1] - { - RazorDiagnostic.Create(new RazorError( - "An opening \"(\" is missing the corresponding closing \")\".", - new SourceLocation(index, 0, index), - length: 1)) - }; Func missingEndBracketError = (index) => new RazorDiagnostic[1] { - RazorDiagnostic.Create(new RazorError( - "An opening \"[\" is missing the corresponding closing \"]\".", - new SourceLocation(index, 0, index), - length: 1)) + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(index, 0, index), contentLength: 1), "[", "]"), }; // implicitExpression, expectedImplicitExpression, acceptedCharacters, expectedErrors @@ -250,10 +240,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy ImplicitExpressionTest( "foo(()", "foo(()", acceptedCharacters: AcceptedCharactersInternal.Any, - errors: RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(4, 0, 4), - length: 1))); + errors: RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(4, 0, 4), contentLength: 1), "(", ")")); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs index 6afe3662e4..4aa963a7a0 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpRazorCommentsTest.cs @@ -25,10 +25,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy string.Empty, HtmlSymbolType.Unknown)) .Accepts(AcceptedCharactersInternal.Any))), - RazorDiagnostic.Create(new RazorError( - LegacyResources.ParseError_RazorComment_Not_Terminated, - SourceLocation.Zero, - length: 2))); + RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated( + new SourceSpan(SourceLocation.Zero, contentLength: 2))); } [Fact] @@ -79,10 +77,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy .Accepts(AcceptedCharactersInternal.None)), Factory.Code(Environment.NewLine) .AsImplicitExpression(CSharpCodeParser.DefaultKeywords))), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(4, 0, 4), - length: 1))); + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(4, 0, 4), contentLength: 1), "(", ")")); } [Fact] @@ -104,14 +100,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy string.Empty, CSharpSymbolType.Unknown)) .Accepts(AcceptedCharactersInternal.Any)))), - RazorDiagnostic.Create(new RazorError( - LegacyResources.ParseError_RazorComment_Not_Terminated, - new SourceLocation(5, 0, 5), - length: 2)), - RazorDiagnostic.Create(new RazorError( - LegacyResources.FormatParseError_Expected_CloseBracket_Before_EOF("(", ")"), - new SourceLocation(4, 0, 4), - length: 1))); + RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated( + new SourceSpan(new SourceLocation(5, 0, 5), contentLength: 2)), + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(4, 0, 4), contentLength: 1), "(", ")")); } [Fact] @@ -176,10 +168,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy .Accepts(AcceptedCharactersInternal.None), Factory.Span(SpanKindInternal.Comment, new CSharpSymbol(string.Empty, CSharpSymbolType.Unknown)) .Accepts(AcceptedCharactersInternal.Any)))), - RazorDiagnostic.Create(new RazorError( - LegacyResources.ParseError_RazorComment_Not_Terminated, - new SourceLocation(2, 0, 2), - length: 2)), + RazorDiagnosticFactory.CreateParsing_RazorCommentNotTerminated( + new SourceSpan(new SourceLocation(2, 0, 2), contentLength: 2)), RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF( new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1), LegacyResources.BlockName_Code, "}", "{")); } diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpStatementTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpStatementTest.cs index 92c19a1808..0d3a485441 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpStatementTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpStatementTest.cs @@ -248,7 +248,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy get { var factory = new SpanFactory(); - var unbalancedParenErrorString = "An opening \"(\" is missing the corresponding closing \")\"."; // document, expectedStatement, expectedErrors return new TheoryData @@ -260,7 +259,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy factory .Code("try { someMethod(); } catch(Exception) when (") .AsStatement()), - new[] { RazorDiagnostic.Create(new RazorError(unbalancedParenErrorString, 45, 0, 45, 1)) } + new[] + { + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(45, 0, 45), contentLength: 1), "(", ")"), + } }, { "@try { someMethod(); } catch(Exception) when (someMethod(", @@ -269,7 +272,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy factory .Code("try { someMethod(); } catch(Exception) when (someMethod(") .AsStatement()), - new[] { RazorDiagnostic.Create(new RazorError(unbalancedParenErrorString, 45, 0, 45, 1)) } + new[] + { + RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF( + new SourceSpan(new SourceLocation(45, 0, 45), contentLength: 1), "(", ")"), + } }, { "@try { someMethod(); } catch(Exception) when (true) {", @@ -281,7 +288,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new[] { RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF( - new SourceSpan(new SourceLocation(23, 0, 23), contentLength: 1), "catch", "}", "{") + new SourceSpan(new SourceLocation(23, 0, 23), contentLength: 1), "catch", "}", "{"), } }, };