@@ -1654,9 +1654,9 @@ ParserResult<Expr> Parser::parseExprPrimary(Diag<> ID, bool isExprBasic) {
1654
1654
}
1655
1655
1656
1656
#define POUND_OBJECT_LITERAL (Name, Desc, Proto ) \
1657
- case tok::pound_##Name: \
1658
- return parseExprObjectLiteral (ObjectLiteralExpr::Name, isExprBasic);
1657
+ case tok::pound_##Name:
1659
1658
#include " swift/Syntax/TokenKinds.def"
1659
+ return parseExprObjectLiteral (isExprBasic);
1660
1660
1661
1661
case tok::code_complete: {
1662
1662
auto Result =
@@ -2772,8 +2772,11 @@ ParserResult<Expr> Parser::parseExprClosure() {
2772
2772
2773
2773
// Parse the closing '}'.
2774
2774
SourceLoc rightBrace;
2775
- parseMatchingToken (tok::r_brace, rightBrace, diag::expected_closure_rbrace,
2776
- leftBrace);
2775
+ if (parseMatchingToken (tok::r_brace, rightBrace,
2776
+ diag::expected_closure_rbrace, leftBrace)) {
2777
+ // Synthesize an r_brace syntax node if the token is absent
2778
+ SyntaxContext->synthesize (tok::r_brace, rightBrace);
2779
+ }
2777
2780
2778
2781
// If we didn't have any parameters, create a parameter list from the
2779
2782
// anonymous closure arguments.
@@ -3006,6 +3009,62 @@ ParserStatus Parser::parseExprTupleElementListSyntax(
3006
3009
// / expr-list(left, right):
3007
3010
// / left right expr-closure?
3008
3011
// / left expr-tuple-element-list right expr-closure?
3012
+ ParserStatus Parser::parseExprListSyntax (
3013
+ tok leftK, tok rightK, bool isPostfix, bool isExprBasic,
3014
+ llvm::function_ref<void (
3015
+ ParsedTokenSyntax &&, ParsedTupleExprElementListSyntax &&,
3016
+ Optional<ParsedTokenSyntax> &&, Optional<ParsedClosureExprSyntax> &&)>
3017
+ callback) {
3018
+ StructureMarkerRAII ParsingExprList (*this , Tok);
3019
+ if (ParsingExprList.isFailed ())
3020
+ return makeParserError ();
3021
+
3022
+ ParserStatus status;
3023
+
3024
+ auto TokIsStringInterpolationEOF = [&]() -> bool {
3025
+ return Tok.is (tok::eof) && Tok.getText () == " )" && rightK == tok::r_paren;
3026
+ };
3027
+
3028
+ // Parse '(' or '['.
3029
+ auto leftLoc = Tok.getLoc ();
3030
+ auto leftTok = consumeTokenSyntax (tok::l_paren);
3031
+
3032
+ // Parse the elements.
3033
+ SmallVector<ParsedTupleExprElementSyntax, 4 > elements;
3034
+ status |= parseExprTupleElementListSyntax (elements, [&] {
3035
+ return Tok.is (rightK) || TokIsStringInterpolationEOF ();
3036
+ });
3037
+ auto list =
3038
+ ParsedSyntaxRecorder::makeTupleExprElementList (elements, *SyntaxContext);
3039
+
3040
+ if (TokIsStringInterpolationEOF ()) {
3041
+ callback (std::move (leftTok), std::move (list), None, None);
3042
+ return status;
3043
+ }
3044
+
3045
+ // Parse ')' or ']'.
3046
+ auto rightTok =
3047
+ parseMatchingTokenSyntax (rightK, rightK == tok::r_paren
3048
+ ? diag::expected_rparen_expr_list
3049
+ : diag::expected_rsquare_expr_list,
3050
+ leftLoc, /* silenceDiag=*/ status.isError ());
3051
+ status |= rightTok.getStatus ();
3052
+ auto rightLoc = PreviousLoc;
3053
+
3054
+ // If we aren't interested in trailing closures, or there isn't a valid one,
3055
+ // we're done.
3056
+ if (rightTok.isNull () || !isPostfix || Tok.isNot (tok::l_brace) ||
3057
+ !isValidTrailingClosure (isExprBasic, *this )) {
3058
+ callback (std::move (leftTok), std::move (list), rightTok.getOrNull (), None);
3059
+ return status;
3060
+ }
3061
+
3062
+ auto closure = parseTrailingClosureSyntax ({leftLoc, rightLoc});
3063
+ status |= closure.getStatus ();
3064
+ callback (std::move (leftTok), std::move (list), rightTok.getOrNull (), closure.getOrNull ());
3065
+ return status;
3066
+ }
3067
+
3009
3068
ParserStatus Parser::parseExprList (tok leftTok, tok rightTok,
3010
3069
bool isPostfix,
3011
3070
bool isExprBasic,
@@ -3112,45 +3171,63 @@ ParserResult<Expr> Parser::parseTrailingClosure(SourceRange calleeRange) {
3112
3171
3113
3172
return closure;
3114
3173
}
3174
+
3175
+ ParsedSyntaxResult<ParsedClosureExprSyntax>
3176
+ Parser::parseTrailingClosureSyntax (SourceRange calleeRange) {
3177
+ SyntaxParsingContext TmpContext (SyntaxContext);
3178
+ TmpContext.setTransparent ();
3179
+
3180
+ SourceLoc ExprLoc = Tok.getLoc ();
3181
+ ParserResult<Expr> Result = parseTrailingClosure (calleeRange);
3182
+ if (auto ParsedExpr = TmpContext.popIf <ParsedClosureExprSyntax>()) {
3183
+ Generator.addExpr (Result.getPtrOrNull (), ExprLoc);
3184
+ return makeParsedResult (std::move (*ParsedExpr), Result.getStatus ());
3185
+ }
3186
+ return Result.getStatus ();
3187
+ }
3115
3188
3116
3189
// / Parse an object literal expression.
3117
3190
// /
3118
3191
// / expr-literal:
3119
3192
// / '#' identifier expr-paren
3120
- ParserResult<Expr >
3121
- Parser::parseExprObjectLiteral (ObjectLiteralExpr::LiteralKind LitKind,
3122
- bool isExprBasic) {
3123
- SyntaxParsingContext ObjectLiteralContext (SyntaxContext,
3124
- SyntaxKind::ObjectLiteralExpr);
3125
- SourceLoc PoundLoc = consumeToken ( );
3126
- // Parse a tuple of args
3193
+ ParsedSyntaxResult<ParsedExprSyntax >
3194
+ Parser::parseExprObjectLiteralSyntax ( bool isExprBasic) {
3195
+ ParsedObjectLiteralExprSyntaxBuilder builder (*SyntaxContext);
3196
+ ParserStatus status;
3197
+
3198
+ builder. useIdentifier ( consumeTokenSyntax () );
3199
+
3127
3200
if (!Tok.is (tok::l_paren)) {
3128
3201
diagnose (Tok, diag::expected_arg_list_in_object_literal);
3129
- return makeParserError ();
3130
- }
3131
-
3132
- // Parse the argument list.
3133
- SourceLoc lParenLoc, rParenLoc;
3134
- SmallVector<Expr *, 2 > args;
3135
- SmallVector<Identifier, 2 > argLabels;
3136
- SmallVector<SourceLoc, 2 > argLabelLocs;
3137
- Expr *trailingClosure;
3202
+ return makeParsedError (builder.build ());
3203
+ }
3204
+
3205
+ status |= parseExprListSyntax (
3206
+ tok::l_paren, tok::r_paren,
3207
+ /* isPostfix=*/ true , isExprBasic,
3208
+ [&](ParsedTokenSyntax &&leftTok, ParsedTupleExprElementListSyntax &&args,
3209
+ Optional<ParsedTokenSyntax> &&rightTok,
3210
+ Optional<ParsedClosureExprSyntax> &&closure) {
3211
+ builder.useLeftParen (std::move (leftTok));
3212
+ builder.useArguments (std::move (args));
3213
+ if (rightTok)
3214
+ builder.useRightParen (std::move (*rightTok));
3215
+ if (closure)
3216
+ builder.useTrailingClosure (std::move (*closure));
3217
+ });
3218
+ return makeParsedResult (builder.build (), status);
3219
+ }
3138
3220
3139
- ParserStatus status = parseExprList (tok::l_paren, tok::r_paren,
3140
- /* isPostfix=*/ true , isExprBasic,
3141
- lParenLoc, args, argLabels,
3142
- argLabelLocs,
3143
- rParenLoc,
3144
- trailingClosure);
3145
- if (status.hasCodeCompletion ())
3146
- return makeParserCodeCompletionResult<Expr>();
3147
- if (status.isError ())
3148
- return makeParserError ();
3221
+ ParserResult<Expr>
3222
+ Parser::parseExprObjectLiteral (bool isExprBasic) {
3223
+ auto leadingLoc = leadingTriviaLoc ();
3224
+ auto parsed = parseExprObjectLiteralSyntax (isExprBasic);
3225
+ assert (!parsed.isNull ());
3226
+ SyntaxContext->addSyntax (parsed.get ());
3149
3227
3150
- return makeParserResult (
3151
- ObjectLiteralExpr::create (Context, PoundLoc, LitKind, lParenLoc, args,
3152
- argLabels, argLabelLocs, rParenLoc,
3153
- trailingClosure, /* implicit=*/ false ));
3228
+ auto syntax = SyntaxContext->topNode <ExprSyntax>();
3229
+ return makeParserResult (parsed.getStatus (),
3230
+ Generator.generate (syntax, leadingLoc));
3154
3231
}
3155
3232
3156
3233
// / Parse and diagnose unknown pound expression
0 commit comments