From 47bfba11b978693ae67fb91df2a4de8a0c1f2e2b Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 14 May 2015 17:15:56 -0700 Subject: [PATCH] React to aspnet/Razor#217 fix --- .../MvcRazorCodeParser.cs | 28 +++++++++++-------- .../MvcCSharpRazorCodeParserTest.cs | 12 ++++---- .../MvcRazorCodeParserTest.cs | 4 +-- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorCodeParser.cs b/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorCodeParser.cs index 83083e49be..84470586ef 100644 --- a/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorCodeParser.cs +++ b/src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorCodeParser.cs @@ -50,17 +50,18 @@ namespace Microsoft.AspNet.Mvc.Razor { // Verify we're on the right keyword and accept AssertDirective(ModelKeyword); + var startModelLocation = CurrentLocation; AcceptAndMoveNext(); - var endModelLocation = CurrentLocation; BaseTypeDirective(Resources.FormatMvcRazorCodeParser_KeywordMustBeFollowedByTypeName(ModelKeyword), CreateModelCodeGenerator); if (_modelStatementFound) { - Context.OnError(endModelLocation, - Resources.FormatMvcRazorCodeParser_OnlyOneModelStatementIsAllowed(ModelKeyword)); + Context.OnError(startModelLocation, + Resources.FormatMvcRazorCodeParser_OnlyOneModelStatementIsAllowed(ModelKeyword), + ModelKeyword.Length); } _modelStatementFound = true; @@ -72,22 +73,25 @@ namespace Microsoft.AspNet.Mvc.Razor { // @inject MyApp.MyService MyServicePropertyName AssertDirective(InjectKeyword); + var startLocation = CurrentLocation; AcceptAndMoveNext(); Context.CurrentBlock.Type = BlockType.Directive; // Accept whitespace - var remainingWs = AcceptSingleWhiteSpaceCharacter(); + var remainingWhitespace = AcceptSingleWhiteSpaceCharacter(); + var keywordwithSingleWhitespaceLength = Span.GetContent().Value.Length; if (Span.Symbols.Count > 1) { Span.EditHandler.AcceptedCharacters = AcceptedCharacters.None; } Output(SpanKind.MetaCode); - if (remainingWs != null) + if (remainingWhitespace != null) { - Accept(remainingWs); + Accept(remainingWhitespace); } + var remainingWhitespaceLength = Span.GetContent().Value.Length; // Consume any other whitespace tokens. AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true)); @@ -95,8 +99,10 @@ namespace Microsoft.AspNet.Mvc.Razor var hasTypeError = !At(CSharpSymbolType.Identifier); if (hasTypeError) { - Context.OnError(CurrentLocation, - Resources.FormatMvcRazorCodeParser_KeywordMustBeFollowedByTypeName(InjectKeyword)); + Context.OnError( + startLocation, + Resources.FormatMvcRazorCodeParser_KeywordMustBeFollowedByTypeName(InjectKeyword), + InjectKeyword.Length); } // Accept 'MyApp.MyService' @@ -105,14 +111,14 @@ namespace Microsoft.AspNet.Mvc.Razor // typeName now contains the token 'MyApp.MyService' var typeName = Span.GetContent().Value; - var propertyStartLocation = CurrentLocation; AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true)); if (!hasTypeError && (EndOfFile || At(CSharpSymbolType.NewLine))) { // Add an error for the property name only if we successfully read the type name - Context.OnError(propertyStartLocation, - Resources.FormatMvcRazorCodeParser_InjectDirectivePropertyNameRequired(InjectKeyword)); + Context.OnError(startLocation, + Resources.FormatMvcRazorCodeParser_InjectDirectivePropertyNameRequired(InjectKeyword), + keywordwithSingleWhitespaceLength + remainingWhitespaceLength + typeName.Length); } // Read until end of line. Span now contains 'MyApp.MyService MyServiceName'. diff --git a/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcCSharpRazorCodeParserTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcCSharpRazorCodeParserTest.cs index 1a6b04307f..97bd1118e3 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcCSharpRazorCodeParserTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Host.Test/MvcCSharpRazorCodeParserTest.cs @@ -117,7 +117,7 @@ namespace Microsoft.AspNet.Mvc.Razor var expectedErrors = new[] { new RazorError("The 'model' keyword must be followed by a type name on the same line.", - new SourceLocation(9, 0, 9), 1) + new SourceLocation(1, 0, 1), 5) }; Assert.Equal(expectedSpans, spans); Assert.Equal(expectedErrors, errors); @@ -157,7 +157,7 @@ namespace Microsoft.AspNet.Mvc.Razor var expectedErrors = new[] { new RazorError("Only one 'model' statement is allowed in a file.", - new SourceLocation(18, 1, 6), 1) + new SourceLocation(13, 1, 1), 5) }; // Act @@ -394,7 +394,7 @@ namespace Microsoft.AspNet.Mvc.Razor var expectedErrors = new[] { new RazorError("The 'inject' keyword must be followed by a type name on the same line.", - new SourceLocation(11, 0, 11), 1) + new SourceLocation(1, 0, 1), 6) }; // Act @@ -427,7 +427,7 @@ namespace Microsoft.AspNet.Mvc.Razor var expectedErrors = new[] { new RazorError("The 'inject' keyword must be followed by a type name on the same line.", - new SourceLocation(11, 0, 11), 1) + new SourceLocation(1, 0, 1), 6) }; // Act @@ -462,7 +462,7 @@ namespace Microsoft.AspNet.Mvc.Razor { new RazorError("A property name must be specified when using the 'inject' statement. " + "Format for a 'inject' statement is '@inject '.", - new SourceLocation(20, 0, 20), 1) + new SourceLocation(1, 0, 1), 21) }; // Act @@ -496,7 +496,7 @@ namespace Microsoft.AspNet.Mvc.Razor { new RazorError("A property name must be specified when using the 'inject' statement. " + "Format for a 'inject' statement is '@inject '.", - new SourceLocation(19, 0, 19), 1) + new SourceLocation(1, 0, 1), 21) }; // Act diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/MvcRazorCodeParserTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/MvcRazorCodeParserTest.cs index 541278268d..1bd9b14f57 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/MvcRazorCodeParserTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/MvcRazorCodeParserTest.cs @@ -147,7 +147,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Host.Test }; var expectedErrors = new[] { - new RazorError("The 'model' keyword must be followed by a type name on the same line.", new SourceLocation(9, 0, 9), 1) + new RazorError("The 'model' keyword must be followed by a type name on the same line.", new SourceLocation(1, 0, 1), 5) }; Assert.Equal(expectedSpans, spans.ToArray()); Assert.Equal(expectedErrors, errors.ToArray()); @@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Host.Test var expectedErrors = new[] { - new RazorError("Only one 'model' statement is allowed in a file.", new SourceLocation(18, 1, 6), 1) + new RazorError("Only one 'model' statement is allowed in a file.", new SourceLocation(13, 1, 1), 5) }; expectedSpans.Zip(spans, (exp, span) => new { expected = exp, span = span }).ToList().ForEach(i => Assert.Equal(i.expected, i.span)); Assert.Equal(expectedSpans, spans.ToArray());