Skip to content

Commit 66bcc00

Browse files
authored
[Parse] getLineNumber before parsing the closure (#15178)
Previously, if the closure has nested trailing closure, it slows down because of cache in SourceMgr.
1 parent 1feaec3 commit 66bcc00

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

lib/Parse/ParseExpr.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3089,6 +3089,12 @@ ParserStatus Parser::parseExprList(tok leftTok, tok rightTok,
30893089
ParserResult<Expr> Parser::parseTrailingClosure(SourceRange calleeRange) {
30903090
SourceLoc braceLoc = Tok.getLoc();
30913091

3092+
// Record the line numbers for the diagnostics below.
3093+
// Note that *do not* move this to after 'parseExprClosure()' it slows down
3094+
// 'getLineNumber()' call because of cache in SourceMgr.
3095+
auto origLine = SourceMgr.getLineNumber(calleeRange.End);
3096+
auto braceLine = SourceMgr.getLineNumber(braceLoc);
3097+
30923098
// Parse the closure.
30933099
ParserResult<Expr> closure = parseExprClosure();
30943100
if (closure.isNull())
@@ -3097,8 +3103,6 @@ ParserResult<Expr> Parser::parseTrailingClosure(SourceRange calleeRange) {
30973103
// Warn if the trailing closure is separated from its callee by more than
30983104
// one line. A single-line separation is acceptable for a trailing closure
30993105
// call, and will be diagnosed later only if the call fails to typecheck.
3100-
auto origLine = SourceMgr.getLineNumber(calleeRange.End);
3101-
auto braceLine = SourceMgr.getLineNumber(braceLoc);
31023106
if (braceLine > origLine + 1) {
31033107
diagnose(braceLoc, diag::trailing_closure_after_newlines);
31043108
diagnose(calleeRange.Start, diag::trailing_closure_callee_here);

0 commit comments

Comments
 (0)