Skip to content

Commit 387ef8f

Browse files
authored
Merge pull request #16155 from ahoppen/if-semi-keypath
[libSyntax] Parsing fixes for #if, trailing semicolon, key paths
2 parents d039cf2 + 94b8a35 commit 387ef8f

File tree

7 files changed

+305
-258
lines changed

7 files changed

+305
-258
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,8 @@ Parser::parseDecl(ParseDeclOptions Flags,
24542454

24552455
ParserStatus Status;
24562456
bool PreviousHadSemi = true;
2457+
SyntaxParsingContext DeclListCtx(SyntaxContext,
2458+
SyntaxKind::MemberDeclList);
24572459
while (Tok.isNot(tok::pound_else, tok::pound_endif, tok::pound_elseif,
24582460
tok::eof)) {
24592461
if (Tok.is(tok::r_brace)) {
@@ -3102,7 +3104,6 @@ void Parser::diagnoseConsecutiveIDs(StringRef First, SourceLoc FirstLoc,
31023104
ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
31033105
Parser::ParseDeclOptions Options,
31043106
llvm::function_ref<void(Decl*)> handler) {
3105-
SyntaxParsingContext DeclContext(SyntaxContext, SyntaxContextKind::Decl);
31063107
if (Tok.is(tok::semi)) {
31073108
// Consume ';' without preceding decl.
31083109
diagnose(Tok, diag::unexpected_separator, ";")
@@ -3127,7 +3128,10 @@ ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
31273128
return LineDirectiveStatus;
31283129
}
31293130

3130-
auto Result = parseDecl(Options, handler);
3131+
ParserResult<Decl> Result;
3132+
SyntaxParsingContext DeclContext(SyntaxContext,
3133+
SyntaxKind::MemberDeclListItem);
3134+
Result = parseDecl(Options, handler);
31313135
if (Result.isParseError())
31323136
skipUntilDeclRBrace(tok::semi, tok::pound_endif);
31333137
SourceLoc SemiLoc;
@@ -3148,7 +3152,7 @@ bool Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc,
31483152
ParserStatus Status;
31493153
bool PreviousHadSemi = true;
31503154
{
3151-
SyntaxParsingContext ListContext(SyntaxContext, SyntaxKind::DeclList);
3155+
SyntaxParsingContext ListContext(SyntaxContext, SyntaxKind::MemberDeclList);
31523156
while (Tok.isNot(tok::r_brace)) {
31533157
Status |= parseDeclItem(PreviousHadSemi, Options, handler);
31543158
if (Tok.isAny(tok::eof, tok::pound_endif, tok::pound_else,

lib/Parse/ParseExpr.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,6 @@ ParserResult<Expr> Parser::parseExprKeyPath() {
582582
// Consume '\'.
583583
SourceLoc backslashLoc = consumeToken(tok::backslash);
584584
llvm::SaveAndRestore<SourceLoc> slashLoc(SwiftKeyPathSlashLoc, backslashLoc);
585-
SyntaxParsingContext ExprCtx(SyntaxContext, SyntaxContextKind::Expr);
586585

587586
// FIXME: diagnostics
588587
ParserResult<Expr> rootResult, pathResult;
@@ -598,14 +597,19 @@ ParserResult<Expr> Parser::parseExprKeyPath() {
598597
if (startsWithSymbol(Tok, '.')) {
599598
llvm::SaveAndRestore<Expr*> S(SwiftKeyPathRoot, rootResult.getPtrOrNull());
600599

600+
SyntaxParsingContext ExprContext(SyntaxContext, SyntaxContextKind::Expr);
601+
601602
auto dotLoc = Tok.getLoc();
602603
// For uniformity, \.foo is parsed as if it were MAGIC.foo, so we need to
603604
// make sure the . is there, but parsing the ? in \.? as .? doesn't make
604605
// sense. This is all made more complicated by .?. being considered an
605606
// operator token, and a single one at that (which means
606607
// peekToken().is(tok::identifier) is incorrect: it is true for .?.foo).
607-
if (Tok.getLength() != 1 || !peekToken().is(tok::identifier))
608+
if (Tok.getLength() != 1 || !peekToken().is(tok::identifier)) {
609+
SyntaxParsingContext KeyPathBaseContext(SyntaxContext,
610+
SyntaxKind::KeyPathBaseExpr);
608611
consumeStartingCharacterOfCurrentToken(tok::period);
612+
}
609613

610614
auto inner = makeParserResult(new (Context) KeyPathDotExpr(dotLoc));
611615
bool unusedHasBindOptional = false;

test/Syntax/Inputs/serialize_multiple_decls.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"presence": "Present"
7272
},
7373
{
74-
"kind": "DeclList",
74+
"kind": "MemberDeclList",
7575
"layout": [],
7676
"presence": "Present"
7777
},
@@ -153,7 +153,7 @@
153153
"presence": "Present"
154154
},
155155
{
156-
"kind": "DeclList",
156+
"kind": "MemberDeclList",
157157
"layout": [],
158158
"presence": "Present"
159159
},

0 commit comments

Comments
 (0)