);");
}
[Fact]
@@ -411,158 +329,113 @@ while(true);", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedChara
return;
default:
return;
-}", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+}");
}
[Fact]
public void ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword()
{
SingleSpanBlockTest(
- "lock(foo) { Debug.WriteLine(@\"foo } bar\"); }",
- BlockKindInternal.Statement,
- SpanKindInternal.Code,
- acceptedCharacters: AcceptedCharactersInternal.None);
+ "lock(foo) { Debug.WriteLine(@\"foo } bar\"); }");
}
[Fact]
public void ParseBlockHasErrorsIfNamespaceImportMissingSemicolon()
{
- NamespaceImportTest(
- "using Foo.Bar.Baz",
- " Foo.Bar.Baz",
- acceptedCharacters: AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace,
- location: new SourceLocation(17, 0, 17));
+ ParseBlockTest(
+ "using Foo.Bar.Baz");
}
[Fact]
public void ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon()
{
- NamespaceImportTest(
- "using Foo.Bar.Baz = FooBarBaz",
- " Foo.Bar.Baz = FooBarBaz",
- acceptedCharacters: AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace,
- location: new SourceLocation(29, 0, 29));
+ ParseBlockTest(
+ "using Foo.Bar.Baz = FooBarBaz");
}
[Fact]
public void ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat()
{
- NamespaceImportTest(
- "using Foo.Bar.Baz;",
- " Foo.Bar.Baz",
- AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace);
+ ParseBlockTest(
+ "using Foo.Bar.Baz;");
}
[Fact]
public void ParseBlockDoesntCaptureWhitespaceAfterUsing()
{
- ParseBlockTest("using Foo ",
- new DirectiveBlock(
- Factory.Code("using Foo")
- .AsNamespaceImport(" Foo")
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace)));
+ ParseBlockTest("using Foo ");
}
[Fact]
public void ParseBlockCapturesNewlineAfterUsing()
{
- ParseBlockTest($"using Foo{Environment.NewLine}",
- new DirectiveBlock(
- Factory.Code($"using Foo{Environment.NewLine}")
- .AsNamespaceImport(" Foo")
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace)));
+ ParseBlockTest($"using Foo{Environment.NewLine}");
}
[Fact]
public void ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat()
{
- NamespaceImportTest(
- "using FooBarBaz = FooBarBaz;",
- " FooBarBaz = FooBarBaz",
- AcceptedCharactersInternal.NonWhiteSpace | AcceptedCharactersInternal.WhiteSpace);
+ ParseBlockTest(
+ "using FooBarBaz = FooBarBaz;");
}
[Fact]
public void ParseBlockTerminatesUsingKeywordAtEOFAndOutputsFileCodeBlock()
{
- SingleSpanBlockTest("using ", BlockKindInternal.Statement, SpanKindInternal.Code);
+ SingleSpanBlockTest("using ");
}
[Fact]
public void ParseBlockTerminatesSingleLineCommentAtEndOfFile()
{
const string document = "foreach(var f in Foo) { // foo bar baz";
- SingleSpanBlockTest(
- document,
- document,
- BlockKindInternal.Statement,
- SpanKindInternal.Code,
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(SourceLocation.Zero, contentLength: 1), "foreach", "}", "{"));
+ SingleSpanBlockTest(document);
}
[Fact]
public void ParseBlockTerminatesBlockCommentAtEndOfFile()
{
const string document = "foreach(var f in Foo) { /* foo bar baz";
- SingleSpanBlockTest(
- document,
- document,
- BlockKindInternal.Statement,
- SpanKindInternal.Code,
- RazorDiagnosticFactory.CreateParsing_BlockCommentNotTerminated(
- new SourceSpan(new SourceLocation(24, 0, 24), contentLength: 1)),
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(SourceLocation.Zero, contentLength: 1), "foreach", "}", "{"));
+ SingleSpanBlockTest(document);
}
[Fact]
public void ParseBlockTerminatesSingleSlashAtEndOfFile()
{
const string document = "foreach(var f in Foo) { / foo bar baz";
- SingleSpanBlockTest(
- document,
- document,
- BlockKindInternal.Statement,
- SpanKindInternal.Code,
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(SourceLocation.Zero, contentLength: 1), "foreach", "}", "{"));
+ SingleSpanBlockTest(document);
}
[Fact]
public void ParseBlockSupportsBlockCommentBetweenTryAndFinallyClause()
{
- SingleSpanBlockTest("try { bar(); } /* Foo */ /* Bar */ finally { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+ SingleSpanBlockTest("try { bar(); } /* Foo */ /* Bar */ finally { baz(); }");
}
[Fact]
public void ParseBlockSupportsRazorCommentBetweenTryAndFinallyClause()
{
- RunRazorCommentBetweenClausesTest("try { bar(); } ", " finally { biz(); }", acceptedCharacters: AcceptedCharactersInternal.None);
+ RunRazorCommentBetweenClausesTest("try { bar(); } ", " finally { biz(); }");
}
[Fact]
public void ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause()
{
SingleSpanBlockTest(
- "try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }",
- BlockKindInternal.Statement,
- SpanKindInternal.Code,
- acceptedCharacters: AcceptedCharactersInternal.None);
+ "try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }");
}
[Fact]
public void ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause()
{
RunRazorCommentBetweenClausesTest(
- "try { bar(); } catch(bar) { baz(); } ", " finally { biz(); }",
- acceptedCharacters: AcceptedCharactersInternal.None);
+ "try { bar(); } catch(bar) { baz(); } ", " finally { biz(); }");
}
[Fact]
public void ParseBlockSupportsBlockCommentBetweenTryAndCatchClause()
{
- SingleSpanBlockTest("try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
+ SingleSpanBlockTest("try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }");
}
[Fact]
@@ -577,7 +450,7 @@ while(true);", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedChara
SingleSpanBlockTest(@"try { bar(); }
// Foo
// Bar
-finally { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+finally { baz(); }");
}
[Fact]
@@ -586,7 +459,7 @@ finally { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code, accepte
SingleSpanBlockTest(@"try { bar(); } catch(bar) { baz(); }
// Foo
// Bar
-finally { biz(); }", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+finally { biz(); }");
}
[Fact]
@@ -595,13 +468,13 @@ finally { biz(); }", BlockKindInternal.Statement, SpanKindInternal.Code, accepte
SingleSpanBlockTest(@"try { bar(); }
// Foo
// Bar
-catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
+catch(bar) { baz(); }");
}
[Fact]
public void ParseBlockSupportsTryStatementWithNoAdditionalClauses()
{
- SingleSpanBlockTest("try { var foo = new { } }", BlockKindInternal.Statement, SpanKindInternal.Code);
+ SingleSpanBlockTest("try { var foo = new { } }");
}
[Fact]
@@ -610,20 +483,13 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
RunSimpleWrappedMarkupTest(
prefix: "try {",
markup: " Foo
",
- suffix: "}",
- expectedStart: new SourceLocation(5, 0, 5),
- expectedMarkup: new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- Factory.Markup("Foo"),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)));
+ suffix: "}");
}
[Fact]
public void ParseBlockSupportsTryStatementWithOneCatchClause()
{
- SingleSpanBlockTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }", BlockKindInternal.Statement, SpanKindInternal.Code);
+ SingleSpanBlockTest("try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }");
}
[Fact]
@@ -632,14 +498,7 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } catch(Foo Bar Baz) {",
markup: " Foo
",
- suffix: "}",
- expectedStart: new SourceLocation(46, 0, 46),
- expectedMarkup: new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- Factory.Markup("Foo"),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)));
+ suffix: "}");
}
[Fact]
@@ -647,15 +506,13 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
{
SingleSpanBlockTest(
"try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) " +
- "{ var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }",
- BlockKindInternal.Statement,
- SpanKindInternal.Code);
+ "{ var foo = new { } } catch(Foo Bar Baz) { var foo = new { } }");
}
[Fact]
public void ParseBlockSupportsExceptionLessCatchClauses()
{
- SingleSpanBlockTest("try { var foo = new { } } catch { var foo = new { } }", BlockKindInternal.Statement, SpanKindInternal.Code);
+ SingleSpanBlockTest("try { var foo = new { } } catch { var foo = new { } }");
}
[Fact]
@@ -665,20 +522,13 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
prefix: "try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) " +
"{ var foo = new { } } catch(Foo Bar Baz) {",
markup: " Foo
",
- suffix: "}",
- expectedStart: new SourceLocation(128, 0, 128),
- expectedMarkup: new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- Factory.Markup("Foo"),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)));
+ suffix: "}");
}
[Fact]
public void ParseBlockSupportsTryStatementWithFinallyClause()
{
- SingleSpanBlockTest("try { var foo = new { } } finally { var foo = new { } }", BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+ SingleSpanBlockTest("try { var foo = new { } } finally { var foo = new { } }");
}
[Fact]
@@ -687,113 +537,63 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
RunSimpleWrappedMarkupTest(
prefix: "try { var foo = new { } } finally {",
markup: " Foo
",
- suffix: "}",
- expectedStart: new SourceLocation(35, 0, 35),
- expectedMarkup: new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- Factory.Markup("Foo"),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(" ").Accepts(AcceptedCharactersInternal.None)),
- acceptedCharacters: AcceptedCharactersInternal.None);
+ suffix: "}");
}
[Fact]
public void ParseBlockStopsParsingCatchClausesAfterFinallyBlock()
{
- var expectedContent = "try { var foo = new { } } finally { var foo = new { } }";
- SingleSpanBlockTest(expectedContent + " catch(Foo Bar Baz) { }", expectedContent, BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+ var content = "try { var foo = new { } } finally { var foo = new { } }";
+ SingleSpanBlockTest(content + " catch(Foo Bar Baz) { }");
}
[Fact]
public void ParseBlockDoesNotAllowMultipleFinallyBlocks()
{
- var expectedContent = "try { var foo = new { } } finally { var foo = new { } }";
- SingleSpanBlockTest(expectedContent + " finally { }", expectedContent, BlockKindInternal.Statement, SpanKindInternal.Code, acceptedCharacters: AcceptedCharactersInternal.None);
+ var content = "try { var foo = new { } } finally { var foo = new { } }";
+ SingleSpanBlockTest(content + " finally { }");
}
[Fact]
public void ParseBlockAcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode()
{
// Arrange
- ParseBlockTest(@"if(foo) { @foo. }",
- new StatementBlock(
- Factory.Code("if(foo) { ").AsStatement(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("foo.")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- Factory.Code(" }").AsStatement()
- ));
+ ParseBlockTest(@"if(foo) { @foo. }");
}
[Fact]
public void ParseBlockParsesExpressionOnSwitchCharacterFollowedByOpenParen()
{
// Arrange
- ParseBlockTest(@"if(foo) { @(foo + bar) }",
- new StatementBlock(
- Factory.Code("if(foo) { ").AsStatement(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.MetaCode("(").Accepts(AcceptedCharactersInternal.None),
- Factory.Code("foo + bar").AsExpression(),
- Factory.MetaCode(")").Accepts(AcceptedCharactersInternal.None)
- ),
- Factory.Code(" }").AsStatement()
- ));
+ ParseBlockTest(@"if(foo) { @(foo + bar) }");
}
[Fact]
public void ParseBlockParsesExpressionOnSwitchCharacterFollowedByIdentifierStart()
{
// Arrange
- ParseBlockTest(@"if(foo) { @foo[4].bar() }",
- new StatementBlock(
- Factory.Code("if(foo) { ").AsStatement(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("foo[4].bar()")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ),
- Factory.Code(" }").AsStatement()
- ));
+ ParseBlockTest(@"if(foo) { @foo[4].bar() }");
}
[Fact]
public void ParseBlockTreatsDoubleAtSignAsEscapeSequenceIfAtStatementStart()
{
// Arrange
- ParseBlockTest(@"if(foo) { @@class.Foo() }",
- new StatementBlock(
- Factory.Code("if(foo) { ").AsStatement(),
- Factory.Code("@").Hidden(),
- Factory.Code("@class.Foo() }").AsStatement()
- ));
+ ParseBlockTest(@"if(foo) { @@class.Foo() }");
}
[Fact]
public void ParseBlockTreatsAtSignsAfterFirstPairAsPartOfCSharpStatement()
{
// Arrange
- ParseBlockTest(@"if(foo) { @@@@class.Foo() }",
- new StatementBlock(
- Factory.Code("if(foo) { ").AsStatement(),
- Factory.Code("@").Hidden(),
- Factory.Code("@@@class.Foo() }").AsStatement()
- ));
+ ParseBlockTest(@"if(foo) { @@@@class.Foo() }");
}
[Fact]
public void ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon()
{
// Arrange
- ParseBlockTest("if(foo) { @\"Foo\".ToString(); }",
- new StatementBlock(
- Factory.Code("if(foo) { @\"Foo\".ToString(); }").AsStatement()));
+ ParseBlockTest("if(foo) { @\"Foo\".ToString(); }");
}
[Fact]
@@ -809,448 +609,78 @@ catch(bar) { baz(); }", BlockKindInternal.Statement, SpanKindInternal.Code);
+ " }" + Environment.NewLine
+ " " + Environment.NewLine
+ " " + Environment.NewLine
- + " }",
- new StatementBlock(
- Factory.Code("foreach(var c in db.Categories) {" + Environment.NewLine).AsStatement(),
- new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine + " "),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.EmptyHtml(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("c.Name")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine + " "),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine),
- new StatementBlock(
- Factory.Code(@" ").AsStatement(),
- Factory.CodeTransition(),
- Factory.Code("foreach(var p in c.Products) {" + Environment.NewLine).AsStatement(),
- new MarkupBlock(
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("- ", AcceptedCharactersInternal.None),
- new MarkupTagBlock(
- Factory.Markup("(" href=\"", 183 + Environment.NewLine.Length * 5, 5, 30),
- new LocationTagged("\"", 246 + Environment.NewLine.Length * 5, 5, 93)),
- Factory.Markup(" href=\"").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(
- new LocationTagged(string.Empty, 190 + Environment.NewLine.Length * 5, 5, 37), 190 + Environment.NewLine.Length * 5, 5, 37),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("Html.ActionUrl(\"Products\", \"Detail\", new { id = p.Id })")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace))),
- Factory.Markup("\"").With(SpanChunkGenerator.Null)),
- Factory.Markup(">").Accepts(AcceptedCharactersInternal.None)),
- Factory.EmptyHtml(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("p.Name")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
- BlockFactory.MarkupTagBlock("", AcceptedCharactersInternal.None),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine).Accepts(AcceptedCharactersInternal.None)),
- Factory.Code(" }" + Environment.NewLine).AsStatement().Accepts(AcceptedCharactersInternal.None)),
- Factory.Markup(" "),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine + " "),
- BlockFactory.MarkupTagBlock("
", AcceptedCharactersInternal.None),
- Factory.Markup(Environment.NewLine).Accepts(AcceptedCharactersInternal.None)),
- Factory.Code(" }").AsStatement().Accepts(AcceptedCharactersInternal.None)));
+ + " }");
}
- public static TheoryData BlockWithEscapedTransitionData
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionInAttributeValue_DoesNotThrow()
{
- get
- {
- var factory = new SpanFactory();
- var datetimeBlock = new ExpressionBlock(
- factory.CodeTransition(),
- factory.Code("DateTime.Now")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace));
-
- return new TheoryData
- {
- {
- // Double transition in attribute value
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 14, 0, 14)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("@", 12, 0, 12))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition at the end of attribute value
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 17, 0, 17)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- factory.Markup("abc").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("abc", 12, 0, 12))),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 15, 0, 15), new LocationTagged("@", 15, 0, 15))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition at the beginning attribute value
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 17, 0, 17)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("@", 12, 0, 12))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("def").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 14, 0, 14), new LocationTagged("def", 14, 0, 14))),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition in between attribute value
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 22, 0, 22)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- factory.Markup("abc").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("abc", 12, 0, 12))),
- new MarkupBlock(
- factory.Markup(" @").With(new LiteralAttributeChunkGenerator(new LocationTagged(" ", 15, 0, 15), new LocationTagged("@", 16, 0, 16))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup(" def").With(new LiteralAttributeChunkGenerator(new LocationTagged(" ", 18, 0, 18), new LocationTagged("def", 19, 0, 19))),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition with expression block
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 27, 0, 27)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("@", 12, 0, 12))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 14, 0, 14), 14, 0, 14),
- factory.EmptyHtml().With(SpanChunkGenerator.Null),
- datetimeBlock),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 28, 0, 28)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), 12, 0, 12),
- datetimeBlock),
- new MarkupBlock(
- factory.Markup(" @").With(new LiteralAttributeChunkGenerator(new LocationTagged(" ", 25, 0, 25), new LocationTagged("@", 26, 0, 26))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 27, 0, 27)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), 12, 0, 12),
- datetimeBlock),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 25, 0, 25), new LocationTagged("@", 25, 0, 25))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 33, 0, 33)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), 12, 0, 12),
- new ExpressionBlock(
- factory.CodeTransition(),
- factory.MetaCode("(").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None),
- factory.Code("2+3").AsExpression(),
- factory.MetaCode(")").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None))),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 18, 0, 18), new LocationTagged("@", 18, 0, 18))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 20, 0, 20), 20, 0, 20),
- factory.EmptyHtml().With(SpanChunkGenerator.Null),
- datetimeBlock),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 20, 0, 20)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("@", 12, 0, 12))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 14, 0, 14), 14, 0, 14),
- factory.EmptyHtml().With(SpanChunkGenerator.Null),
- new ExpressionBlock(
- factory.CodeTransition(),
- factory.MetaCode("(").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None),
- factory.Code("2+3").AsExpression(),
- factory.MetaCode(")").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None))),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition with email in attribute value
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 26, 0, 26)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- factory.Markup("abc@def.com").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("abc@def.com", 12, 0, 12))),
- new MarkupBlock(
- factory.Markup(" @").With(new LiteralAttributeChunkGenerator(new LocationTagged(" ", 23, 0, 23), new LocationTagged("@", 24, 0, 24))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- "{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo='", 6, 0, 6), new LocationTagged("'", 27, 0, 27)),
- factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- factory.Markup("abc").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("abc", 12, 0, 12))),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 15, 0, 15), new LocationTagged("@", 15, 0, 15))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("def.com").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 17, 0, 17), new LocationTagged("def.com", 17, 0, 17))),
- new MarkupBlock(
- factory.Markup(" @").With(new LiteralAttributeChunkGenerator(new LocationTagged(" ", 24, 0, 24), new LocationTagged("@", 25, 0, 25))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup("'").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- {
- // Double transition in complex regex in attribute value
- @"{}",
- CreateStatementBlock(
- new MarkupBlock(
- new MarkupTagBlock(
- factory.Markup("(" foo=\"", 6, 0, 6), new LocationTagged("\"", 112, 0, 112)),
- factory.Markup(" foo=\"").With(SpanChunkGenerator.Null),
- factory.Markup(@"/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged(@"/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+", 12, 0, 12))),
- new MarkupBlock(
- factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 44, 0, 44), new LocationTagged("@", 44, 0, 44))).Accepts(AcceptedCharactersInternal.None),
- factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)),
- factory.Markup(@"[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 46, 0, 46), new LocationTagged(@"[a-z0-9]([a-z0-9-]*[a-z0-9])?\.([a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i", 46, 0, 46))),
- factory.Markup("\"").With(SpanChunkGenerator.Null)),
- factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))))
- },
- };
- }
+ var input = "{}";
+ ParseBlockTest(input);
}
- [Theory]
- [MemberData(nameof(BlockWithEscapedTransitionData))]
- public void ParseBlock_WithDoubleTransition_DoesNotThrow(string input, object expected)
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionAtEndOfAttributeValue_DoesNotThrow()
{
- FixupSpans = true;
+ var input = "{}";
+ ParseBlockTest(input);
+ }
- // Act & Assert
- ParseBlockTest(input, (Block)expected);
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionAtBeginningOfAttributeValue_DoesNotThrow()
+ {
+ var input = "{}";
+ ParseBlockTest(input);
+ }
+
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionBetweenAttributeValue_DoesNotThrow()
+ {
+ var input = "{}";
+ ParseBlockTest(input);
+ }
+
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionWithExpressionBlock_DoesNotThrow()
+ {
+ var input = "{}";
+ ParseBlockTest(input);
+ }
+
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionInEmail_DoesNotThrow()
+ {
+ var input = "{}";
+ ParseBlockTest(input);
+ }
+
+ [Fact]
+ public void ParseBlock_WithDoubleTransitionInRegex_DoesNotThrow()
+ {
+ var input = @"{}";
+ ParseBlockTest(input);
}
[Fact]
public void ParseBlock_WithDoubleTransition_EndOfFile_Throws()
{
- // Arrange
- var expected = new StatementBlock(
- Factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- new MarkupBlock(
- new MarkupTagBlock(
- Factory.Markup("(" foo='", 6, 0, 6), new LocationTagged(string.Empty, 14, 0, 14)),
- Factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- Factory.Markup("@").With(new LiteralAttributeChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), new LocationTagged("@", 12, 0, 12))).Accepts(AcceptedCharactersInternal.None),
- Factory.Markup("@").With(SpanChunkGenerator.Null).Accepts(AcceptedCharactersInternal.None)))),
- Factory.EmptyHtml()));
- var expectedErrors = new RazorDiagnostic[]
- {
- RazorDiagnosticFactory.CreateParsing_UnfinishedTag(
- new SourceSpan(new SourceLocation(2, 0, 2), contentLength: 4), "span"),
- RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF(
- new SourceSpan(SourceLocation.Zero, contentLength: 1), Resources.BlockName_Code, "}", "{"),
- };
-
- // Act & Assert
- ParseBlockTest("{(" foo='", 6, 0, 6), new LocationTagged("'", 15, 0, 15)),
- Factory.Markup(" foo='").With(SpanChunkGenerator.Null),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(string.Empty, 12, 0, 12), 12, 0, 12),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.EmptyCSharp().AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhiteSpace))),
- new MarkupBlock(
- new DynamicAttributeBlockChunkGenerator(new LocationTagged(" ", 13, 0, 13), 13, 0, 13),
- Factory.Markup(" ").With(SpanChunkGenerator.Null),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.EmptyCSharp().AsImplicitExpression(CSharpCodeParser.DefaultKeywords).Accepts(AcceptedCharactersInternal.NonWhiteSpace))),
- Factory.Markup("'").With(SpanChunkGenerator.Null)),
- Factory.Markup(" />").Accepts(AcceptedCharactersInternal.None))),
- Factory.EmptyCSharp().AsStatement(),
- Factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None));
- var expectedErrors = new RazorDiagnostic[]
- {
- RazorDiagnosticFactory.CreateParsing_UnexpectedWhiteSpaceAtStartOfCodeBlock(
- new SourceSpan(new SourceLocation(13, 0, 13), contentLength: 1)),
- RazorDiagnosticFactory.CreateParsing_UnexpectedCharacterAtStartOfCodeBlock(
- new SourceSpan(new SourceLocation(15, 0, 15), contentLength: 5),
- "' />}"),
- };
-
- // Act & Assert
- ParseBlockTest("{}", expected, expectedErrors);
+ ParseBlockTest("{}");
}
private void RunRazorCommentBetweenClausesTest(string preComment, string postComment, AcceptedCharactersInternal acceptedCharacters = AcceptedCharactersInternal.Any)
{
- ParseBlockTest(preComment + "@* Foo *@ @* Bar *@" + postComment,
- new StatementBlock(
- Factory.Code(preComment).AsStatement(),
- new CommentBlock(
- Factory.CodeTransition(CSharpSymbolType.RazorCommentTransition),
- Factory.MetaCode("*", CSharpSymbolType.RazorCommentStar).Accepts(AcceptedCharactersInternal.None),
- Factory.Comment(" Foo ", CSharpSymbolType.RazorComment),
- Factory.MetaCode("*", CSharpSymbolType.RazorCommentStar).Accepts(AcceptedCharactersInternal.None),
- Factory.CodeTransition(CSharpSymbolType.RazorCommentTransition)
- ),
- Factory.Code(" ").AsStatement(),
- new CommentBlock(
- Factory.CodeTransition(CSharpSymbolType.RazorCommentTransition),
- Factory.MetaCode("*", CSharpSymbolType.RazorCommentStar).Accepts(AcceptedCharactersInternal.None),
- Factory.Comment(" Bar ", CSharpSymbolType.RazorComment),
- Factory.MetaCode("*", CSharpSymbolType.RazorCommentStar).Accepts(AcceptedCharactersInternal.None),
- Factory.CodeTransition(CSharpSymbolType.RazorCommentTransition)
- ),
- Factory.Code(postComment).AsStatement().Accepts(acceptedCharacters)));
+ ParseBlockTest(preComment + "@* Foo *@ @* Bar *@" + postComment);
}
- private void RunSimpleWrappedMarkupTest(string prefix, string markup, string suffix, MarkupBlock expectedMarkup, SourceLocation expectedStart, AcceptedCharactersInternal acceptedCharacters = AcceptedCharactersInternal.Any)
+ private void RunSimpleWrappedMarkupTest(string prefix, string markup, string suffix)
{
- var expected = new StatementBlock(
- Factory.Code(prefix).AsStatement(),
- expectedMarkup,
- Factory.Code(suffix).AsStatement().Accepts(acceptedCharacters));
-
- // Since we're building the 'expected' input out of order we need to do some trickery
- // to get the locations right.
- SpancestryCorrector.Correct(expected);
- expected.FindFirstDescendentSpan().ChangeStart(SourceLocation.Zero);
-
- // We make the caller pass a start location so we can verify that nothing has gone awry.
- Assert.Equal(expectedStart, expectedMarkup.Start);
-
- ParseBlockTest(prefix + markup + suffix, expected);
- }
-
- private void NamespaceImportTest(string content, string expectedNS, AcceptedCharactersInternal acceptedCharacters = AcceptedCharactersInternal.None, SourceLocation? location = null)
- {
- ParseBlockTest(content,
- new DirectiveBlock(
- Factory.Code(content)
- .AsNamespaceImport(expectedNS)
- .Accepts(acceptedCharacters)));
- }
-
- private static StatementBlock CreateStatementBlock(MarkupBlock block)
- {
- var factory = new SpanFactory();
- return new StatementBlock(
- factory.MetaCode("{").Accepts(AcceptedCharactersInternal.None),
- block,
- factory.EmptyCSharp().AsStatement(),
- factory.MetaCode("}").Accepts(AcceptedCharactersInternal.None));
+ ParseBlockTest(prefix + markup + suffix);
}
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.syntaxtree.txt
new file mode 100644
index 0000000000..492147e886
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideBlockComments.syntaxtree.txt
@@ -0,0 +1,21 @@
+Statement block - Gen - 54 - (0:0,0)
+ Code span - Gen - [if(foo) {LF /* bar } " */ ' baz } 'LF zoop();LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:19
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* bar } " */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.CharacterLiteral;[' baz } '];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[zoop];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideSingleLineComments.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideSingleLineComments.syntaxtree.txt
new file mode 100644
index 0000000000..6092ec784e
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/BalancingBracketsIgnoresStringLiteralCharactersAndBracketsInsideSingleLineComments.syntaxtree.txt
@@ -0,0 +1,19 @@
+Statement block - Gen - 47 - (0:0,0)
+ Code span - Gen - [if(foo) {LF // bar } " baz 'LF zoop();LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:17
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[// bar } " baz '];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[zoop];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.syntaxtree.txt
new file mode 100644
index 0000000000..7515b640d9
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/NestedCodeBlockWithAtDoesntCauseError.syntaxtree.txt
@@ -0,0 +1,25 @@
+Statement block - Gen - 28 - (0:0,0)
+ Code span - Gen - [if (true) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:8
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[true];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Statement block - Gen - 14 - (12:0,12)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [if(false) { }] - SpanEditHandler;Accepts:Any - (13:0,13) - Symbols:8
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[false];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ Code span - Gen - [ }] - SpanEditHandler;Accepts:Any - (26:0,26) - Symbols:2
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsElseIfWithNoCondition.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsElseIfWithNoCondition.syntaxtree.txt
new file mode 100644
index 0000000000..c52b4341ce
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsElseIfWithNoCondition.syntaxtree.txt
@@ -0,0 +1,60 @@
+Statement block - Gen - 106 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if { foo(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:58
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.syntaxtree.txt
new file mode 100644
index 0000000000..5ba3927092
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAcceptsTrailingDotIntoImplicitExpressionWhenEmbeddedInCode.syntaxtree.txt
@@ -0,0 +1,18 @@
+Statement block - Gen - 17 - (0:0,0)
+ Code span - Gen - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:7
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Expression block - Gen - 5 - (10:0,10)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (11:0,11) - Symbols:2
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ Code span - Gen - [ }] - SpanEditHandler;Accepts:Any - (15:0,15) - Symbols:2
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAllowsEmptyBlockStatement.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAllowsEmptyBlockStatement.syntaxtree.txt
new file mode 100644
index 0000000000..df639fbb77
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockAllowsEmptyBlockStatement.syntaxtree.txt
@@ -0,0 +1,10 @@
+Statement block - Gen - 13 - (0:0,0)
+ Code span - Gen - [if(false) { }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:8
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[false];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCapturesNewlineAfterUsing.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCapturesNewlineAfterUsing.syntaxtree.txt
new file mode 100644
index 0000000000..b766d9e667
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCapturesNewlineAfterUsing.syntaxtree.txt
@@ -0,0 +1,6 @@
+Directive block - Gen - 11 - (0:0,0)
+ Code span - Gen - [using FooLF] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:4
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.NewLine;[LF];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlock.syntaxtree.txt
new file mode 100644
index 0000000000..08f5c5b2d9
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlock.syntaxtree.txt
@@ -0,0 +1,26 @@
+Statement block - Gen - 40 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; } while(foo != bar);] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:24
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.NotEqual;[!=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingSemicolon.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingSemicolon.syntaxtree.txt
new file mode 100644
index 0000000000..2d72a88d86
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingSemicolon.syntaxtree.txt
@@ -0,0 +1,25 @@
+Statement block - Gen - 39 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; } while(foo != bar)] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:23
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.NotEqual;[!=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.syntaxtree.txt
new file mode 100644
index 0000000000..6f8df081d8
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileClauseEntirely.syntaxtree.txt
@@ -0,0 +1,16 @@
+Statement block - Gen - 21 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:14
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileCondition.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileCondition.syntaxtree.txt
new file mode 100644
index 0000000000..8c0d027674
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileCondition.syntaxtree.txt
@@ -0,0 +1,18 @@
+Statement block - Gen - 27 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; } while] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:16
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.syntaxtree.txt
new file mode 100644
index 0000000000..a91ee07a03
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesDoWhileBlockMissingWhileConditionWithSemicolon.syntaxtree.txt
@@ -0,0 +1,19 @@
+Statement block - Gen - 28 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; } while;] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:17
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesMarkupInDoWhileBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesMarkupInDoWhileBlock.syntaxtree.txt
new file mode 100644
index 0000000000..4f4319d5cb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockCorrectlyParsesMarkupInDoWhileBlock.syntaxtree.txt
@@ -0,0 +1,50 @@
+Statement block - Gen - 58 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [do { var foo = bar;] - SpanEditHandler;Accepts:Any - (1:0,1) - Symbols:12
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ Markup block - Gen - 12 - (20:0,20)
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:Any - (20:0,20) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Tag block - Gen - 3 - (21:0,21)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (21:0,21) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (24:0,24) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (27:0,27)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (27:0,27) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:None - (31:0,31) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [foo++; } while (foo);] - SpanEditHandler;Accepts:None - (32:0,32) - Symbols:15
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Increment;[++];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.GreaterThan;[>];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotAllowMultipleFinallyBlocks.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotAllowMultipleFinallyBlocks.syntaxtree.txt
new file mode 100644
index 0000000000..493313d0b3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotAllowMultipleFinallyBlocks.syntaxtree.txt
@@ -0,0 +1,37 @@
+Statement block - Gen - 55 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } finally { var foo = new { } }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:35
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon.syntaxtree.txt
new file mode 100644
index 0000000000..194df0b599
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesNotParseMarkupStatementOrExpressionOnSwitchCharacterNotFollowedByOpenAngleOrColon.syntaxtree.txt
@@ -0,0 +1,17 @@
+Statement block - Gen - 30 - (0:0,0)
+ Code span - Gen - [if(foo) { @"Foo".ToString(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:15
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;[@"Foo"];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[ToString];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesntCaptureWhitespaceAfterUsing.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesntCaptureWhitespaceAfterUsing.syntaxtree.txt
new file mode 100644
index 0000000000..85b88e63eb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockDoesntCaptureWhitespaceAfterUsing.syntaxtree.txt
@@ -0,0 +1,5 @@
+Directive block - Gen - 9 - (0:0,0)
+ Code span - Gen - [using Foo] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:3
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon.syntaxtree.txt
new file mode 100644
index 0000000000..5b1371ae8d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceAliasMissingSemicolon.syntaxtree.txt
@@ -0,0 +1,13 @@
+Directive block - Gen - 29 - (0:0,0)
+ Code span - Gen - [using Foo.Bar.Baz = FooBarBaz] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:11
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[FooBarBaz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceImportMissingSemicolon.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceImportMissingSemicolon.syntaxtree.txt
new file mode 100644
index 0000000000..a7bb8199b2
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockHasErrorsIfNamespaceImportMissingSemicolon.syntaxtree.txt
@@ -0,0 +1,9 @@
+Directive block - Gen - 17 - (0:0,0)
+ Code span - Gen - [using Foo.Bar.Baz] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:7
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesElseIfBranchesOfIfStatement.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesElseIfBranchesOfIfStatement.syntaxtree.txt
new file mode 100644
index 0000000000..8d7dc26146
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesElseIfBranchesOfIfStatement.syntaxtree.txt
@@ -0,0 +1,95 @@
+Statement block - Gen - 180 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:93
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.syntaxtree.txt
new file mode 100644
index 0000000000..2e3daab58a
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByIdentifierStart.syntaxtree.txt
@@ -0,0 +1,24 @@
+Statement block - Gen - 25 - (0:0,0)
+ Code span - Gen - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:7
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Expression block - Gen - 13 - (10:0,10)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo[4].bar()] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (11:0,11) - Symbols:8
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ Code span - Gen - [ }] - SpanEditHandler;Accepts:Any - (23:0,23) - Symbols:2
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByOpenParen.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByOpenParen.syntaxtree.txt
new file mode 100644
index 0000000000..333a092687
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesExpressionOnSwitchCharacterFollowedByOpenParen.syntaxtree.txt
@@ -0,0 +1,25 @@
+Statement block - Gen - 24 - (0:0,0)
+ Code span - Gen - [if(foo) { ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:7
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Expression block - Gen - 12 - (10:0,10)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (10:0,10) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ MetaCode span - Gen - [(] - SpanEditHandler;Accepts:None - (11:0,11) - Symbols:1
+ CSharpSymbolType.LeftParenthesis;[(];
+ Code span - Gen - [foo + bar] - SpanEditHandler;Accepts:Any - (12:0,12) - Symbols:5
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Plus;[+];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ MetaCode span - Gen - [)] - SpanEditHandler;Accepts:None - (21:0,21) - Symbols:1
+ CSharpSymbolType.RightParenthesis;[)];
+ Code span - Gen - [ }] - SpanEditHandler;Accepts:Any - (22:0,22) - Symbols:2
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatement.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatement.syntaxtree.txt
new file mode 100644
index 0000000000..ab769c186e
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatement.syntaxtree.txt
@@ -0,0 +1,239 @@
+Statement block - Gen - 459 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:237
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.syntaxtree.txt
new file mode 100644
index 0000000000..817f2e20cc
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesMultipleElseIfBranchesOfIfStatementFollowedByOneElseBranch.syntaxtree.txt
@@ -0,0 +1,157 @@
+Statement block - Gen - 313 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:155
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt
new file mode 100644
index 0000000000..775666b7e4
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceAliasWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt
@@ -0,0 +1,10 @@
+Directive block - Gen - 28 - (0:0,0)
+ Code span - Gen - [using FooBarBaz = FooBarBaz;] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:8
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[FooBarBaz];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[FooBarBaz];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt
new file mode 100644
index 0000000000..80e34b4242
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockParsesNamespaceImportWithSemicolonForUsingKeywordIfIsInValidFormat.syntaxtree.txt
@@ -0,0 +1,10 @@
+Directive block - Gen - 18 - (0:0,0)
+ Code span - Gen - [using Foo.Bar.Baz;] - SpanEditHandler;Accepts:AnyExceptNewline - (0:0,0) - Symbols:8
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForKeyword.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForKeyword.syntaxtree.txt
new file mode 100644
index 0000000000..91928ed5f2
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForKeyword.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 82 - (0:0,0)
+ Code span - Gen - [for(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[for];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForeachKeyword.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForeachKeyword.syntaxtree.txt
new file mode 100644
index 0000000000..6ded04854f
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsForeachKeyword.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 86 - (0:0,0)
+ Code span - Gen - [foreach(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[foreach];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.syntaxtree.txt
new file mode 100644
index 0000000000..c3cd91c222
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsIfKeywordWithNoElseBranches.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 81 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword.syntaxtree.txt
new file mode 100644
index 0000000000..72b6a2a065
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsLockKeyword.syntaxtree.txt
@@ -0,0 +1,18 @@
+Statement block - Gen - 44 - (0:0,0)
+ Code span - Gen - [lock(foo) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:16
+ CSharpSymbolType.Keyword;[lock];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.syntaxtree.txt
new file mode 100644
index 0000000000..45e7542193
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsSwitchKeyword.syntaxtree.txt
@@ -0,0 +1,54 @@
+Statement block - Gen - 161 - (0:0,0)
+ Code span - Gen - [switch(foo) {LF case 0:LF break;LF case 1:LF {LF break;LF }LF case 2:LF return;LF default:LF return;LF}] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:52
+ CSharpSymbolType.Keyword;[switch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[case];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Colon;[:];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[break];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[case];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[1];
+ CSharpSymbolType.Colon;[:];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[break];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[case];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[2];
+ CSharpSymbolType.Colon;[:];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[return];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[default];
+ CSharpSymbolType.Colon;[:];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[return];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsUsingKeywordFollowedByParen.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsUsingKeywordFollowedByParen.syntaxtree.txt
new file mode 100644
index 0000000000..d96f852117
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsUsingKeywordFollowedByParen.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 84 - (0:0,0)
+ Code span - Gen - [using(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[using];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsWhileKeyword.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsWhileKeyword.syntaxtree.txt
new file mode 100644
index 0000000000..40767f609b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSkipsParenthesisedExpressionAndThenBalancesBracesIfFirstIdentifierIsWhileKeyword.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 84 - (0:0,0)
+ Code span - Gen - [while(int i = 0; i < 10; new Foo { Bar = "baz" }) { Debug.WriteLine(@"foo } bar"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCatchClausesAfterFinallyBlock.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCatchClausesAfterFinallyBlock.syntaxtree.txt
new file mode 100644
index 0000000000..493313d0b3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCatchClausesAfterFinallyBlock.syntaxtree.txt
@@ -0,0 +1,37 @@
+Statement block - Gen - 55 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } finally { var foo = new { } }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:35
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCodeAfterElseBranch.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCodeAfterElseBranch.syntaxtree.txt
new file mode 100644
index 0000000000..1d53581e15
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingCodeAfterElseBranch.syntaxtree.txt
@@ -0,0 +1,109 @@
+Statement block - Gen - 220 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF} else if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"bar } baz");LF} else { Debug.WriteLine(@"bar } baz"); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:107
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bar } baz"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingIfIfStatementNotFollowedByElse.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingIfIfStatementNotFollowedByElse.syntaxtree.txt
new file mode 100644
index 0000000000..f3ca23e917
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockStopsParsingIfIfStatementNotFollowedByElse.syntaxtree.txt
@@ -0,0 +1,47 @@
+Statement block - Gen - 87 - (0:0,0)
+ Code span - Gen - [if(int i = 0; i < 10; new Foo { Bar = "baz" }) {LF Debug.WriteLine(@"foo } bar");LF}] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:45
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[i];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LessThan;[<];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[10];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.StringLiteral;["baz"];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Debug];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[WriteLine];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"foo } bar"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..372641ccc4
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenCatchAndFinallyClause.syntaxtree.txt
@@ -0,0 +1,41 @@
+Statement block - Gen - 75 - (0:0,0)
+ Code span - Gen - [try { bar(); } catch(bar) { baz(); } /* Foo */ /* Bar */ finally { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:39
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[biz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenDoAndWhileClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenDoAndWhileClause.syntaxtree.txt
new file mode 100644
index 0000000000..6c2b490097
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenDoAndWhileClause.syntaxtree.txt
@@ -0,0 +1,26 @@
+Statement block - Gen - 54 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; } /* Foo */ /* Bar */ while(true);] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:24
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[true];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenElseIfAndElseClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenElseIfAndElseClause.syntaxtree.txt
new file mode 100644
index 0000000000..b7dbaff01b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenElseIfAndElseClause.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 78 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); } else if(bar) { baz(); } /* Foo */ /* Bar */ else { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[biz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseClause.syntaxtree.txt
new file mode 100644
index 0000000000..b3d9e4803d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseClause.syntaxtree.txt
@@ -0,0 +1,30 @@
+Statement block - Gen - 54 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); } /* Foo */ /* Bar */ else { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:28
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseIfClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseIfClause.syntaxtree.txt
new file mode 100644
index 0000000000..a3e21f379d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenIfAndElseIfClause.syntaxtree.txt
@@ -0,0 +1,35 @@
+Statement block - Gen - 62 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); } /* Foo */ /* Bar */ else if(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:33
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndCatchClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndCatchClause.syntaxtree.txt
new file mode 100644
index 0000000000..98ebae7b75
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndCatchClause.syntaxtree.txt
@@ -0,0 +1,30 @@
+Statement block - Gen - 56 - (0:0,0)
+ Code span - Gen - [try { bar(); } /* Foo */ /* Bar */ catch(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:28
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..76850c7324
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsBlockCommentBetweenTryAndFinallyClause.syntaxtree.txt
@@ -0,0 +1,27 @@
+Statement block - Gen - 53 - (0:0,0)
+ Code span - Gen - [try { bar(); } /* Foo */ /* Bar */ finally { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:25
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Foo */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Comment;[/* Bar */];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsExceptionLessCatchClauses.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsExceptionLessCatchClauses.syntaxtree.txt
new file mode 100644
index 0000000000..03b82d640b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsExceptionLessCatchClauses.syntaxtree.txt
@@ -0,0 +1,37 @@
+Statement block - Gen - 53 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } catch { var foo = new { } }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:35
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenCatchAndFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenCatchAndFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..acf12c72eb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenCatchAndFinallyClause.syntaxtree.txt
@@ -0,0 +1,41 @@
+Statement block - Gen - 72 - (0:0,0)
+ Code span - Gen - [try { bar(); } catch(bar) { baz(); }LF// FooLF// BarLFfinally { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:39
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[biz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenDoAndWhileClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenDoAndWhileClause.syntaxtree.txt
new file mode 100644
index 0000000000..40209ac12e
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenDoAndWhileClause.syntaxtree.txt
@@ -0,0 +1,26 @@
+Statement block - Gen - 51 - (0:0,0)
+ Code span - Gen - [do { var foo = bar; }LF// FooLF// BarLFwhile(true);] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:24
+ CSharpSymbolType.Keyword;[do];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[while];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[true];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenElseIfAndElseClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenElseIfAndElseClause.syntaxtree.txt
new file mode 100644
index 0000000000..33a8921e59
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenElseIfAndElseClause.syntaxtree.txt
@@ -0,0 +1,46 @@
+Statement block - Gen - 75 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); } else if(bar) { baz(); }LF// FooLF// BarLFelse { biz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:44
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[biz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseClause.syntaxtree.txt
new file mode 100644
index 0000000000..ecff6e6791
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseClause.syntaxtree.txt
@@ -0,0 +1,30 @@
+Statement block - Gen - 51 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); }LF// FooLF// BarLFelse { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:28
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseIfClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseIfClause.syntaxtree.txt
new file mode 100644
index 0000000000..7d68e7beaa
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenIfAndElseIfClause.syntaxtree.txt
@@ -0,0 +1,35 @@
+Statement block - Gen - 59 - (0:0,0)
+ Code span - Gen - [if(foo) { bar(); }LF// FooLF// BarLFelse if(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:33
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[else];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[if];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndCatchClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndCatchClause.syntaxtree.txt
new file mode 100644
index 0000000000..e0c31462eb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndCatchClause.syntaxtree.txt
@@ -0,0 +1,30 @@
+Statement block - Gen - 53 - (0:0,0)
+ Code span - Gen - [try { bar(); }LF// FooLF// BarLFcatch(bar) { baz(); }] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:28
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..f04cd252d5
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsLineCommentBetweenTryAndFinallyClause.syntaxtree.txt
@@ -0,0 +1,27 @@
+Statement block - Gen - 50 - (0:0,0)
+ Code span - Gen - [try { bar(); }LF// FooLF// BarLFfinally { baz(); }] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:25
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Foo];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Comment;[// Bar];
+ CSharpSymbolType.NewLine;[LF];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinAdditionalCatchClauses.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinAdditionalCatchClauses.syntaxtree.txt
new file mode 100644
index 0000000000..f6bdbfe7eb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinAdditionalCatchClauses.syntaxtree.txt
@@ -0,0 +1,100 @@
+Statement block - Gen - 141 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) { var foo = new { } } catch(Foo Bar Baz) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:78
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 12 - (128:0,128)
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:Any - (128:0,128) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Tag block - Gen - 3 - (129:0,129)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (129:0,129) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (132:0,132) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (135:0,135)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (135:0,135) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:None - (139:0,139) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [}] - SpanEditHandler;Accepts:Any - (140:0,140) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinCatchClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinCatchClause.syntaxtree.txt
new file mode 100644
index 0000000000..8024183cd0
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinCatchClause.syntaxtree.txt
@@ -0,0 +1,50 @@
+Statement block - Gen - 59 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } catch(Foo Bar Baz) {] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:28
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[Foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Bar];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[Baz];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 12 - (46:0,46)
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:Any - (46:0,46) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Tag block - Gen - 3 - (47:0,47)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (47:0,47) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (50:0,50) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (53:0,53)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (53:0,53) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:None - (57:0,57) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [}] - SpanEditHandler;Accepts:Any - (58:0,58) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..f3e53bc0e1
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinFinallyClause.syntaxtree.txt
@@ -0,0 +1,43 @@
+Statement block - Gen - 48 - (0:0,0)
+ Code span - Gen - [try { var foo = new { } } finally {] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:21
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[var];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[finally];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 12 - (35:0,35)
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:Any - (35:0,35) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Tag block - Gen - 3 - (36:0,36)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (36:0,36) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (39:0,39) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (42:0,42)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (42:0,42) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:None - (46:0,46) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [}] - SpanEditHandler;Accepts:None - (47:0,47) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinTryClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinTryClause.syntaxtree.txt
new file mode 100644
index 0000000000..c3bb2e8568
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsMarkupWithinTryClause.syntaxtree.txt
@@ -0,0 +1,25 @@
+Statement block - Gen - 18 - (0:0,0)
+ Code span - Gen - [try {] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:3
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ Markup block - Gen - 12 - (5:0,5)
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:Any - (5:0,5) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Tag block - Gen - 3 - (6:0,6)
+ Markup span - Gen - [] - SpanEditHandler;Accepts:None - (6:0,6) - Symbols:3
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [Foo] - SpanEditHandler;Accepts:Any - (9:0,9) - Symbols:1
+ HtmlSymbolType.Text;[Foo];
+ Tag block - Gen - 4 - (12:0,12)
+ Markup span - Gen - [
] - SpanEditHandler;Accepts:None - (12:0,12) - Symbols:4
+ HtmlSymbolType.OpenAngle;[<];
+ HtmlSymbolType.ForwardSlash;[/];
+ HtmlSymbolType.Text;[p];
+ HtmlSymbolType.CloseAngle;[>];
+ Markup span - Gen - [ ] - SpanEditHandler;Accepts:None - (16:0,16) - Symbols:1
+ HtmlSymbolType.WhiteSpace;[ ];
+ Code span - Gen - [}] - SpanEditHandler;Accepts:Any - (17:0,17) - Symbols:1
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause.syntaxtree.txt
new file mode 100644
index 0000000000..166e268a6f
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpBlockTest/ParseBlockSupportsRazorCommentBetweenCatchAndFinallyClause.syntaxtree.txt
@@ -0,0 +1,63 @@
+Statement block - Gen - 75 - (0:0,0)
+ Code span - Gen - [try { bar(); } catch(bar) { baz(); } ] - SpanEditHandler;Accepts:Any - (0:0,0) - Symbols:25
+ CSharpSymbolType.Keyword;[try];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[catch];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.WhiteSpace;[ ];
+ Comment block - Gen - 9 - (37:0,37)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (37:0,37) - Symbols:1
+ CSharpSymbolType.RazorCommentTransition;[@];
+ MetaCode span - Gen - [*] - SpanEditHandler;Accepts:None - (38:0,38) - Symbols:1
+ CSharpSymbolType.RazorCommentStar;[*];
+ Comment span - Gen - [ Foo ] - SpanEditHandler;Accepts:Any - (39:0,39) - Symbols:1
+ CSharpSymbolType.RazorComment;[ Foo ];
+ MetaCode span - Gen - [*] - SpanEditHandler;Accepts:None - (44:0,44) - Symbols:1
+ CSharpSymbolType.RazorCommentStar;[*];
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (45:0,45) - Symbols:1
+ CSharpSymbolType.RazorCommentTransition;[@];
+ Code span - Gen - [ ] - SpanEditHandler;Accepts:Any - (46:0,46) - Symbols:1
+ CSharpSymbolType.WhiteSpace;[ ];
+ Comment block - Gen - 9 - (47:0,47)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (47:0,47) - Symbols:1
+ CSharpSymbolType.RazorCommentTransition;[@];
+ MetaCode span - Gen