From 31f1fb6b52c121a2c42a13031477d0ad99c5d1fc Mon Sep 17 00:00:00 2001 From: Neal Gafter Date: Wed, 28 Mar 2018 16:58:50 -0700 Subject: [PATCH] Use `IsMakingProgress` in pattern parsing. Simplify expressions in `IsPossibleSubpatternElement` --- .../CSharp/Portable/Parser/LanguageParser_Patterns.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs b/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs index b06aa3541cb..a67f16c5765 100644 --- a/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs +++ b/src/Compilers/CSharp/Portable/Parser/LanguageParser_Patterns.cs @@ -532,7 +532,8 @@ private PropertySubpatternSyntax ParsePropertySubpattern() list.Add(this.ParseSubpatternElement()); // additional patterns - while (true) + int lastTokenPosition = -1; + while (IsMakingProgress(ref lastTokenPosition)) { if (this.CurrentToken.Kind == SyntaxKind.CloseParenToken || this.CurrentToken.Kind == SyntaxKind.CloseBraceToken || @@ -588,8 +589,11 @@ private SubpatternElementSyntax ParseSubpatternElement() private bool IsPossibleSubpatternElement() { var tk = this.CurrentToken.Kind; - return this.IsPossibleExpression() && !(SyntaxFacts.IsBinaryExpression(tk) || SyntaxFacts.IsAssignmentExpressionOperatorToken(tk)) || - this.CurrentToken.Kind == SyntaxKind.OpenBraceToken; + bool isExpression = this.IsPossibleExpression() && + // IsPossibleExpression returns true when the next token is a binary operator. + // That is useful for error recovery elsewhere, but not here. + !(SyntaxFacts.IsBinaryExpression(tk) || SyntaxFacts.IsAssignmentExpressionOperatorToken(tk)); + return isExpression || this.CurrentToken.Kind == SyntaxKind.OpenBraceToken; } private PostSkipAction SkipBadPatternListTokens( -- GitLab