diff --git a/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs b/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs new file mode 100644 index 0000000000..a9bc3601b7 --- /dev/null +++ b/src/Microsoft.AspNetCore.Razor.Language/DirectiveTokenEditHandler.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.Language.Legacy; + +namespace Microsoft.AspNetCore.Razor.Language +{ + internal class DirectiveTokenEditHandler : SpanEditHandler + { + public DirectiveTokenEditHandler(Func> tokenizer) : base(tokenizer) + { + } + + protected override PartialParseResult CanAcceptChange(Span target, SourceChange change) + { + if (AcceptedCharacters == AcceptedCharacters.NonWhiteSpace) + { + var originalText = change.GetOriginalText(target); + var editedContent = change.GetEditedContent(target); + + if (!ContainsWhitespace(originalText) && !ContainsWhitespace(editedContent)) + { + // Did not modify whitespace, directive format should be the same. + // Return provisional so extensible IR/code gen pieces can see the full directive text + // once the user stops editing the document. + return PartialParseResult.Accepted | PartialParseResult.Provisional; + } + } + + return PartialParseResult.Rejected; + + } + + private static bool ContainsWhitespace(string content) + { + for (var i = 0; i < content.Length; i++) + { + if (char.IsWhiteSpace(content[i])) + { + return true; + } + } + + return false; + } + } +} diff --git a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs index b96181a9d1..91ce56bffe 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/Legacy/CSharpCodeParser.cs @@ -1649,6 +1649,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy } Span.ChunkGenerator = new DirectiveTokenChunkGenerator(tokenDescriptor); + Span.EditHandler = new DirectiveTokenEditHandler(Language.TokenizeString); Output(SpanKind.Code, AcceptedCharacters.NonWhiteSpace); } diff --git a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/IntegrationTests/CodeGenerationIntegrationTest.cs b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/IntegrationTests/CodeGenerationIntegrationTest.cs index 9a60a1eb9e..f0dcdcdbb5 100644 --- a/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/IntegrationTests/CodeGenerationIntegrationTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test/IntegrationTests/CodeGenerationIntegrationTest.cs @@ -249,11 +249,7 @@ public class DivTagHelper : {typeof(TagHelper).FullName} public void InvalidNamespaceAtEOF_DesignTime() { var references = CreateCompilationReferences(CurrentMvcShim); - RunDesignTimeTest(references, - expectedErrors: new[] - { - "Identifier expected" - }); + RunDesignTimeTest(references, expectedErrors: new[] { "Identifier expected" }); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs new file mode 100644 index 0000000000..f1d59030c7 --- /dev/null +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/DirectiveTokenEditHandlerTest.cs @@ -0,0 +1,66 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.AspNetCore.Razor.Language.Legacy; +using Xunit; + +namespace Microsoft.AspNetCore.Razor.Language.Test +{ + public class DirectiveTokenEditHandlerTest + { + [Theory] + [InlineData(0, 4, "")] // "Namespace" + [InlineData(4, 0, "Other")] // "SomeOtherNamespace" + [InlineData(0, 4, "Other")] // "OtherNamespace" + public void CanAcceptChange_ProvisionallyAcceptsNonWhitespaceChanges(int index, int length, string newText) + { + // Arrange + var factory = new SpanFactory(); + var directiveTokenHandler = new TestDirectiveTokenEditHandler(); + var target = factory.Span(SpanKind.Code, "SomeNamespace", markup: false) + .With(directiveTokenHandler) + .Accepts(AcceptedCharacters.NonWhiteSpace); + var sourceChange = new SourceChange(index, length, newText); + + // Act + var result = directiveTokenHandler.CanAcceptChange(target, sourceChange); + + // Assert + Assert.Equal(PartialParseResult.Accepted | PartialParseResult.Provisional, result); + } + + [Theory] + [InlineData(4, 1, "")] // "SomeNamespace" + [InlineData(9, 0, " ")] // "Some Name space" + [InlineData(9, 5, " Space")] // "Some Name Space" + public void CanAcceptChange_RejectsWhitespaceChanges(int index, int length, string newText) + { + // Arrange + var factory = new SpanFactory(); + var directiveTokenHandler = new TestDirectiveTokenEditHandler(); + var target = factory.Span(SpanKind.Code, "Some Namespace", markup: false) + .With(directiveTokenHandler) + .Accepts(AcceptedCharacters.NonWhiteSpace); + var sourceChange = new SourceChange(index, length, newText); + + // Act + var result = directiveTokenHandler.CanAcceptChange(target, sourceChange); + + // Assert + Assert.Equal(PartialParseResult.Rejected, result); + } + + private class TestDirectiveTokenEditHandler : DirectiveTokenEditHandler + { + public TestDirectiveTokenEditHandler() : base(content => SpanConstructor.TestTokenizer(content)) + { + } + + public new PartialParseResult CanAcceptChange(Span target, SourceChange change) + => base.CanAcceptChange(target, change); + } + } +} diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs index 011b3c8067..6a5cd0c02f 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpAutoCompleteTest.cs @@ -33,8 +33,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "Header", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + .AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First()), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -87,9 +86,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Header", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Header", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First()), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs index 0daa079a41..cb32fa4f23 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpDirectivesTest.cs @@ -119,9 +119,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -142,9 +140,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Some_Member", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "Some_Member", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -165,9 +161,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "BaseNamespace", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "BaseNamespace", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -188,9 +182,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "BaseNamespace.Foo.Bar", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "BaseNamespace.Foo.Bar", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -211,9 +203,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"AString\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "\"AString\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -336,19 +326,13 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Some_Member", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[1])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "Some_Member", markup: false).AsDirectiveToken(descriptor.Tokens[1]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"AString\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[2])) - .Accepts(AcceptedCharacters.NonWhiteSpace))); + Factory.Span(SpanKind.Code, "\"AString\"", markup: false).AsDirectiveToken(descriptor.Tokens[2]))); } [Fact] @@ -369,9 +353,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"Header\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"Header\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{") .AutoCompleteWith(null, atEndOfSpan: true) @@ -405,9 +387,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"Name\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"Name\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{") .AutoCompleteWith(null, atEndOfSpan: true) @@ -435,14 +415,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "System.Text.Encoding.ASCIIEncoding", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Some_Member", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[1])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "Some_Member", markup: false).AsDirectiveToken(descriptor.Tokens[1]), Factory.Span(SpanKind.Markup, " ", markup: false) .Accepts(AcceptedCharacters.WhiteSpace))); @@ -492,9 +468,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"hello\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"hello\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ; ", markup: false).Accepts(AcceptedCharacters.WhiteSpace))); } @@ -521,9 +495,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"hello\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"hello\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace)), expectedErorr); @@ -552,9 +524,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace)), expectedErorr); @@ -583,9 +553,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace)), + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false).AsDirectiveToken(descriptor.Tokens[0])), expectedErorr); } @@ -612,9 +580,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"Hello\"", markup: false) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens[0])) - .Accepts(AcceptedCharacters.NonWhiteSpace), + Factory.Span(SpanKind.Code, "\"Hello\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{") .AutoCompleteWith("}", atEndOfSpan: true) @@ -935,9 +901,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("inherits").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "System.Web.WebPages.WebPage", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First())))); + Factory.Span(SpanKind.Code, "System.Web.WebPages.WebPage", markup: false).AsDirectiveToken(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First()))); } [Fact] @@ -948,9 +912,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("inherits").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "string[[]][]", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First())))); + Factory.Span(SpanKind.Code, "string[[]][]", markup: false).AsDirectiveToken(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First()))); } [Fact] @@ -962,8 +924,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("inherits").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "System.Web.Mvc.WebViewPage>", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First())))); + .AsDirectiveToken(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First()))); } [Fact] @@ -975,8 +936,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("inherits").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "string", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First())))); + .AsDirectiveToken(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First()))); } [Fact] @@ -1014,8 +974,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "Header", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + .AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First()), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -1059,8 +1018,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy DirectiveKind.SingleLine, b => b.AddOptionalStringToken()); - var chunkGenerator = new DirectiveTokenChunkGenerator(descriptor.Tokens.First()); - // Act & Assert ParseCodeBlockTest( "@custom \"simple-value\"", @@ -1071,8 +1028,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "\"simple-value\"", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(chunkGenerator))); + .AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -1084,8 +1040,6 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy DirectiveKind.SingleLine, b => b.AddOptionalStringToken()); - var chunkGenerator = new DirectiveTokenChunkGenerator(descriptor.Tokens.First()); - // Act & Assert ParseCodeBlockTest( "@custom \"{formaction}?/{id}?\"", @@ -1096,8 +1050,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), Factory.Span(SpanKind.Code, "\"{formaction}?/{id}?\"", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(chunkGenerator))); + .AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] @@ -1118,13 +1071,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("custom").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Markup, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "\"{formaction}?/{id}?\"", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "\"{formaction}?/{id}?\"", markup: false).AsDirectiveToken(descriptor.Tokens[0]), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "System.String", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens.Last())))); + Factory.Span(SpanKind.Code, "System.String", markup: false).AsDirectiveToken(descriptor.Tokens.Last()))); } [Fact] @@ -1165,9 +1114,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("TestDirective").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", markup: false).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "PropertyName", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(descriptor.Tokens.First())))); + Factory.Span(SpanKind.Code, "PropertyName", markup: false).AsDirectiveToken(descriptor.Tokens[0]))); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs index 3eb862d2a4..bf5c9248fb 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSectionTest.cs @@ -35,9 +35,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " " + Environment.NewLine + " ", markup: false).Accepts(AcceptedCharacters.AllWhiteSpace)), Factory.EmptyHtml()), new RazorError( @@ -110,9 +108,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First()))), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0])), Factory.Markup("-bar { "), new MarkupTagBlock( Factory.Markup("

")), @@ -136,9 +132,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -147,9 +141,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "bar", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "bar", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -180,9 +172,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -207,9 +197,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -230,9 +218,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -265,9 +251,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Test", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Test", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, Environment.NewLine, CSharpSymbolType.NewLine).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith("}", atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -299,9 +283,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " " + Environment.NewLine, markup: false).Accepts(AcceptedCharacters.AllWhiteSpace)), Factory.EmptyHtml()), new RazorError( @@ -328,9 +310,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " " + string.Format("{0}{0}{0}{0}{0}{0}", Environment.NewLine), markup: false).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -355,9 +335,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -382,9 +360,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( Factory.Markup(" "), @@ -408,9 +384,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -435,9 +409,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -465,9 +437,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -492,9 +462,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -517,9 +485,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -538,9 +504,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -561,9 +525,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -583,9 +545,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -608,9 +568,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -635,9 +593,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy factory.CodeTransition(), factory.MetaCode("section").Accepts(AcceptedCharacters.None), factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -662,9 +618,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy factory.CodeTransition(), factory.MetaCode("section").Accepts(AcceptedCharacters.None), factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + factory.Span(SpanKind.Code, "s", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSpecialBlockTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSpecialBlockTest.cs index 1e157145d1..b8db152812 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSpecialBlockTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpSpecialBlockTest.cs @@ -27,9 +27,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy new DirectiveBlock(new DirectiveChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor), Factory.MetaCode("inherits").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo.Bar, string, int>.Baz", markup: false) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens.First())))); + Factory.Span(SpanKind.Code, "Foo.Bar, string, int>.Baz", markup: false).AsDirectiveToken(CSharpCodeParser.InheritsDirectiveDescriptor.Tokens[0]))); } [Fact] diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs index 00fe7ca003..a1c81a0903 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlDocumentTest.cs @@ -113,9 +113,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -478,9 +476,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs index a2e8c23c9f..1086f37d0c 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/HtmlToCodeSwitchTest.cs @@ -295,9 +295,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -398,9 +396,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( @@ -426,9 +422,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy Factory.CodeTransition(), Factory.MetaCode("section").Accepts(AcceptedCharacters.None), Factory.Span(SpanKind.Code, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.WhiteSpace), - Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier) - .Accepts(AcceptedCharacters.NonWhiteSpace) - .With(new DirectiveTokenChunkGenerator(CSharpCodeParser.SectionDirectiveDescriptor.Tokens.First())), + Factory.Span(SpanKind.Code, "Foo", CSharpSymbolType.Identifier).AsDirectiveToken(CSharpCodeParser.SectionDirectiveDescriptor.Tokens[0]), Factory.Span(SpanKind.Markup, " ", CSharpSymbolType.WhiteSpace).Accepts(AcceptedCharacters.AllWhiteSpace), Factory.MetaCode("{").AutoCompleteWith(null, atEndOfSpan: true).Accepts(AcceptedCharacters.None), new MarkupBlock( diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TestSpanBuilder.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TestSpanBuilder.cs index 38419d279d..95f05e6a6d 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TestSpanBuilder.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/TestSpanBuilder.cs @@ -153,6 +153,14 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy .Accepts(AcceptedCharacters.AnyExceptNewline); } + public static SpanConstructor AsDirectiveToken(this SpanConstructor self, DirectiveTokenDescriptor descriptor) + { + return self + .With(new DirectiveTokenChunkGenerator(descriptor)) + .With(new DirectiveTokenEditHandler((content) => SpanConstructor.TestTokenizer(content))) + .Accepts(AcceptedCharacters.NonWhiteSpace); + } + public static SourceLocation GetLocationAndAdvance(this SourceLocationTracker self, string content) { var ret = self.CurrentLocation;