From df22392996c0ac1e446e827257e789a37f215873 Mon Sep 17 00:00:00 2001
From: Ajay Bhargav Baaskaran
Date: Wed, 27 Jun 2018 12:14:24 -0700
Subject: [PATCH] Convert CSharpImplicitExpressionTest
---
.../Legacy/CSharpBlockTest.cs | 3 +-
.../Legacy/CSharpImplicitExpressionTest.cs | 358 +++++++++++-------
.../Legacy/CodeParserTestBase.cs | 9 +-
.../NestedImplicitExpression.syntaxtree.txt | 18 +
...tersThatAreValidIdentifiers.syntaxtree.txt | 5 +
...ssionTerminatedByWhitespace.syntaxtree.txt | 5 +
...otAtEOFInImplicitExpression.syntaxtree.txt | 7 +
...racterInImplicitExpression1.syntaxtree.txt | 7 +
...racterInImplicitExpression2.syntaxtree.txt | 7 +
...NotIncludeSemicolonAfterDot.syntaxtree.txt | 7 +
...lonAtEndOfDottedIdentifiers.syntaxtree.txt | 9 +
...dOfSimpleImplicitExpression.syntaxtree.txt | 5 +
...tifiersAsImplicitExpression.syntaxtree.txt | 9 +
...ImplicitExpression_Bracket1.syntaxtree.txt | 5 +
...mplicitExpression_Bracket10.syntaxtree.txt | 10 +
...plicitExpression_Bracket11.diagnostics.txt | 1 +
...mplicitExpression_Bracket11.syntaxtree.txt | 12 +
...mplicitExpression_Bracket12.syntaxtree.txt | 13 +
...mplicitExpression_Bracket13.syntaxtree.txt | 16 +
...mplicitExpression_Bracket14.syntaxtree.txt | 15 +
...mplicitExpression_Bracket15.syntaxtree.txt | 13 +
...mplicitExpression_Bracket16.syntaxtree.txt | 17 +
...ImplicitExpression_Bracket2.syntaxtree.txt | 5 +
...mplicitExpression_Bracket3.diagnostics.txt | 1 +
...ImplicitExpression_Bracket3.syntaxtree.txt | 7 +
...ImplicitExpression_Bracket4.syntaxtree.txt | 5 +
...mplicitExpression_Bracket5.diagnostics.txt | 1 +
...ImplicitExpression_Bracket5.syntaxtree.txt | 8 +
...ImplicitExpression_Bracket6.syntaxtree.txt | 9 +
...mplicitExpression_Bracket7.diagnostics.txt | 1 +
...ImplicitExpression_Bracket7.syntaxtree.txt | 7 +
...mplicitExpression_Bracket8.diagnostics.txt | 1 +
...ImplicitExpression_Bracket8.syntaxtree.txt | 9 +
...ImplicitExpression_Bracket9.syntaxtree.txt | 5 +
...atorImplicitExpression_Dot1.syntaxtree.txt | 5 +
...torImplicitExpression_Dot10.syntaxtree.txt | 8 +
...torImplicitExpression_Dot11.syntaxtree.txt | 5 +
...torImplicitExpression_Dot12.syntaxtree.txt | 13 +
...torImplicitExpression_Dot13.syntaxtree.txt | 14 +
...torImplicitExpression_Dot14.syntaxtree.txt | 18 +
...atorImplicitExpression_Dot2.syntaxtree.txt | 5 +
...atorImplicitExpression_Dot3.syntaxtree.txt | 5 +
...atorImplicitExpression_Dot4.syntaxtree.txt | 5 +
...atorImplicitExpression_Dot5.syntaxtree.txt | 7 +
...atorImplicitExpression_Dot6.syntaxtree.txt | 5 +
...atorImplicitExpression_Dot7.syntaxtree.txt | 7 +
...atorImplicitExpression_Dot8.syntaxtree.txt | 7 +
...atorImplicitExpression_Dot9.syntaxtree.txt | 8 +
...ntifierAsImplicitExpression.syntaxtree.txt | 5 +
...OrParenInImplicitExpression.syntaxtree.txt | 7 +
...duleTokenNotFollowedByBrace.syntaxtree.txt | 9 +
...IfEOFOccursAfterTransition.diagnostics.txt | 1 +
...nIfEOFOccursAfterTransition.syntaxtree.txt | 5 +
...CharacterFollowsTransition.diagnostics.txt | 1 +
...dCharacterFollowsTransition.syntaxtree.txt | 5 +
...cesThemInImplicitExpression.syntaxtree.txt | 25 ++
...cesThemInImplicitExpression.syntaxtree.txt | 63 +++
...sBalancingParenthesesAtEOF.diagnostics.txt | 1 +
...psBalancingParenthesesAtEOF.syntaxtree.txt | 8 +
...nComplexImplicitExpressions.syntaxtree.txt | 39 ++
...licitExpressionAtHtmlEndTag.syntaxtree.txt | 11 +
...citExpressionAtHtmlStartTag.syntaxtree.txt | 11 +
...ntIfDotFollowedByWhitespace.syntaxtree.txt | 5 +
...dByIdentifierStartCharacter.syntaxtree.txt | 11 +
...arenFollowedByAnyWhiteSpace.syntaxtree.txt | 9 +
...fierFollowedByAnyWhiteSpace.syntaxtree.txt | 5 +
66 files changed, 803 insertions(+), 140 deletions(-)
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockAcceptsNonEnglishCharactersThatAreValidIdentifiers.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotAtEOFInImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression1.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression2.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeSemicolonAfterDot.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfDottedIdentifiers.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfSimpleImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesDottedIdentifiersAsImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket1.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket10.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket12.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket13.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket14.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket15.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket16.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket2.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket4.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket6.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket9.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot1.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot10.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot11.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot12.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot13.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot14.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot2.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot3.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot4.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot5.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot6.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot7.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot8.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot9.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesSingleIdentifierAsImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodTerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputExpressionIfModuleTokenNotFollowedByBrace.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesBracketsAndBalancesThemInImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesParenthesesAndBalancesThemInImplicitExpression.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.diagnostics.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockSupportsSlashesWithinComplexImplicitExpressions.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlEndTag.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlStartTag.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionBeforeDotIfDotNotFollowedByIdentifierStartCharacter.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.syntaxtree.txt
create mode 100644 test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.syntaxtree.txt
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs
index 32755fcbfd..04d75c98c5 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpBlockTest.cs
@@ -101,8 +101,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
[Fact]
public void ParseBlockTerminatesParenBalancingAtEOF()
{
- ImplicitExpressionTest(
- "Html.En(code()", "Html.En(code()");
+ ImplicitExpressionTest("Html.En(code()");
}
[Fact]
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs
index 3a013a6ec8..7c00bbeaa1 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CSharpImplicitExpressionTest.cs
@@ -1,146 +1,249 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-using System;
using Xunit;
namespace Microsoft.AspNetCore.Razor.Language.Legacy
{
public class CSharpImplicitExpressionTest : CsHtmlCodeParserTestBase
{
- private const string TestExtraKeyword = "model";
-
- public static TheoryData NullConditionalOperatorData_Bracket
+ public CSharpImplicitExpressionTest()
{
- get
- {
- var noErrors = new RazorDiagnostic[0];
- Func missingEndBracketError = (index) =>
- new RazorDiagnostic[1]
- {
- RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
- new SourceSpan(new SourceLocation(index, 0, index), contentLength: 1), "[", "]"),
- };
-
- // implicitExpression, expectedImplicitExpression, acceptedCharacters, expectedErrors
- return new TheoryData
- {
- { "val??[", "val", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val??[0", "val", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[", "val?[", AcceptedCharactersInternal.Any, missingEndBracketError(5) },
- { "val?(", "val", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[more", "val?[more", AcceptedCharactersInternal.Any, missingEndBracketError(5) },
- { "val?[0]", "val?[0]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[", "val?[", AcceptedCharactersInternal.Any, missingEndBracketError(5) },
- { "val?[more.
", "val?[more.", AcceptedCharactersInternal.Any, missingEndBracketError(5) },
- { "val??[more
", "val", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[-1]?", "val?[-1]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[abc]?[def", "val?[abc]?[def", AcceptedCharactersInternal.Any, missingEndBracketError(11) },
- { "val?[abc]?[2]", "val?[abc]?[2]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[abc]?.more?[def]", "val?[abc]?.more?[def]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[abc]?.more?.abc", "val?[abc]?.more?.abc", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[null ?? true]", "val?[null ?? true]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- { "val?[abc?.gef?[-1]]", "val?[abc?.gef?[-1]]", AcceptedCharactersInternal.NonWhiteSpace, noErrors },
- };
- }
+ UseBaselineTests = true;
}
- [Theory]
- [MemberData(nameof(NullConditionalOperatorData_Bracket))]
- public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket(
- string implicitExpresison,
- string expectedImplicitExpression,
- object acceptedCharacters,
- object expectedErrors)
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket1()
{
// Act & Assert
- ImplicitExpressionTest(
- implicitExpresison,
- expectedImplicitExpression,
- (AcceptedCharactersInternal)acceptedCharacters,
- (RazorDiagnostic[])expectedErrors);
+ ImplicitExpressionTest("val??[");
}
- public static TheoryData NullConditionalOperatorData_Dot
- {
- get
- {
- // implicitExpression, expectedImplicitExpression
- return new TheoryData
- {
- { "val?", "val" },
- { "val??", "val" },
- { "val??more", "val" },
- { "val?!", "val" },
- { "val?.", "val?." },
- { "val??.", "val" },
- { "val?.(abc)", "val?." },
- { "val?.", "val?." },
- { "val?.more", "val?.more" },
- { "val?.more
", "val?.more" },
- { "val??.more
", "val" },
- { "val?.more(false)?.
", "val?.more(false)?." },
- { "val?.more(false)?.abc", "val?.more(false)?.abc" },
- { "val?.more(null ?? true)?.abc", "val?.more(null ?? true)?.abc" },
- };
- }
- }
-
- [Theory]
- [MemberData(nameof(NullConditionalOperatorData_Dot))]
- public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot(
- string implicitExpresison,
- string expectedImplicitExpression)
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket2()
{
// Act & Assert
- ImplicitExpressionTest(implicitExpresison, expectedImplicitExpression);
+ ImplicitExpressionTest("val??[0");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket4()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?(");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[more");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket6()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[0]");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[more.
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket9()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val??[more
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket10()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[-1]?");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[abc]?[def");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket12()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[abc]?[2]");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket13()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[abc]?.more?[def]");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket14()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[abc]?.more?.abc");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket15()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[null ?? true]");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket16()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?[abc?.gef?[-1]]");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot1()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot2()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val??");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot3()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val??more");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot4()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?!");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot5()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot6()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val??.");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot7()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.(abc)");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot8()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot9()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.more");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot10()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.more
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot11()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val??.more
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot12()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.more(false)?.
");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot13()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.more(false)?.abc");
+ }
+
+ [Fact]
+ public void ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot14()
+ {
+ // Act & Assert
+ ImplicitExpressionTest("val?.more(null ?? true)?.abc");
}
[Fact]
public void NestedImplicitExpression()
{
- ParseBlockTest("if (true) { @foo }",
- new StatementBlock(
- Factory.Code("if (true) { ").AsStatement(),
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code("foo")
- .AsImplicitExpression(CSharpCodeParser.DefaultKeywords, acceptTrailingDot: true)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
- Factory.Code(" }").AsStatement()));
+ ParseBlockTest("if (true) { @foo }");
}
[Fact]
public void ParseBlockAcceptsNonEnglishCharactersThatAreValidIdentifiers()
{
- ImplicitExpressionTest("हळूँजद॔.", "हळूँजद॔");
+ ImplicitExpressionTest("हळूँजद॔.");
}
[Fact]
public void ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition()
{
- ParseBlockTest("@/",
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.EmptyCSharp()
- .AsImplicitExpression(KeywordSet)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
- RazorDiagnosticFactory.CreateParsing_UnexpectedCharacterAtStartOfCodeBlock(
- new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1),
- "/"));
+ ParseBlockTest("@/");
}
[Fact]
public void ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition()
{
- ParseBlockTest("@",
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.EmptyCSharp()
- .AsImplicitExpression(KeywordSet)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)),
- RazorDiagnosticFactory.CreateParsing_UnexpectedEndOfFileAtStartOfCodeBlock(
- new SourceSpan(new SourceLocation(1, 0, 1), contentLength: 1)));
+ ParseBlockTest("@");
}
[Fact]
@@ -158,7 +261,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
[Fact]
public void ParseBlockMethodDoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace()
{
- ImplicitExpressionTest("foo ;", "foo");
+ ImplicitExpressionTest("foo ;");
}
[Fact]
@@ -182,26 +285,31 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
[Fact]
public void ParseBlockMethodDoesNotIncludeDotAtEOFInImplicitExpression()
{
- ImplicitExpressionTest("foo.bar.", "foo.bar");
+ ImplicitExpressionTest("foo.bar.");
}
[Fact]
- public void ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression()
+ public void ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression1()
{
- ImplicitExpressionTest("foo.bar.0", "foo.bar");
- ImplicitExpressionTest("foo.bar.
", "foo.bar");
+ ImplicitExpressionTest("foo.bar.0");
+ }
+
+ [Fact]
+ public void ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression2()
+ {
+ ImplicitExpressionTest("foo.bar.
");
}
[Fact]
public void ParseBlockMethodDoesNotIncludeSemicolonAfterDot()
{
- ImplicitExpressionTest("foo.bar.;", "foo.bar");
+ ImplicitExpressionTest("foo.bar.;");
}
[Fact]
public void ParseBlockMethodTerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpression()
{
- ImplicitExpressionTest("foo.bar
", "foo.bar");
+ ImplicitExpressionTest("foo.bar");
}
[Fact]
@@ -219,47 +327,43 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
[Fact]
public void ParseBlockTerminatesImplicitExpressionAtHtmlEndTag()
{
- ImplicitExpressionTest("foo().bar.bazzoop", "foo().bar.baz");
+ ImplicitExpressionTest("foo().bar.bazzoop");
}
[Fact]
public void ParseBlockTerminatesImplicitExpressionAtHtmlStartTag()
{
- ImplicitExpressionTest("foo().bar.bazzoop", "foo().bar.baz");
+ ImplicitExpressionTest("foo().bar.baz
zoop");
}
[Fact]
public void ParseBlockTerminatesImplicitExpressionBeforeDotIfDotNotFollowedByIdentifierStartCharacter()
{
- ImplicitExpressionTest("foo().bar.baz.42", "foo().bar.baz");
+ ImplicitExpressionTest("foo().bar.baz.42");
}
[Fact]
public void ParseBlockStopsBalancingParenthesesAtEOF()
{
- ImplicitExpressionTest(
- "foo(()", "foo(()",
- acceptedCharacters: AcceptedCharactersInternal.Any,
- errors: RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
- new SourceSpan(new SourceLocation(4, 0, 4), contentLength: 1), "(", ")"));
+ ImplicitExpressionTest("foo(()");
}
[Fact]
public void ParseBlockTerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace()
{
- ImplicitExpressionTest("foo.bar() (baz)", "foo.bar()");
+ ImplicitExpressionTest("foo.bar() (baz)");
}
[Fact]
public void ParseBlockTerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace()
{
- ImplicitExpressionTest("foo .bar() (baz)", "foo");
+ ImplicitExpressionTest("foo .bar() (baz)");
}
[Fact]
public void ParseBlockTerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace()
{
- ImplicitExpressionTest("foo. bar() (baz)", "foo");
+ ImplicitExpressionTest("foo. bar() (baz)");
}
[Fact]
@@ -270,13 +374,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
private void RunTrailingSemicolonTest(string expr)
{
- ParseBlockTest(SyntaxConstants.TransitionString + expr + ";",
- new ExpressionBlock(
- Factory.CodeTransition(),
- Factory.Code(expr)
- .AsImplicitExpression(KeywordSet)
- .Accepts(AcceptedCharactersInternal.NonWhiteSpace)
- ));
+ ParseBlockTest(SyntaxConstants.TransitionString + expr + ";");
}
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeParserTestBase.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeParserTestBase.cs
index 923a25a441..6437faa292 100644
--- a/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeParserTestBase.cs
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/Legacy/CodeParserTestBase.cs
@@ -66,14 +66,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Legacy
internal void ImplicitExpressionTest(string input, string expected, AcceptedCharactersInternal acceptedCharacters, params RazorDiagnostic[] errors)
{
- var factory = CreateSpanFactory();
- ParseBlockTest(SyntaxConstants.TransitionString + input,
- new ExpressionBlock(
- factory.CodeTransition(),
- factory.Code(expected)
- .AsImplicitExpression(KeywordSet)
- .Accepts(acceptedCharacters)),
- errors);
+ ParseBlockTest(SyntaxConstants.TransitionString + input);
}
}
}
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..8f3b31118a
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/NestedImplicitExpression.syntaxtree.txt
@@ -0,0 +1,18 @@
+Statement block - Gen - 18 - (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;[ ];
+ Expression block - Gen - 4 - (12:0,12)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (12:0,12) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[ATD];K14 - (13:0,13) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];
+ Code span - Gen - [ }] - SpanEditHandler;Accepts:Any - (16:0,16) - Symbols:2
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockAcceptsNonEnglishCharactersThatAreValidIdentifiers.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockAcceptsNonEnglishCharactersThatAreValidIdentifiers.syntaxtree.txt
new file mode 100644
index 0000000000..b5629747fd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockAcceptsNonEnglishCharactersThatAreValidIdentifiers.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [हळूँजद॔] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[हळूँजद॔];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.syntaxtree.txt
new file mode 100644
index 0000000000..368cbec988
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotAcceptSemicolonIfExpressionTerminatedByWhitespace.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotAtEOFInImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotAtEOFInImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..1a5b3d317b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotAtEOFInImplicitExpression.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression1.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression1.syntaxtree.txt
new file mode 100644
index 0000000000..1a5b3d317b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression1.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression2.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression2.syntaxtree.txt
new file mode 100644
index 0000000000..1a5b3d317b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeDotFollowedByInvalidIdentifierCharacterInImplicitExpression2.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeSemicolonAfterDot.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeSemicolonAfterDot.syntaxtree.txt
new file mode 100644
index 0000000000..1a5b3d317b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodDoesNotIncludeSemicolonAfterDot.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfDottedIdentifiers.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfDottedIdentifiers.syntaxtree.txt
new file mode 100644
index 0000000000..d523e84810
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfDottedIdentifiers.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 12 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfSimpleImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfSimpleImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..368cbec988
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodIgnoresSemicolonAtEndOfSimpleImplicitExpression.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesDottedIdentifiersAsImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesDottedIdentifiersAsImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..d523e84810
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesDottedIdentifiersAsImplicitExpression.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 12 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket1.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket1.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket1.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket10.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket10.syntaxtree.txt
new file mode 100644
index 0000000000..57d0b46d99
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket10.syntaxtree.txt
@@ -0,0 +1,10 @@
+Expression block - Gen - 9 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[-1]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:6
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Minus;[-];
+ CSharpSymbolType.IntegerLiteral;[1];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.diagnostics.txt
new file mode 100644
index 0000000000..a6129d65d7
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.diagnostics.txt
@@ -0,0 +1 @@
+(1,12): Error RZ1027: An opening "[" is missing the corresponding closing "]".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.syntaxtree.txt
new file mode 100644
index 0000000000..a24dd4c31d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket11.syntaxtree.txt
@@ -0,0 +1,12 @@
+Expression block - Gen - 15 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[abc]?[def] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:8
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[abc];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[def];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket12.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket12.syntaxtree.txt
new file mode 100644
index 0000000000..e66d54706b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket12.syntaxtree.txt
@@ -0,0 +1,13 @@
+Expression block - Gen - 14 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[abc]?[2]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:9
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[abc];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.IntegerLiteral;[2];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket13.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket13.syntaxtree.txt
new file mode 100644
index 0000000000..967b311fc0
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket13.syntaxtree.txt
@@ -0,0 +1,16 @@
+Expression block - Gen - 22 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[abc]?.more?[def]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:12
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[abc];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[def];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket14.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket14.syntaxtree.txt
new file mode 100644
index 0000000000..2e273fbbca
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket14.syntaxtree.txt
@@ -0,0 +1,15 @@
+Expression block - Gen - 21 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[abc]?.more?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:11
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[abc];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[abc];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket15.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket15.syntaxtree.txt
new file mode 100644
index 0000000000..a6398e5589
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket15.syntaxtree.txt
@@ -0,0 +1,13 @@
+Expression block - Gen - 19 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[null ?? true]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:9
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Keyword;[null];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.NullCoalesce;[??];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[true];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket16.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket16.syntaxtree.txt
new file mode 100644
index 0000000000..d009d78db8
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket16.syntaxtree.txt
@@ -0,0 +1,17 @@
+Expression block - Gen - 20 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[abc?.gef?[-1]]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:13
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[abc];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[gef];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Minus;[-];
+ CSharpSymbolType.IntegerLiteral;[1];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket2.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket2.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket2.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.diagnostics.txt
new file mode 100644
index 0000000000..34f020b41b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.diagnostics.txt
@@ -0,0 +1 @@
+(1,6): Error RZ1027: An opening "[" is missing the corresponding closing "]".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.syntaxtree.txt
new file mode 100644
index 0000000000..b96658c322
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket3.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 6 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket4.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket4.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket4.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.diagnostics.txt
new file mode 100644
index 0000000000..34f020b41b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.diagnostics.txt
@@ -0,0 +1 @@
+(1,6): Error RZ1027: An opening "[" is missing the corresponding closing "]".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.syntaxtree.txt
new file mode 100644
index 0000000000..2e6a035938
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket5.syntaxtree.txt
@@ -0,0 +1,8 @@
+Expression block - Gen - 10 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[more] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:4
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[more];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket6.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket6.syntaxtree.txt
new file mode 100644
index 0000000000..58bc580be4
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket6.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[0]] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.IntegerLiteral;[0];
+ CSharpSymbolType.RightBracket;[]];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.diagnostics.txt
new file mode 100644
index 0000000000..34f020b41b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.diagnostics.txt
@@ -0,0 +1 @@
+(1,6): Error RZ1027: An opening "[" is missing the corresponding closing "]".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.syntaxtree.txt
new file mode 100644
index 0000000000..b96658c322
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket7.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 6 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.diagnostics.txt
new file mode 100644
index 0000000000..34f020b41b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.diagnostics.txt
@@ -0,0 +1 @@
+(1,6): Error RZ1027: An opening "[" is missing the corresponding closing "]".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.syntaxtree.txt
new file mode 100644
index 0000000000..0dfa555f8a
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket8.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 11 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?[more.] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.Dot;[.];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket9.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket9.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Bracket9.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot1.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot1.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot1.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot10.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot10.syntaxtree.txt
new file mode 100644
index 0000000000..0eaead0945
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot10.syntaxtree.txt
@@ -0,0 +1,8 @@
+Expression block - Gen - 10 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.more] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:4
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot11.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot11.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot11.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot12.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot12.syntaxtree.txt
new file mode 100644
index 0000000000..89110e1265
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot12.syntaxtree.txt
@@ -0,0 +1,13 @@
+Expression block - Gen - 19 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.more(false)?.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:9
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[false];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot13.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot13.syntaxtree.txt
new file mode 100644
index 0000000000..0dedbf3852
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot13.syntaxtree.txt
@@ -0,0 +1,14 @@
+Expression block - Gen - 22 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.more(false)?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:10
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[false];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[abc];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot14.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot14.syntaxtree.txt
new file mode 100644
index 0000000000..5f69aab1bf
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot14.syntaxtree.txt
@@ -0,0 +1,18 @@
+Expression block - Gen - 29 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.more(null ?? true)?.abc] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:14
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[null];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.NullCoalesce;[??];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[true];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[abc];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot2.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot2.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot2.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot3.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot3.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot3.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot4.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot4.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot4.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot5.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot5.syntaxtree.txt
new file mode 100644
index 0000000000..141b205dac
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot5.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 6 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot6.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot6.syntaxtree.txt
new file mode 100644
index 0000000000..d123ee18bd
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot6.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[val];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot7.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot7.syntaxtree.txt
new file mode 100644
index 0000000000..141b205dac
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot7.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 6 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot8.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot8.syntaxtree.txt
new file mode 100644
index 0000000000..141b205dac
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot8.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 6 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot9.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot9.syntaxtree.txt
new file mode 100644
index 0000000000..0eaead0945
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesNullConditionalOperatorImplicitExpression_Dot9.syntaxtree.txt
@@ -0,0 +1,8 @@
+Expression block - Gen - 10 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [val?.more] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:4
+ CSharpSymbolType.Identifier;[val];
+ CSharpSymbolType.QuestionMark;[?];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[more];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesSingleIdentifierAsImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesSingleIdentifierAsImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..368cbec988
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodParsesSingleIdentifierAsImplicitExpression.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodTerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodTerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..1a5b3d317b
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockMethodTerminatesAfterIdentifierUnlessFollowedByDotOrParenInImplicitExpression.syntaxtree.txt
@@ -0,0 +1,7 @@
+Expression block - Gen - 8 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:3
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputExpressionIfModuleTokenNotFollowedByBrace.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputExpressionIfModuleTokenNotFollowedByBrace.syntaxtree.txt
new file mode 100644
index 0000000000..15553d9fec
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputExpressionIfModuleTokenNotFollowedByBrace.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 13 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [module.foo()] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[module];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.diagnostics.txt
new file mode 100644
index 0000000000..c6d6925451
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.diagnostics.txt
@@ -0,0 +1 @@
+(1,2): Error RZ1004: End-of-file was found after the "@" character. "@" must be followed by a valid code block. If you want to output an "@", escape it using the sequence: "@@"
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.syntaxtree.txt
new file mode 100644
index 0000000000..2ce6cbbd8a
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfEOFOccursAfterTransition.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 1 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.diagnostics.txt
new file mode 100644
index 0000000000..6d8d0cd1bb
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.diagnostics.txt
@@ -0,0 +1 @@
+(1,2): Error RZ1005: "/" is not valid at the start of a code block. Only identifiers, keywords, comments, "(" and "{" are valid.
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.syntaxtree.txt
new file mode 100644
index 0000000000..2ce6cbbd8a
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockOutputsZeroLengthCodeSpanIfInvalidCharacterFollowsTransition.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 1 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Unknown;[];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesBracketsAndBalancesThemInImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesBracketsAndBalancesThemInImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..e128b8b59d
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesBracketsAndBalancesThemInImplicitExpression.syntaxtree.txt
@@ -0,0 +1,25 @@
+Expression block - Gen - 34 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar[4 * (8 + 7)]["fo\"o"].baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:21
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Star;[*];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[8];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Plus;[+];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[7];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.StringLiteral;["fo\"o"];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesParenthesesAndBalancesThemInImplicitExpression.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesParenthesesAndBalancesThemInImplicitExpression.syntaxtree.txt
new file mode 100644
index 0000000000..5367db8cc1
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockProperlyParsesParenthesesAndBalancesThemInImplicitExpression.syntaxtree.txt
@@ -0,0 +1,63 @@
+Expression block - Gen - 115 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo().bar("bi\"z", 4)("chained method; call").baz(@"bo""z", '\'', () => { return 4; }, (4+5+new { foo = bar[4] }))] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:59
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;["bi\"z"];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;["chained method; call"];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;[@"bo""z"];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.CharacterLiteral;['\''];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.GreaterThanEqual;[=>];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Keyword;[return];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.Semicolon;[;];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.Plus;[+];
+ CSharpSymbolType.IntegerLiteral;[5];
+ CSharpSymbolType.Plus;[+];
+ CSharpSymbolType.Keyword;[new];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftBrace;[{];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Assign;[=];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftBracket;[[];
+ CSharpSymbolType.IntegerLiteral;[4];
+ CSharpSymbolType.RightBracket;[]];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.RightBrace;[}];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.diagnostics.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.diagnostics.txt
new file mode 100644
index 0000000000..ade6c85b25
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.diagnostics.txt
@@ -0,0 +1 @@
+(1,5): Error RZ1027: An opening "(" is missing the corresponding closing ")".
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.syntaxtree.txt
new file mode 100644
index 0000000000..0c5b1d37b3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockStopsBalancingParenthesesAtEOF.syntaxtree.txt
@@ -0,0 +1,8 @@
+Expression block - Gen - 7 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo(()] - ImplicitExpressionEditHandler;Accepts:Any;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:4
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockSupportsSlashesWithinComplexImplicitExpressions.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockSupportsSlashesWithinComplexImplicitExpressions.syntaxtree.txt
new file mode 100644
index 0000000000..6e2ba2e015
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockSupportsSlashesWithinComplexImplicitExpressions.syntaxtree.txt
@@ -0,0 +1,39 @@
+Expression block - Gen - 103 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [DataGridColumn.Template("Years of Service", e => (int)Math.Round((DateTime.Now - dt).TotalDays / 365))] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:35
+ CSharpSymbolType.Identifier;[DataGridColumn];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Template];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.StringLiteral;["Years of Service"];
+ CSharpSymbolType.Comma;[,];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[e];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.GreaterThanEqual;[=>];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Keyword;[int];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Identifier;[Math];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Round];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.Identifier;[DateTime];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[Now];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Minus;[-];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Identifier;[dt];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[TotalDays];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.Slash;[/];
+ CSharpSymbolType.WhiteSpace;[ ];
+ CSharpSymbolType.IntegerLiteral;[365];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlEndTag.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlEndTag.syntaxtree.txt
new file mode 100644
index 0000000000..1a9757cdf3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlEndTag.syntaxtree.txt
@@ -0,0 +1,11 @@
+Expression block - Gen - 14 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:7
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlStartTag.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlStartTag.syntaxtree.txt
new file mode 100644
index 0000000000..1a9757cdf3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtHtmlStartTag.syntaxtree.txt
@@ -0,0 +1,11 @@
+Expression block - Gen - 14 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:7
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.syntaxtree.txt
new file mode 100644
index 0000000000..368cbec988
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionAtLastValidPointIfDotFollowedByWhitespace.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionBeforeDotIfDotNotFollowedByIdentifierStartCharacter.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionBeforeDotIfDotNotFollowedByIdentifierStartCharacter.syntaxtree.txt
new file mode 100644
index 0000000000..1a9757cdf3
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionBeforeDotIfDotNotFollowedByIdentifierStartCharacter.syntaxtree.txt
@@ -0,0 +1,11 @@
+Expression block - Gen - 14 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo().bar.baz] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:7
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[baz];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.syntaxtree.txt
new file mode 100644
index 0000000000..9e5423ea30
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfCloseParenFollowedByAnyWhiteSpace.syntaxtree.txt
@@ -0,0 +1,9 @@
+Expression block - Gen - 10 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo.bar()] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:5
+ CSharpSymbolType.Identifier;[foo];
+ CSharpSymbolType.Dot;[.];
+ CSharpSymbolType.Identifier;[bar];
+ CSharpSymbolType.LeftParenthesis;[(];
+ CSharpSymbolType.RightParenthesis;[)];
diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.syntaxtree.txt b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.syntaxtree.txt
new file mode 100644
index 0000000000..368cbec988
--- /dev/null
+++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TestFiles/ParserTests/CSharpImplicitExpressionTest/ParseBlockTerminatesImplicitExpressionIfIdentifierFollowedByAnyWhiteSpace.syntaxtree.txt
@@ -0,0 +1,5 @@
+Expression block - Gen - 4 - (0:0,0)
+ Transition span - Gen - [@] - SpanEditHandler;Accepts:None - (0:0,0) - Symbols:1
+ CSharpSymbolType.Transition;[@];
+ Code span - Gen - [foo] - ImplicitExpressionEditHandler;Accepts:NonWhiteSpace;ImplicitExpression[RTD];K14 - (1:0,1) - Symbols:1
+ CSharpSymbolType.Identifier;[foo];