diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTemplateTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTemplateTest.cs
index 0631ff1c7f..1b69d3750c 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTemplateTest.cs
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpTemplateTest.cs
@@ -8,314 +8,88 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class CSharpTemplateTest : CsHtmlCodeParserTestBase
{
- private const string TestTemplateCode = " @
Foo #@item
";
-
- private TemplateBlock TestTemplate()
+ public CSharpTemplateTest()
{
- return new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- new MarkupTagBlock(
- Factory.Markup("").Accepts(AcceptedCharactersInternal.None)),
- Factory.Markup("Foo #"),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("item")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- new MarkupTagBlock(
- Factory.Markup("
").Accepts(AcceptedCharactersInternal.None))
- )
- );
+ UseBaselineTests = true;
}
- private const string TestNestedTemplateCode = " @Foo #@Html.Repeat(10, @
@item
)";
-
- private TemplateBlock TestNestedTemplate()
- {
- return new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- new MarkupTagBlock(
- Factory.Markup("").Accepts(AcceptedCharactersInternal.None)),
- Factory.Markup("Foo #"),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("Html.Repeat(10, ")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords),
- new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- new MarkupTagBlock(
- Factory.Markup("
").Accepts(AcceptedCharactersInternal.None)),
- Factory.EmptyHtml(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("item")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- new MarkupTagBlock(
- Factory.Markup("
").Accepts(AcceptedCharactersInternal.None))
- )
- ),
- Factory.Code(")")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- new MarkupTagBlock(
- Factory.Markup("").Accepts(AcceptedCharactersInternal.None))
- )
- );
- }
[Fact]
public void ParseBlockHandlesSingleLineTemplate()
{
- ParseBlockTest("{ var foo = @: bar" + Environment.NewLine
- + "; }",
- new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(" var foo = ")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- Factory.MetaMarkup(":", HtmlSymbolType.Colon),
- Factory.Markup(" bar" + Environment.NewLine)
- .With(new SpanEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString))
- .Accepts(AcceptedCharactersInternal.None)
- )
- ),
- Factory.Code("; ").AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("{ var foo = @: bar" + Environment.NewLine + "; }");
}
[Fact]
public void ParseBlockHandlesSingleLineImmediatelyFollowingStatementChar()
{
- ParseBlockTest("{i@: bar" + Environment.NewLine
- + "}",
- new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code("i")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- Factory.MetaMarkup(":", HtmlSymbolType.Colon),
- Factory.Markup(" bar" + Environment.NewLine)
- .With(new SpanEditHandler(CSharpLanguageCharacteristics.Instance.TokenizeString))
- .Accepts(AcceptedCharactersInternal.None)
- )
- ),
- Factory.EmptyCSharp().AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("{i@: bar" + Environment.NewLine + "}");
}
[Fact]
public void ParseBlockHandlesSimpleTemplateInExplicitExpressionParens()
{
- ParseBlockTest("(Html.Repeat(10," + TestTemplateCode + "))",
- new ExpressionBlock(
- Factory.MetaCode("(").Accepts(AcceptedCharactersInternal.None),
- Factory.Code("Html.Repeat(10, ").AsExpression(),
- TestTemplate(),
- Factory.Code(")").AsExpression(),
- Factory.MetaCode(")").Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("(Html.Repeat(10, @Foo #@item
))");
}
[Fact]
public void ParseBlockHandlesSimpleTemplateInImplicitExpressionParens()
{
- ParseBlockTest("Html.Repeat(10," + TestTemplateCode + ")",
- new ExpressionBlock(
- Factory.Code("Html.Repeat(10, ")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords),
- TestTemplate(),
- Factory.Code(")")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ));
+ ParseBlockTest("Html.Repeat(10, @Foo #@item
)");
}
[Fact]
public void ParseBlockHandlesTwoTemplatesInImplicitExpressionParens()
{
- ParseBlockTest("Html.Repeat(10," + TestTemplateCode + "," + TestTemplateCode + ")",
- new ExpressionBlock(
- Factory.Code("Html.Repeat(10, ")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords),
- TestTemplate(),
- Factory.Code(", ")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords),
- TestTemplate(),
- Factory.Code(")")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ));
+ ParseBlockTest("Html.Repeat(10, @Foo #@item
, @Foo #@item
)");
}
[Fact]
public void ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens()
{
- ParseBlockTest("Html.Repeat(10," + TestNestedTemplateCode + ")",
- new ExpressionBlock(
- Factory.Code("Html.Repeat(10, ")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords),
- TestNestedTemplate(),
- Factory.Code(")")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- GetNestedTemplateError(42));
+ ParseBlockTest("Html.Repeat(10, @Foo #@Html.Repeat(10, @
@item
))");
}
[Fact]
public void ParseBlockHandlesSimpleTemplateInStatementWithinCodeBlock()
{
- ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo," + TestTemplateCode + "); }",
- new StatementBlock(
- Factory.Code("foreach(foo in Bar) { Html.ExecuteTemplate(foo, ").AsStatement(),
- TestTemplate(),
- Factory.Code("); }")
- .AsStatement()
- .Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo, @Foo #@item
); }");
}
[Fact]
public void ParseBlockHandlesTwoTemplatesInStatementWithinCodeBlock()
{
- ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo," + TestTemplateCode + "," + TestTemplateCode + "); }",
- new StatementBlock(
- Factory.Code("foreach(foo in Bar) { Html.ExecuteTemplate(foo, ").AsStatement(),
- TestTemplate(),
- Factory.Code(", ").AsStatement(),
- TestTemplate(),
- Factory.Code("); }")
- .AsStatement()
- .Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo, @Foo #@item
, @Foo #@item
); }");
}
[Fact]
public void ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock()
{
- ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo," + TestNestedTemplateCode + "); }",
- new StatementBlock(
- Factory.Code("foreach(foo in Bar) { Html.ExecuteTemplate(foo, ")
- .AsStatement(),
- TestNestedTemplate(),
- Factory.Code("); }")
- .AsStatement()
- .Accepts(AcceptedCharactersInternal.None)
- ),
- GetNestedTemplateError(74));
+ ParseBlockTest("foreach(foo in Bar) { Html.ExecuteTemplate(foo, @Foo #@Html.Repeat(10, @
@item
)); }");
}
[Fact]
public void ParseBlockHandlesSimpleTemplateInStatementWithinStatementBlock()
{
- ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo," + TestTemplateCode + "); }",
- new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(" var foo = bar; Html.ExecuteTemplate(foo, ")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- TestTemplate(),
- Factory.Code("); ").AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo, @Foo #@item
); }");
}
[Fact]
public void ParseBlockHandlessTwoTemplatesInStatementWithinStatementBlock()
{
- ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo," + TestTemplateCode + "," + TestTemplateCode + "); }",
- new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(" var foo = bar; Html.ExecuteTemplate(foo, ")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- TestTemplate(),
- Factory.Code(", ").AsStatement(),
- TestTemplate(),
- Factory.Code("); ").AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)
- ));
+ ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo, @Foo #@item
, @Foo #@item
); }");
}
[Fact]
public void ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock()
{
- ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo," + TestNestedTemplateCode + "); }",
- new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(" var foo = bar; Html.ExecuteTemplate(foo, ")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- TestNestedTemplate(),
- Factory.Code("); ").AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None)
- ),
- GetNestedTemplateError(69));
+ ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo, @Foo #@Html.Repeat(10, @
@item
)); }");
}
[Fact]
public void ParseBlock_WithDoubleTransition_DoesNotThrow()
{
- FixupSpans = true;
-
- // Arrange
- var testTemplateWithDoubleTransitionCode = " @Foo #@item
";
- var testTemplateWithDoubleTransition = new TemplateBlock(
- new MarkupBlock(
- Factory.MarkupTransition(),
- new MarkupTagBlock(
- Factory.Markup("(" foo='", 46, 0, 46), new LocationTagged("'", 54, 0, 54)),
- Factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- Factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 52, 0, 52), new LocationTagged("@", 52, 0, 52))).Accepts(AcceptedCharactersInternal.None),
- Factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- Factory.Markup("'").With(SpanChunkGenerator.Null)),
- Factory.Markup(">").Accepts(AcceptedCharactersInternal.None)),
- Factory.Markup("Foo #"),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("item")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- new MarkupTagBlock(
- Factory.Markup("
").Accepts(AcceptedCharactersInternal.None))
- )
- );
-
- var expected = new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- Factory.Code(" var foo = bar; Html.ExecuteTemplate(foo, ")
- .AsStatement()
- .AutoCompleteWith(autoCompleteString: null),
- testTemplateWithDoubleTransition,
- Factory.Code("); ").AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None));
-
- // Act & Assert
- ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo," + testTemplateWithDoubleTransitionCode + "); }", expected);
- }
-
- private static RazorDiagnostic GetNestedTemplateError(int characterIndex)
- {
- return RazorDiagnosticFactory.CreateParsing_InlineMarkupBlocksCannotBeNested(
- new SourceSpan(new SourceLocation(characterIndex, 0, characterIndex), contentLength: 1));
+ ParseBlockTest("{ var foo = bar; Html.ExecuteTemplate(foo, @Foo #@item
); }");
}
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInExplicitExpressionParens.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInExplicitExpressionParens.syntaxtree.txt
new file mode 100644
index 0000000000..ec95fa14ec
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInExplicitExpressionParens.syntaxtree.txt
@@ -0,0 +1,39 @@
+Expression block - Gen - 37 - (0:0,0)
+ MetaCode span - Gen - [(] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftParenthesis;[(];
+ Code span - Gen - [Html.Repeat(10, ] - SpanEditHandler;Accepts:Any - (1:0,1) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (17:0,17)
+ Markup block - Gen - 18 - (17:0,17)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (17:0,17) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (18:0,18)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (18:0,18) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (21:0,21) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (26:0,26)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (26:0,26) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (27:0,27) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (31:0,31)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (31:0,31) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - SpanEditHandler;Accepts:Any - (35:0,35) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
+ MetaCode span - Gen - [)] - SpanEditHandler;Accepts:None - (36:0,36) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInImplicitExpressionParens.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInImplicitExpressionParens.syntaxtree.txt
new file mode 100644
index 0000000000..455fd22856
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInImplicitExpressionParens.syntaxtree.txt
@@ -0,0 +1,35 @@
+Expression block - Gen - 35 - (0:0,0)
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (16:0,16)
+ Markup block - Gen - 18 - (16:0,16)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (17:0,17)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (17:0,17) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (25:0,25)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (26:0,26) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (30:0,30)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (30:0,30) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (34:0,34) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinCodeBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinCodeBlock.syntaxtree.txt
new file mode 100644
index 0000000000..8ab7c76aec
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinCodeBlock.syntaxtree.txt
@@ -0,0 +1,49 @@
+Statement block - Gen - 70 - (0:0,0)
+ Code span - Gen - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:18
+ CSharpSymbolType.Keyword;[foreach];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[in];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (48:0,48)
+ Markup block - Gen - 18 - (48:0,48)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (49:0,49)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (49:0,49) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (57:0,57)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (58:0,58) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (62:0,62)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (62:0,62) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); }] - SpanEditHandler;Accepts:None - (66:0,66) - Symbols:4
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinStatementBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinStatementBlock.syntaxtree.txt
new file mode 100644
index 0000000000..eec6a66d97
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSimpleTemplateInStatementWithinStatementBlock.syntaxtree.txt
@@ -0,0 +1,51 @@
+Statement block - Gen - 65 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:17
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (43:0,43)
+ Markup block - Gen - 18 - (43:0,43)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (44:0,44)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (44:0,44) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (52:0,52)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (53:0,53) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (57:0,57)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); ] - SpanEditHandler;Accepts:Any - (61:0,61) - Symbols:3
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (64:0,64) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineImmediatelyFollowingStatementChar.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineImmediatelyFollowingStatementChar.syntaxtree.txt
new file mode 100644
index 0000000000..6cdc834d41
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineImmediatelyFollowingStatementChar.syntaxtree.txt
@@ -0,0 +1,19 @@
+Statement block - Gen - 11 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [i] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[i];
+ Template block - Gen - 8 - (2:0,2)
+ Markup block - Gen - 8 - (2:0,2)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (2:0,2) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ MetaCode span - Gen - [:] - SpanEditHandler;Accepts:Any - (3:0,3) - Symbols:1
+ HtmlSymbolType.Colon;[:];
+ Markup span - Gen - [ barLF] - SpanEditHandler;Accepts:None - (4:0,4) - Symbols:3
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[bar];
+ HtmlSymbolType.NewLine;[LF];
+ Code span - Gen - [] - SpanEditHandler;Accepts:Any - (10:1,0) - Symbols:1
+ CSharpSymbolType.Unknown;[];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (10:1,0) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineTemplate.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineTemplate.syntaxtree.txt
new file mode 100644
index 0000000000..8e7052e334
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesSingleLineTemplate.syntaxtree.txt
@@ -0,0 +1,26 @@
+Statement block - Gen - 23 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ var foo = ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:7
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 8 - (12:0,12)
+ Markup block - Gen - 8 - (12:0,12)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ MetaCode span - Gen - [:] - SpanEditHandler;Accepts:Any - (13:0,13) - Symbols:1
+ HtmlSymbolType.Colon;[:];
+ Markup span - Gen - [ barLF] - SpanEditHandler;Accepts:None - (14:0,14) - Symbols:3
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[bar];
+ HtmlSymbolType.NewLine;[LF];
+ Code span - Gen - [; ] - SpanEditHandler;Accepts:Any - (20:1,0) - Symbols:2
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (22:1,2) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInImplicitExpressionParens.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInImplicitExpressionParens.syntaxtree.txt
new file mode 100644
index 0000000000..8b631ecd1c
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInImplicitExpressionParens.syntaxtree.txt
@@ -0,0 +1,62 @@
+Expression block - Gen - 55 - (0:0,0)
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (16:0,16)
+ Markup block - Gen - 18 - (16:0,16)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (17:0,17)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (17:0,17) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (25:0,25)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (26:0,26) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (30:0,30)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (30:0,30) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (34:0,34) - Symbols:2
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (36:0,36)
+ Markup block - Gen - 18 - (36:0,36)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (36:0,36) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (37:0,37)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (37:0,37) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (40:0,40) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (45:0,45)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (46:0,46) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (50:0,50)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (50:0,50) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (54:0,54) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInStatementWithinCodeBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInStatementWithinCodeBlock.syntaxtree.txt
new file mode 100644
index 0000000000..2c6ca17e88
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlesTwoTemplatesInStatementWithinCodeBlock.syntaxtree.txt
@@ -0,0 +1,76 @@
+Statement block - Gen - 90 - (0:0,0)
+ Code span - Gen - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:18
+ CSharpSymbolType.Keyword;[foreach];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[in];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (48:0,48)
+ Markup block - Gen - 18 - (48:0,48)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (49:0,49)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (49:0,49) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (57:0,57)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (58:0,58) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (62:0,62)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (62:0,62) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [, ] - SpanEditHandler;Accepts:Any - (66:0,66) - Symbols:2
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (68:0,68)
+ Markup block - Gen - 18 - (68:0,68)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (68:0,68) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (69:0,69)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (69:0,69) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (72:0,72) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (77:0,77)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (77:0,77) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (78:0,78) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (82:0,82)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (82:0,82) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); }] - SpanEditHandler;Accepts:None - (86:0,86) - Symbols:4
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlessTwoTemplatesInStatementWithinStatementBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlessTwoTemplatesInStatementWithinStatementBlock.syntaxtree.txt
new file mode 100644
index 0000000000..ed2fc4fed0
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockHandlessTwoTemplatesInStatementWithinStatementBlock.syntaxtree.txt
@@ -0,0 +1,78 @@
+Statement block - Gen - 85 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:17
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (43:0,43)
+ Markup block - Gen - 18 - (43:0,43)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (44:0,44)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (44:0,44) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (52:0,52)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (53:0,53) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (57:0,57)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [, ] - SpanEditHandler;Accepts:Any - (61:0,61) - Symbols:2
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 18 - (63:0,63)
+ Markup block - Gen - 18 - (63:0,63)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (63:0,63) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (64:0,64)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (64:0,64) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (67:0,67) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (72:0,72)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (72:0,72) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (73:0,73) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (77:0,77)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (77:0,77) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); ] - SpanEditHandler;Accepts:Any - (81:0,81) - Symbols:3
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (84:0,84) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.diagnostics.txt
new file mode 100644
index 0000000000..1ff190fc33
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.diagnostics.txt
@@ -0,0 +1 @@
+(1,43): Error RZ2003: Inline markup blocks (@Content
) cannot be nested. Only one level of inline markup is allowed.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.syntaxtree.txt
new file mode 100644
index 0000000000..88077b3377
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInImplicitExpressionParens.syntaxtree.txt
@@ -0,0 +1,65 @@
+Expression block - Gen - 61 - (0:0,0)
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (0:0,0) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 44 - (16:0,16)
+ Markup block - Gen - 44 - (16:0,16)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (16:0,16) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (17:0,17)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (17:0,17) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (20:0,20) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 31 - (25:0,25)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (25:0,25) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (26:0,26) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 13 - (42:0,42)
+ Markup block - Gen - 13 - (42:0,42)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (42:0,42) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (43:0,43)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (43:0,43) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [] - SpanEditHandler;Accepts:Any - (46:0,46) - Symbols:1
+ HtmlSymbolType.Unknown;[];
+ Expression block - Gen - 5 - (46:0,46)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (46:0,46) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (47:0,47) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (51:0,51)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (51:0,51) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (55:0,55) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
+ Tag block - Gen - 4 - (56:0,56)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (56:0,56) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (60:0,60) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.diagnostics.txt
new file mode 100644
index 0000000000..0214cf52d5
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.diagnostics.txt
@@ -0,0 +1 @@
+(1,75): Error RZ2003: Inline markup blocks (@Content
) cannot be nested. Only one level of inline markup is allowed.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.syntaxtree.txt
new file mode 100644
index 0000000000..5780e24e73
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinCodeBlock.syntaxtree.txt
@@ -0,0 +1,79 @@
+Statement block - Gen - 96 - (0:0,0)
+ Code span - Gen - [foreach(foo in Bar) { Html.ExecuteTemplate(foo, ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:18
+ CSharpSymbolType.Keyword;[foreach];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[in];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 44 - (48:0,48)
+ Markup block - Gen - 44 - (48:0,48)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (48:0,48) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (49:0,49)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (49:0,49) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (52:0,52) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 31 - (57:0,57)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (58:0,58) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 13 - (74:0,74)
+ Markup block - Gen - 13 - (74:0,74)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (74:0,74) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (75:0,75)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (75:0,75) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [] - SpanEditHandler;Accepts:Any - (78:0,78) - Symbols:1
+ HtmlSymbolType.Unknown;[];
+ Expression block - Gen - 5 - (78:0,78)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (78:0,78) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (79:0,79) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (83:0,83)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (83:0,83) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (87:0,87) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
+ Tag block - Gen - 4 - (88:0,88)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (88:0,88) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); }] - SpanEditHandler;Accepts:None - (92:0,92) - Symbols:4
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.diagnostics.txt
new file mode 100644
index 0000000000..8d51764e61
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.diagnostics.txt
@@ -0,0 +1 @@
+(1,70): Error RZ2003: Inline markup blocks (@Content
) cannot be nested. Only one level of inline markup is allowed.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.syntaxtree.txt
new file mode 100644
index 0000000000..ef76ed0694
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlockProducesErrorButCorrectlyParsesNestedTemplateInStatementWithinStatementBlock.syntaxtree.txt
@@ -0,0 +1,81 @@
+Statement block - Gen - 91 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:17
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 44 - (43:0,43)
+ Markup block - Gen - 44 - (43:0,43)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (44:0,44)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (44:0,44) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (47:0,47) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 31 - (52:0,52)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [Html.Repeat(10, ] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (53:0,53) - Symbols:7
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Repeat];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 13 - (69:0,69)
+ Markup block - Gen - 13 - (69:0,69)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (69:0,69) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 3 - (70:0,70)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (70:0,70) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [] - SpanEditHandler;Accepts:Any - (73:0,73) - Symbols:1
+ HtmlSymbolType.Unknown;[];
+ Expression block - Gen - 5 - (73:0,73)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (73:0,73) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (74:0,74) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (78:0,78)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (78:0,78) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [)] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (82:0,82) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
+ Tag block - Gen - 4 - (83:0,83)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (83:0,83) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); ] - SpanEditHandler;Accepts:Any - (87:0,87) - Symbols:3
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (90:0,90) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlock_WithDoubleTransition_DoesNotThrow.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlock_WithDoubleTransition_DoesNotThrow.syntaxtree.txt
new file mode 100644
index 0000000000..b6df30dfa4
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpTemplateTest/ParseBlock_WithDoubleTransition_DoesNotThrow.syntaxtree.txt
@@ -0,0 +1,65 @@
+Statement block - Gen - 74 - (0:0,0)
+ MetaCode span - Gen - [{] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.LeftBrace;[{];
+ Code span - Gen - [ var foo = bar; Html.ExecuteTemplate(foo, ] - AutoCompleteEditHandler;Accepts:Any,AutoComplete:[];AtEOL - (1:0,1) - Symbols:17
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Html];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ExecuteTemplate];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Template block - Gen - 27 - (43:0,43)
+ Markup block - Gen - 27 - (43:0,43)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (43:0,43) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Tag block - Gen - 12 - (44:0,44)
+ Markup span - Gen - [ - 9 - (46:0,46)
+ Markup span - Gen - [ foo='] - SpanEditHandler;Accepts:Any - (46:0,46) - Symbols:4
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[foo];
+ HtmlSymbolType.Equals;[=];
+ HtmlSymbolType.SingleQuote;['];
+ Markup block - Gen - 2 - (52:0,52)
+ Markup span - Gen - [@] - SpanEditHandler;Accepts:None - (52:0,52) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Markup span - Gen - [@] - SpanEditHandler;Accepts:None - (53:0,53) - Symbols:1
+ HtmlSymbolType.Transition;[@];
+ Markup span - Gen - ['] - SpanEditHandler;Accepts:Any - (54:0,54) - Symbols:1
+ HtmlSymbolType.SingleQuote;['];
+ Markup span - Gen - [>] - SpanEditHandler;Accepts:None - (55:0,55) - Symbols:1
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo #] - SpanEditHandler;Accepts:Any - (56:0,56) - Symbols:3
+ HtmlSymbolType.Text;[Foo];
+ HtmlSymbolType.WhiteSpace;[ ];
+ HtmlSymbolType.Text;[#];
+ Expression block - Gen - 5 - (61:0,61)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (61:0,61) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [item] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (62:0,62) - Symbols:1
+ CSharpSymbolType.Identifier;[item];
+ Tag block - Gen - 4 - (66:0,66)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (66:0,66) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Code span - Gen - [); ] - SpanEditHandler;Accepts:Any - (70:0,70) - Symbols:3
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ MetaCode span - Gen - [}] - SpanEditHandler;Accepts:None - (73:0,73) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];