Skip to content

Commit fc5f31c

Browse files
committed
[Syntax] Decompose TupleType when it turns out to be a part of FunctionType
1 parent ef29650 commit fc5f31c

File tree

5 files changed

+36
-21
lines changed

5 files changed

+36
-21
lines changed

include/swift/Syntax/SyntaxBuilders.h.gyb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ class ${node.name}Builder {
3838

3939
public:
4040
% for child in node.children:
41+
${node.name}Builder &use${child.name}(${child.type_name} ${child.name});
4142
% child_node = NODE_MAP.get(child.syntax_kind)
4243
% if child_node and child_node.is_syntax_collection():
4344
% child_elt = child_node.collection_element_name
4445
% child_elt_type = child_node.collection_element_type
4546
${node.name}Builder &add${child_elt}(${child_elt_type} ${child_elt});
46-
% else:
47-
${node.name}Builder &use${child.name}(${child.type_name} ${child.name});
4847
% end
4948
% end
5049

lib/Parse/ParseType.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,8 @@ ParserResult<TypeRepr> Parser::parseType(Diag<> MessageID,
427427
diag::rethrowing_function_type : diag::throw_in_function_type;
428428
diagnose(Tok.getLoc(), DiagID)
429429
.fixItReplace(Tok.getLoc(), "throws");
430+
if (Tok.is(tok::kw_throw))
431+
Tok.setKind(tok::kw_throws);
430432
}
431433
throwsLoc = consumeToken();
432434
}
@@ -440,7 +442,27 @@ ParserResult<TypeRepr> Parser::parseType(Diag<> MessageID,
440442
return makeParserCodeCompletionResult<TypeRepr>();
441443
if (SecondHalf.isNull())
442444
return nullptr;
443-
SyntaxContext->setCreateSyntax(SyntaxKind::FunctionType);
445+
446+
if (SyntaxContext->isEnabled()) {
447+
FunctionTypeSyntaxBuilder Builder;
448+
Builder.useReturnType(SyntaxContext->popIf<TypeSyntax>().getValue());
449+
Builder.useArrow(SyntaxContext->popToken());
450+
if (throwsLoc.isValid())
451+
Builder.useThrowsOrRethrowsKeyword(SyntaxContext->popToken());
452+
453+
auto InputNode = SyntaxContext->popIf<TypeSyntax>().getValue();
454+
if (auto TupleTypeNode = InputNode.getAs<TupleTypeSyntax>()) {
455+
// Decompose TupleTypeSyntax and repack into FunctionType.
456+
Builder
457+
.useLeftParen(TupleTypeNode->getLeftParen())
458+
.useArguments(TupleTypeNode->getElements())
459+
.useRightParen(TupleTypeNode->getRightParen());
460+
} else {
461+
Builder
462+
.addTupleTypeElement(SyntaxFactory::makeTupleTypeElement(InputNode));
463+
}
464+
SyntaxContext->addSyntax(Builder.build());
465+
}
444466
tyR = new (Context) FunctionTypeRepr(generics, tyR, throwsLoc, arrowLoc,
445467
SecondHalf.get());
446468
} else if (generics) {
@@ -829,7 +851,7 @@ ParserResult<TypeRepr> Parser::parseOldStyleProtocolComposition() {
829851
/// identifier ':' type
830852
/// type
831853
ParserResult<TupleTypeRepr> Parser::parseTypeTupleBody() {
832-
SyntaxParsingContext TypeContext(SyntaxContext, SyntaxContextKind::Type);
854+
SyntaxParsingContext TypeContext(SyntaxContext, SyntaxKind::TupleType);
833855
Parser::StructureMarkerRAII ParsingTypeTuple(*this, Tok);
834856
SourceLoc RPLoc, LPLoc = consumeToken(tok::l_paren);
835857
SourceLoc EllipsisLoc;
@@ -990,11 +1012,6 @@ ParserResult<TupleTypeRepr> Parser::parseTypeTupleBody() {
9901012
}
9911013
}
9921014

993-
if (isFunctionType)
994-
SyntaxContext->setTransparent();
995-
else
996-
SyntaxContext->setCreateSyntax(SyntaxKind::TupleType);
997-
9981015
return makeParserResult(Status,
9991016
TupleTypeRepr::create(Context, ElementsR,
10001017
SourceRange(LPLoc, RPLoc),

lib/Syntax/SyntaxBuilders.cpp.gyb

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ using namespace swift::syntax;
2828
% for node in SYNTAX_NODES:
2929
% if node.is_buildable():
3030
% for child in node.children:
31+
${node.name}Builder &
32+
${node.name}Builder::use${child.name}(${child.type_name} ${child.name}) {
33+
Layout[cursorIndex(${node.name}::Cursor::${child.name})] =
34+
${child.name}.getRaw();
35+
return *this;
36+
}
3137
% child_node = NODE_MAP.get(child.syntax_kind)
3238
% if child_node and child_node.is_syntax_collection():
3339
% child_elt = child_node.collection_element_name
@@ -38,13 +44,6 @@ ${node.name}Builder::add${child_elt}(${child_elt_type} ${child_elt}) {
3844
raw = raw->append(${child_elt}.getRaw());
3945
return *this;
4046
}
41-
% else:
42-
${node.name}Builder &
43-
${node.name}Builder::use${child.name}(${child.type_name} ${child.name}) {
44-
Layout[cursorIndex(${node.name}::Cursor::${child.name})] =
45-
${child.name}.getRaw();
46-
return *this;
47-
}
4847
% end
4948
% end
5049
${node.name}
@@ -55,4 +54,4 @@ ${node.name}Builder::build() {
5554
}
5655

5756
% end
58-
% end
57+
% end

test/Syntax/Outputs/round_trip_parse_gen.swift.withkinds

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ typealias C = <ArrayType>[<SimpleTypeIdentifier>Int</SimpleTypeIdentifier>]</Arr
6565
typealias D = <DictionaryType>[<SimpleTypeIdentifier>Int</SimpleTypeIdentifier>: <SimpleTypeIdentifier>String</SimpleTypeIdentifier>]</DictionaryType>
6666
typealias E = <MetatypeType><OptionalType><SimpleTypeIdentifier>Int</SimpleTypeIdentifier>?</OptionalType>.Protocol</MetatypeType>
6767
typealias F = <MetatypeType><ImplicitlyUnwrappedOptionalType><ArrayType>[<SimpleTypeIdentifier>Int</SimpleTypeIdentifier>]</ArrayType>!</ImplicitlyUnwrappedOptionalType>.Type</MetatypeType>
68-
typealias G = <FunctionType>(<TupleTypeElement>a x: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement>_ y: <SimpleTypeIdentifier>Int </SimpleTypeIdentifier>... <Initializer>= <IntegerLiteralExpr>1</IntegerLiteralExpr></Initializer></TupleTypeElement>) -> <FunctionType>() -> <TupleType>()</TupleType></FunctionType></FunctionType>
69-
typealias H = <TupleType>()</TupleType><StructDecl>
68+
typealias G = <FunctionType>(<TupleTypeElement>a x: <SimpleTypeIdentifier>Int</SimpleTypeIdentifier>, </TupleTypeElement><TupleTypeElement>_ y: <SimpleTypeIdentifier>Int </SimpleTypeIdentifier>... <Initializer>= <IntegerLiteralExpr>1</IntegerLiteralExpr></Initializer></TupleTypeElement>) throw -> <FunctionType>() -> <TupleType>()</TupleType></FunctionType></FunctionType>
69+
typealias H = <FunctionType>() rethrows -> <TupleType>()</TupleType></FunctionType><StructDecl>
7070

7171
struct foo <MemberDeclBlock>{<StructDecl>
7272
struct foo <MemberDeclBlock>{<StructDecl>

test/Syntax/round_trip_parse_gen.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ typealias C = [Int]
6565
typealias D = [Int: String]
6666
typealias E = Int?.Protocol
6767
typealias F = [Int]!.Type
68-
typealias G = (a x: Int, _ y: Int ... = 1) -> () -> ()
69-
typealias H = ()
68+
typealias G = (a x: Int, _ y: Int ... = 1) throw -> () -> ()
69+
typealias H = () rethrows -> ()
7070

7171
struct foo {
7272
struct foo {

0 commit comments

Comments
 (0)