Mark whitespace between tag helper directive and its value as Markup

This commit is contained in:
Ajay Bhargav Baaskaran 2017-08-28 21:06:57 -07:00
parent 1b5bd4afac
commit f3d121cacf
2 changed files with 117 additions and 37 deletions

View File

@ -2148,11 +2148,15 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
var keywordLength = Span.End.AbsoluteIndex - Span.Start.AbsoluteIndex; var keywordLength = Span.End.AbsoluteIndex - Span.Start.AbsoluteIndex;
var foundWhitespace = At(CSharpSymbolType.WhiteSpace); var foundWhitespace = At(CSharpSymbolType.WhiteSpace);
AcceptWhile(CSharpSymbolType.WhiteSpace);
// If we found whitespace then any content placed within the whitespace MAY cause a destructive change // If we found whitespace then any content placed within the whitespace MAY cause a destructive change
// to the document. We can't accept it. // to the document. We can't accept it.
Output(SpanKindInternal.MetaCode, foundWhitespace ? AcceptedCharactersInternal.None : AcceptedCharactersInternal.AnyExceptNewline); var acceptedCharacters = foundWhitespace ? AcceptedCharactersInternal.None : AcceptedCharactersInternal.AnyExceptNewline;
Output(SpanKindInternal.MetaCode, acceptedCharacters);
AcceptWhile(CSharpSymbolType.WhiteSpace);
Span.ChunkGenerator = SpanChunkGenerator.Null;
Output(SpanKindInternal.Markup, acceptedCharacters);
if (EndOfFile || At(CSharpSymbolType.NewLine)) if (EndOfFile || At(CSharpSymbolType.NewLine))
{ {

View File

@ -347,7 +347,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.Code(Environment.NewLine + " ").AsStatement(), Factory.Code(Environment.NewLine + " ").AsStatement(),
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"*, Foo\"") Factory.Code("\"*, Foo\"")
.AsAddTagHelper( .AsAddTagHelper(
@ -370,7 +374,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
.AutoCompleteWith(autoCompleteString: null, atEndOfSpan: false), .AutoCompleteWith(autoCompleteString: null, atEndOfSpan: false),
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"*, Foo\"") Factory.Code("\"*, Foo\"")
.AsAddTagHelper( .AsAddTagHelper(
@ -1013,7 +1021,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"\"") Factory.Code("\"\"")
.AsTagHelperPrefixDirective("\"\"", string.Empty))); .AsTagHelperPrefixDirective("\"\"", string.Empty)));
@ -1026,7 +1037,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo") Factory.Code("Foo")
.AsTagHelperPrefixDirective("Foo", "Foo"))); .AsTagHelperPrefixDirective("Foo", "Foo")));
@ -1039,7 +1053,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo\"") Factory.Code("\"Foo\"")
.AsTagHelperPrefixDirective("\"Foo\"", "Foo"))); .AsTagHelperPrefixDirective("\"Foo\"", "Foo")));
@ -1058,7 +1075,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.EmptyCSharp() Factory.EmptyCSharp()
.AsTagHelperPrefixDirective(string.Empty, string.Empty, expectedError) .AsTagHelperPrefixDirective(string.Empty, string.Empty, expectedError)
@ -1087,7 +1107,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo") Factory.Code("\"Foo")
.AsTagHelperPrefixDirective("\"Foo", "\"Foo", expectedErrors))); .AsTagHelperPrefixDirective("\"Foo", "\"Foo", expectedErrors)));
@ -1115,7 +1138,10 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory Factory
.MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword + " ") .MetaCode(SyntaxConstants.CSharp.TagHelperPrefixKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo \"") Factory.Code("Foo \"")
.AsTagHelperPrefixDirective("Foo \"", "Foo \"", expectedErrors))); .AsTagHelperPrefixDirective("Foo \"", "Foo \"", expectedErrors)));
@ -1135,7 +1161,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper \"\"", ParseBlockTest("@removeTagHelper \"\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"\"") Factory.Code("\"\"")
.AsRemoveTagHelper( .AsRemoveTagHelper(
@ -1158,7 +1188,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper Foo", ParseBlockTest("@removeTagHelper Foo",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo") Factory.Code("Foo")
.AsRemoveTagHelper( .AsRemoveTagHelper(
@ -1181,7 +1215,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper \"Foo\"", ParseBlockTest("@removeTagHelper \"Foo\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo\"") Factory.Code("\"Foo\"")
.AsRemoveTagHelper( .AsRemoveTagHelper(
@ -1196,7 +1234,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper Foo, Bar ", ParseBlockTest("@removeTagHelper Foo, Bar ",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo, Bar ") Factory.Code("Foo, Bar ")
.AsRemoveTagHelper( .AsRemoveTagHelper(
@ -1226,7 +1266,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper ", ParseBlockTest("@removeTagHelper ",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.EmptyCSharp() Factory.EmptyCSharp()
.AsRemoveTagHelper(string.Empty, string.Empty, legacyErrors: expectedErrors) .AsRemoveTagHelper(string.Empty, string.Empty, legacyErrors: expectedErrors)
@ -1255,7 +1297,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper \"Foo", ParseBlockTest("@removeTagHelper \"Foo",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo") Factory.Code("\"Foo")
.AsRemoveTagHelper("\"Foo", "\"Foo", legacyErrors: expectedErrors))); .AsRemoveTagHelper("\"Foo", "\"Foo", legacyErrors: expectedErrors)));
@ -1283,7 +1329,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@removeTagHelper Foo\"", ParseBlockTest("@removeTagHelper Foo\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.RemoveTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo\"") Factory.Code("Foo\"")
.AsRemoveTagHelper("Foo\"", "Foo\"", legacyErrors: expectedErrors) .AsRemoveTagHelper("Foo\"", "Foo\"", legacyErrors: expectedErrors)
@ -1304,7 +1354,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper \"\"", ParseBlockTest("@addTagHelper \"\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"\"") Factory.Code("\"\"")
.AsAddTagHelper( .AsAddTagHelper(
@ -1327,7 +1381,9 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper Foo", ParseBlockTest("@addTagHelper Foo",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo") Factory.Code("Foo")
.AsAddTagHelper( .AsAddTagHelper(
@ -1350,7 +1406,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper \"Foo\"", ParseBlockTest("@addTagHelper \"Foo\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo\"") Factory.Code("\"Foo\"")
.AsAddTagHelper( .AsAddTagHelper(
@ -1365,7 +1425,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper Foo, Bar ", ParseBlockTest("@addTagHelper Foo, Bar ",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo, Bar ") Factory.Code("Foo, Bar ")
.AsAddTagHelper( .AsAddTagHelper(
@ -1395,7 +1459,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper ", ParseBlockTest("@addTagHelper ",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.EmptyCSharp() Factory.EmptyCSharp()
.AsAddTagHelper(string.Empty, string.Empty, legacyErrors: expectedErrors) .AsAddTagHelper(string.Empty, string.Empty, legacyErrors: expectedErrors)
@ -1424,7 +1492,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper \"Foo", ParseBlockTest("@addTagHelper \"Foo",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("\"Foo") Factory.Code("\"Foo")
.AsAddTagHelper("\"Foo", "\"Foo", legacyErrors: expectedErrors))); .AsAddTagHelper("\"Foo", "\"Foo", legacyErrors: expectedErrors)));
@ -1452,7 +1524,11 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
ParseBlockTest("@addTagHelper Foo\"", ParseBlockTest("@addTagHelper Foo\"",
new DirectiveBlock( new DirectiveBlock(
Factory.CodeTransition(), Factory.CodeTransition(),
Factory.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword + " ") Factory
.MetaCode(SyntaxConstants.CSharp.AddTagHelperKeyword)
.Accepts(AcceptedCharactersInternal.None),
Factory
.Span(SpanKindInternal.Markup, " ", markup: false)
.Accepts(AcceptedCharactersInternal.None), .Accepts(AcceptedCharactersInternal.None),
Factory.Code("Foo\"") Factory.Code("Foo\"")
.AsAddTagHelper("Foo\"", "Foo\"", legacyErrors: expectedErrors) .AsAddTagHelper("Foo\"", "Foo\"", legacyErrors: expectedErrors)