Skip to content

Commit 5ebb884

Browse files
authored
Merge pull request swiftlang#34530 from rintaro/parse-eliminate-syntaxresult
[Parse] Cleanup libSyntax type parsing
2 parents 34df17b + d985ee9 commit 5ebb884

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"
@@ -1216,13 +1215,11 @@ class Parser {
12161215
/// type-simple:
12171216
/// '[' type ']'
12181217
/// '[' type ':' type ']'
1219-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr> parseTypeCollection();
1218+
ParserResult<TypeRepr> parseTypeCollection();
12201219

1221-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1222-
parseTypeOptional(TypeRepr *Base);
1220+
ParserResult<TypeRepr> parseTypeOptional(TypeRepr *Base);
12231221

1224-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1225-
parseTypeImplicitlyUnwrappedOptional(TypeRepr *Base);
1222+
ParserResult<TypeRepr> parseTypeImplicitlyUnwrappedOptional(TypeRepr *Base);
12261223

12271224
bool isOptionalToken(const Token &T) const;
12281225
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
@@ -179,10 +179,7 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID) {
179179
return makeParserCodeCompletionResult<TypeRepr>(
180180
new (Context) ErrorTypeRepr(consumeToken(tok::code_complete)));
181181
case tok::l_square: {
182-
auto Result = parseTypeCollection();
183-
if (Result.hasSyntax())
184-
SyntaxContext->addSyntax(Result.getSyntax());
185-
ty = Result.getASTResult();
182+
ty = parseTypeCollection();
186183
break;
187184
}
188185
case tok::kw_protocol:
@@ -208,20 +205,6 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID) {
208205
return nullptr;
209206
}
210207

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-
225208
// '.Type', '.Protocol', '?', '!', and '[]' still leave us with type-simple.
226209
while (ty.isNonNull()) {
227210
if ((Tok.is(tok::period) || Tok.is(tok::period_prefix))) {
@@ -230,32 +213,26 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(Diag<> MessageID) {
230213
SourceLoc metatypeLoc = consumeToken(tok::identifier);
231214
ty = makeParserResult(ty,
232215
new (Context) MetatypeTypeRepr(ty.get(), metatypeLoc));
233-
makeMetatypeTypeSyntax();
216+
SyntaxContext->createNodeInPlace(SyntaxKind::MetatypeType);
234217
continue;
235218
}
236219
if (peekToken().isContextualKeyword("Protocol")) {
237220
consumeToken();
238221
SourceLoc protocolLoc = consumeToken(tok::identifier);
239222
ty = makeParserResult(ty,
240223
new (Context) ProtocolTypeRepr(ty.get(), protocolLoc));
241-
makeMetatypeTypeSyntax();
224+
SyntaxContext->createNodeInPlace(SyntaxKind::MetatypeType);
242225
continue;
243226
}
244227
}
245228

246229
if (!Tok.isAtStartOfLine()) {
247230
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());
252232
continue;
253233
}
254234
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());
259236
continue;
260237
}
261238
// Parse legacy array types for migration.
@@ -1284,7 +1261,8 @@ ParserResult<TypeRepr> Parser::parseTypeArray(TypeRepr *Base) {
12841261
return makeParserResult(ATR);
12851262
}
12861263

1287-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection() {
1264+
ParserResult<TypeRepr> Parser::parseTypeCollection() {
1265+
SyntaxParsingContext CollectionCtx(SyntaxContext, SyntaxContextKind::Type);
12881266
ParserStatus Status;
12891267
// Parse the leading '['.
12901268
assert(Tok.is(tok::l_square));
@@ -1330,38 +1308,14 @@ SyntaxParserResult<ParsedTypeSyntax, TypeRepr> Parser::parseTypeCollection() {
13301308
// Form the dictionary type.
13311309
TyR = new (Context)
13321310
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);
13481312
} else {
13491313
// Form the array type.
13501314
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);
13621316
}
13631317

1364-
return makeSyntaxResult(Status, std::move(SyntaxNode), TyR);
1318+
return makeParserResult(Status, TyR);
13651319
}
13661320

13671321
bool Parser::isOptionalToken(const Token &T) const {
@@ -1406,45 +1360,23 @@ SourceLoc Parser::consumeImplicitlyUnwrappedOptionalToken() {
14061360

14071361
/// Parse a single optional suffix, given that we are looking at the
14081362
/// question mark.
1409-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1363+
ParserResult<TypeRepr>
14101364
Parser::parseTypeOptional(TypeRepr *base) {
14111365
SourceLoc questionLoc = consumeOptionalToken();
14121366
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);
14281369
}
14291370

14301371
/// Parse a single implicitly unwrapped optional suffix, given that we
14311372
/// are looking at the exclamation mark.
1432-
SyntaxParserResult<ParsedTypeSyntax, TypeRepr>
1373+
ParserResult<TypeRepr>
14331374
Parser::parseTypeImplicitlyUnwrappedOptional(TypeRepr *base) {
14341375
SourceLoc exclamationLoc = consumeImplicitlyUnwrappedOptionalToken();
14351376
auto TyR =
14361377
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);
14481380
}
14491381

14501382
//===----------------------------------------------------------------------===//

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)