Skip to content

Commit 04f5679

Browse files
author
msftbot[bot]
authored
Merge pull request #41657 from CyrusNajmabadi/ifParsing2
Use less stack space while parsing if-statements
2 parents 1a75987 + 25b54a0 commit 04f5679

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/Compilers/CSharp/Portable/Parser/LanguageParser.cs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6421,8 +6421,10 @@ private StatementSyntax ParseStatementNoDeclaration(bool allowAnyExpression)
64216421
case SyntaxKind.GotoKeyword:
64226422
return this.ParseGotoStatement();
64236423
case SyntaxKind.IfKeyword:
6424-
case SyntaxKind.ElseKeyword: // Including 'else' keyword to handle 'else without if' error cases
64256424
return this.ParseIfStatement();
6425+
case SyntaxKind.ElseKeyword:
6426+
// Including 'else' keyword to handle 'else without if' error cases
6427+
return this.ParseMisplacedElse();
64266428
case SyntaxKind.LockKeyword:
64276429
return this.ParseLockStatement();
64286430
case SyntaxKind.ReturnKeyword:
@@ -7686,19 +7688,28 @@ private GotoStatementSyntax ParseGotoStatement()
76867688

76877689
private IfStatementSyntax ParseIfStatement()
76887690
{
7689-
Debug.Assert(this.CurrentToken.Kind == SyntaxKind.IfKeyword || this.CurrentToken.Kind == SyntaxKind.ElseKeyword);
7691+
Debug.Assert(this.CurrentToken.Kind == SyntaxKind.IfKeyword);
76907692

7691-
bool firstTokenIsElse = this.CurrentToken.Kind == SyntaxKind.ElseKeyword;
7692-
var @if = firstTokenIsElse
7693-
? this.EatToken(SyntaxKind.IfKeyword, ErrorCode.ERR_ElseCannotStartStatement)
7694-
: this.EatToken(SyntaxKind.IfKeyword);
7695-
var openParen = this.EatToken(SyntaxKind.OpenParenToken);
7696-
var condition = this.ParseExpressionCore();
7697-
var closeParen = this.EatToken(SyntaxKind.CloseParenToken);
7698-
var statement = firstTokenIsElse ? this.ParseExpressionStatement() : this.ParseEmbeddedStatement();
7699-
var elseClause = this.ParseElseClauseOpt();
7693+
return _syntaxFactory.IfStatement(
7694+
this.EatToken(SyntaxKind.IfKeyword),
7695+
this.EatToken(SyntaxKind.OpenParenToken),
7696+
this.ParseExpressionCore(),
7697+
this.EatToken(SyntaxKind.CloseParenToken),
7698+
this.ParseEmbeddedStatement(),
7699+
this.ParseElseClauseOpt());
7700+
}
7701+
7702+
private IfStatementSyntax ParseMisplacedElse()
7703+
{
7704+
Debug.Assert(this.CurrentToken.Kind == SyntaxKind.ElseKeyword);
77007705

7701-
return _syntaxFactory.IfStatement(@if, openParen, condition, closeParen, statement, elseClause);
7706+
return _syntaxFactory.IfStatement(
7707+
this.EatToken(SyntaxKind.IfKeyword, ErrorCode.ERR_ElseCannotStartStatement),
7708+
this.EatToken(SyntaxKind.OpenParenToken),
7709+
this.ParseExpressionCore(),
7710+
this.EatToken(SyntaxKind.CloseParenToken),
7711+
this.ParseExpressionStatement(),
7712+
this.ParseElseClauseOpt());
77027713
}
77037714

77047715
private ElseClauseSyntax ParseElseClauseOpt()

0 commit comments

Comments
 (0)