Skip to content

Commit d985ee9

Browse files
committed
[Parse] Cleanup libSyntax type parsing
Using Parsed*SyntaxBuilder interface and SyntaxParserResult was unnecessarily complicated. Use SyntaxParsingContext based node creation. No behavior change.
1 parent 147015d commit d985ee9

File tree

4 files changed

+23
-197
lines changed

4 files changed

+23
-197
lines changed

include/swift/Parse/Parser.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#include "swift/Parse/Token.h"
3333
#include "swift/Parse/ParserPosition.h"
3434
#include "swift/Parse/ParserResult.h"
35-
#include "swift/Parse/SyntaxParserResult.h"
3635
#include "swift/Parse/SyntaxParsingContext.h"
3736
#include "swift/Syntax/References.h"
3837
#include "swift/Config.h"
@@ -1219,13 +1218,11 @@ class Parser {
12191218
/// type-simple:
12201219
/// '[' type ']'
12211220
/// '[' type ':' type ']'
1222-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr> parseTypeCollection();
1221+
ParserResult<TypeRepr> parseTypeCollection();
12231222

1224-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1225-
parseTypeOptional(TypeRepr *Base);
1223+
ParserResult<TypeRepr> parseTypeOptional(TypeRepr *Base);
12261224

1227-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1228-
parseTypeImplicitlyUnwrappedOptional(TypeRepr *Base);
1225+
ParserResult<TypeRepr> parseTypeImplicitlyUnwrappedOptional(TypeRepr *Base);
12291226

12301227
bool isOptionalToken(const Token &T) const;
12311228
SourceLoc consumeOptionalToken();

include/swift/Parse/SyntaxParserResult.h

Lines changed: 0 additions & 106 deletions
This file was deleted.

lib/Parse/ParseType.cpp

Lines changed: 16 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,7 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
182182
return makeParserCodeCompletionResult<TypeRepr>(
183183
new (Context) ErrorTypeRepr(consumeToken(tok::code_complete)));
184184
case tok::l_square: {
185-
auto Result = parseTypeCollection();
186-
if (Result.hasSyntax())
187-
SyntaxContext->addSyntax(Result.getSyntax());
188-
ty = Result.getASTResult();
185+
ty = parseTypeCollection();
189186
break;
190187
}
191188
case tok::kw_protocol:
@@ -211,20 +208,6 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
211208
return nullptr;
212209
}
213210

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-
228211
// '.Type', '.Protocol', '?', '!', and '[]' still leave us with type-simple.
229212
while (ty.isNonNull()) {
230213
if ((Tok.is(tok::period) || Tok.is(tok::period_prefix))) {
@@ -233,32 +216,26 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID,
233216
SourceLoc metatypeLoc = consumeToken(tok::identifier);
234217
ty = makeParserResult(ty,
235218
new (Context) MetatypeTypeRepr(ty.get(), metatypeLoc));
236-
makeMetatypeTypeSyntax();
219+
SyntaxContext->createNodeInPlace(SyntaxKind::MetatypeType);
237220
continue;
238221
}
239222
if (peekToken().isContextualKeyword("Protocol")) {
240223
consumeToken();
241224
SourceLoc protocolLoc = consumeToken(tok::identifier);
242225
ty = makeParserResult(ty,
243226
new (Context) ProtocolTypeRepr(ty.get(), protocolLoc));
244-
makeMetatypeTypeSyntax();
227+
SyntaxContext->createNodeInPlace(SyntaxKind::MetatypeType);
245228
continue;
246229
}
247230
}
248231

249232
if (!Tok.isAtStartOfLine()) {
250233
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());
255235
continue;
256236
}
257237
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());
262239
continue;
263240
}
264241
// Parse legacy array types for migration.
@@ -1291,7 +1268,8 @@ ParserResult<TypeRepr> Parser::parseTypeArray(TypeRepr *Base) {
12911268
return makeParserResult(ATR);
12921269
}
12931270

1294-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection() {
1271+
ParserResult<TypeRepr> Parser::parseTypeCollection() {
1272+
SyntaxParsingContext CollectionCtx(SyntaxContext, SyntaxContextKind::Type);
12951273
ParserStatus Status;
12961274
// Parse the leading '['.
12971275
assert(Tok.is(tok::l_square));
@@ -1337,38 +1315,14 @@ SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection() {
13371315
// Form the dictionary type.
13381316
TyR = new (Context)
13391317
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);
13551319
} else {
13561320
// Form the array type.
13571321
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);
13691323
}
13701324

1371-
return makeSyntaxResult(Status, std::move(SyntaxNode), TyR);
1325+
return makeParserResult(Status, TyR);
13721326
}
13731327

13741328
bool Parser::isOptionalToken(const Token &T) const {
@@ -1413,45 +1367,23 @@ SourceLoc Parser::consumeImplicitlyUnwrappedOptionalToken() {
14131367

14141368
/// Parse a single optional suffix, given that we are looking at the
14151369
/// question mark.
1416-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1370+
ParserResult<TypeRepr>
14171371
Parser::parseTypeOptional(TypeRepr *base) {
14181372
SourceLoc questionLoc = consumeOptionalToken();
14191373
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);
14351376
}
14361377

14371378
/// Parse a single implicitly unwrapped optional suffix, given that we
14381379
/// are looking at the exclamation mark.
1439-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1380+
ParserResult<TypeRepr>
14401381
Parser::parseTypeImplicitlyUnwrappedOptional(TypeRepr *base) {
14411382
SourceLoc exclamationLoc = consumeImplicitlyUnwrappedOptionalToken();
14421383
auto TyR =
14431384
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);
14551387
}
14561388

14571389
//===----------------------------------------------------------------------===//

lib/Parse/SyntaxParsingContext.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,10 @@ void SyntaxParsingContext::createNodeInPlace(SyntaxKind Kind,
251251
case SyntaxKind::ForcedValueExpr:
252252
case SyntaxKind::PostfixUnaryExpr:
253253
case SyntaxKind::TernaryExpr:
254-
case SyntaxKind::AvailabilityLabeledArgument: {
254+
case SyntaxKind::AvailabilityLabeledArgument:
255+
case SyntaxKind::MetatypeType:
256+
case SyntaxKind::OptionalType:
257+
case SyntaxKind::ImplicitlyUnwrappedOptionalType: {
255258
auto Pair = SyntaxFactory::countChildren(Kind);
256259
assert(Pair.first == Pair.second);
257260
createNodeInPlace(Kind, Pair.first, nodeCreateK);

0 commit comments

Comments
 (0)