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