@@ -182,10 +182,7 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
182
182
return makeParserCodeCompletionResult<TypeRepr>(
183
183
new (Context) ErrorTypeRepr (consumeToken (tok::code_complete)));
184
184
case tok::l_square: {
185
- auto Result = parseTypeCollection ();
186
- if (Result.hasSyntax ())
187
- SyntaxContext->addSyntax (Result.getSyntax ());
188
- ty = Result.getASTResult ();
185
+ ty = parseTypeCollection ();
189
186
break ;
190
187
}
191
188
case tok::kw_protocol:
@@ -211,20 +208,6 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
211
208
return nullptr ;
212
209
}
213
210
214
- auto makeMetatypeTypeSyntax = [&]() {
215
- if (!SyntaxContext->isEnabled ())
216
- return ;
217
- ParsedMetatypeTypeSyntaxBuilder Builder (*SyntaxContext);
218
- auto TypeOrProtocol = SyntaxContext->popToken ();
219
- auto Period = SyntaxContext->popToken ();
220
- auto BaseType (std::move (*SyntaxContext->popIf <ParsedTypeSyntax>()));
221
- Builder
222
- .useTypeOrProtocol (std::move (TypeOrProtocol))
223
- .usePeriod (std::move (Period))
224
- .useBaseType (std::move (BaseType));
225
- SyntaxContext->addSyntax (Builder.build ());
226
- };
227
-
228
211
// '.Type', '.Protocol', '?', '!', and '[]' still leave us with type-simple.
229
212
while (ty.isNonNull ()) {
230
213
if ((Tok.is (tok::period) || Tok.is (tok::period_prefix))) {
@@ -233,32 +216,26 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
233
216
SourceLoc metatypeLoc = consumeToken (tok::identifier);
234
217
ty = makeParserResult (ty,
235
218
new (Context) MetatypeTypeRepr (ty.get (), metatypeLoc));
236
- makeMetatypeTypeSyntax ( );
219
+ SyntaxContext-> createNodeInPlace (SyntaxKind::MetatypeType );
237
220
continue ;
238
221
}
239
222
if (peekToken ().isContextualKeyword (" Protocol" )) {
240
223
consumeToken ();
241
224
SourceLoc protocolLoc = consumeToken (tok::identifier);
242
225
ty = makeParserResult (ty,
243
226
new (Context) ProtocolTypeRepr (ty.get (), protocolLoc));
244
- makeMetatypeTypeSyntax ( );
227
+ SyntaxContext-> createNodeInPlace (SyntaxKind::MetatypeType );
245
228
continue ;
246
229
}
247
230
}
248
231
249
232
if (!Tok.isAtStartOfLine ()) {
250
233
if (isOptionalToken (Tok)) {
251
- auto Result = parseTypeOptional (ty.get ());
252
- if (Result.hasSyntax ())
253
- SyntaxContext->addSyntax (Result.getSyntax ());
254
- ty = Result.getASTResult ();
234
+ ty = parseTypeOptional (ty.get ());
255
235
continue ;
256
236
}
257
237
if (isImplicitlyUnwrappedOptionalToken (Tok)) {
258
- auto Result = parseTypeImplicitlyUnwrappedOptional (ty.get ());
259
- if (Result.hasSyntax ())
260
- SyntaxContext->addSyntax (Result.getSyntax ());
261
- ty = Result.getASTResult ();
238
+ ty = parseTypeImplicitlyUnwrappedOptional (ty.get ());
262
239
continue ;
263
240
}
264
241
// Parse legacy array types for migration.
@@ -1291,7 +1268,8 @@ ParserResult<TypeRepr> Parser::parseTypeArray(TypeRepr *Base) {
1291
1268
return makeParserResult (ATR);
1292
1269
}
1293
1270
1294
- SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection () {
1271
+ ParserResult<TypeRepr> Parser::parseTypeCollection () {
1272
+ SyntaxParsingContext CollectionCtx (SyntaxContext, SyntaxContextKind::Type);
1295
1273
ParserStatus Status;
1296
1274
// Parse the leading '['.
1297
1275
assert (Tok.is (tok::l_square));
@@ -1337,38 +1315,14 @@ SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection() {
1337
1315
// Form the dictionary type.
1338
1316
TyR = new (Context)
1339
1317
DictionaryTypeRepr (firstTy.get (), secondTy.get (), colonLoc, brackets);
1340
- if (SyntaxContext->isEnabled ()) {
1341
- ParsedDictionaryTypeSyntaxBuilder Builder (*SyntaxContext);
1342
- auto RightSquareBracket = SyntaxContext->popToken ();
1343
- auto ValueType (std::move (*SyntaxContext->popIf <ParsedTypeSyntax>()));
1344
- auto Colon = SyntaxContext->popToken ();
1345
- auto KeyType (std::move (*SyntaxContext->popIf <ParsedTypeSyntax>()));
1346
- auto LeftSquareBracket = SyntaxContext->popToken ();
1347
- Builder
1348
- .useRightSquareBracket (std::move (RightSquareBracket))
1349
- .useValueType (std::move (ValueType))
1350
- .useColon (std::move (Colon))
1351
- .useKeyType (std::move (KeyType))
1352
- .useLeftSquareBracket (std::move (LeftSquareBracket));
1353
- SyntaxNode.emplace (Builder.build ());
1354
- }
1318
+ SyntaxContext->setCreateSyntax (SyntaxKind::DictionaryType);
1355
1319
} else {
1356
1320
// Form the array type.
1357
1321
TyR = new (Context) ArrayTypeRepr (firstTy.get (), brackets);
1358
- if (SyntaxContext->isEnabled ()) {
1359
- ParsedArrayTypeSyntaxBuilder Builder (*SyntaxContext);
1360
- auto RightSquareBracket = SyntaxContext->popToken ();
1361
- auto ElementType (std::move (*SyntaxContext->popIf <ParsedTypeSyntax>()));
1362
- auto LeftSquareBracket = SyntaxContext->popToken ();
1363
- Builder
1364
- .useRightSquareBracket (std::move (RightSquareBracket))
1365
- .useElementType (std::move (ElementType))
1366
- .useLeftSquareBracket (std::move (LeftSquareBracket));
1367
- SyntaxNode.emplace (Builder.build ());
1368
- }
1322
+ SyntaxContext->setCreateSyntax (SyntaxKind::ArrayType);
1369
1323
}
1370
1324
1371
- return makeSyntaxResult (Status, std::move (SyntaxNode) , TyR);
1325
+ return makeParserResult (Status, TyR);
1372
1326
}
1373
1327
1374
1328
bool Parser::isOptionalToken (const Token &T) const {
@@ -1413,45 +1367,23 @@ SourceLoc Parser::consumeImplicitlyUnwrappedOptionalToken() {
1413
1367
1414
1368
// / Parse a single optional suffix, given that we are looking at the
1415
1369
// / question mark.
1416
- SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1370
+ ParserResult< TypeRepr>
1417
1371
Parser::parseTypeOptional (TypeRepr *base) {
1418
1372
SourceLoc questionLoc = consumeOptionalToken ();
1419
1373
auto TyR = new (Context) OptionalTypeRepr (base, questionLoc);
1420
- llvm::Optional<ParsedTypeSyntax> SyntaxNode;
1421
- if (SyntaxContext->isEnabled ()) {
1422
- auto QuestionMark = SyntaxContext->popToken ();
1423
- if (auto WrappedType = SyntaxContext->popIf <ParsedTypeSyntax>()) {
1424
- ParsedOptionalTypeSyntaxBuilder Builder (*SyntaxContext);
1425
- Builder
1426
- .useQuestionMark (std::move (QuestionMark))
1427
- .useWrappedType (std::move (*WrappedType));
1428
- SyntaxNode.emplace (Builder.build ());
1429
- } else {
1430
- // Undo the popping of the question mark
1431
- SyntaxContext->addSyntax (std::move (QuestionMark));
1432
- }
1433
- }
1434
- return makeSyntaxResult (std::move (SyntaxNode), TyR);
1374
+ SyntaxContext->createNodeInPlace (SyntaxKind::OptionalType);
1375
+ return makeParserResult (TyR);
1435
1376
}
1436
1377
1437
1378
// / Parse a single implicitly unwrapped optional suffix, given that we
1438
1379
// / are looking at the exclamation mark.
1439
- SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1380
+ ParserResult< TypeRepr>
1440
1381
Parser::parseTypeImplicitlyUnwrappedOptional (TypeRepr *base) {
1441
1382
SourceLoc exclamationLoc = consumeImplicitlyUnwrappedOptionalToken ();
1442
1383
auto TyR =
1443
1384
new (Context) ImplicitlyUnwrappedOptionalTypeRepr (base, exclamationLoc);
1444
- llvm::Optional<ParsedTypeSyntax> SyntaxNode;
1445
- if (SyntaxContext->isEnabled ()) {
1446
- ParsedImplicitlyUnwrappedOptionalTypeSyntaxBuilder Builder (*SyntaxContext);
1447
- auto ExclamationMark = SyntaxContext->popToken ();
1448
- auto WrappedType (std::move (*SyntaxContext->popIf <ParsedTypeSyntax>()));
1449
- Builder
1450
- .useExclamationMark (std::move (ExclamationMark))
1451
- .useWrappedType (std::move (WrappedType));
1452
- SyntaxNode.emplace (Builder.build ());
1453
- }
1454
- return makeSyntaxResult (std::move (SyntaxNode), TyR);
1385
+ SyntaxContext->createNodeInPlace (SyntaxKind::ImplicitlyUnwrappedOptionalType);
1386
+ return makeParserResult (TyR);
1455
1387
}
1456
1388
1457
1389
// ===----------------------------------------------------------------------===//
0 commit comments