Skip to content

Commit 3df45b0

Browse files
committed
Parse Pack Expansions
1 parent f70bbf5 commit 3df45b0

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

Sources/SwiftParser/Types.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ extension Parser {
3333
/// type → '(' type ')'
3434
@_spi(RawSyntax)
3535
public mutating func parseType() -> RawTypeSyntax {
36+
let type = self.parseTypeScalar()
37+
38+
// Parse pack expansion 'T...'.
39+
if self.currentToken.isEllipsis {
40+
let ellipsis = self.consumeAnyToken(remapping: .ellipsis)
41+
return RawTypeSyntax(
42+
RawPackExpansionTypeSyntax(
43+
patternType: type,
44+
ellipsis: ellipsis,
45+
arena: self.arena))
46+
}
47+
return type
48+
}
49+
50+
mutating func parseTypeScalar() -> RawTypeSyntax {
3651
let (specifier, attrList) = self.parseTypeAttributeList()
3752
var base = RawTypeSyntax(self.parseSimpleOrCompositionType())
3853
if self.lookahead().isAtFunctionTypeArrow() {

Tests/SwiftParserTest/Types.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,5 +156,27 @@ final class TypeTests: XCTestCase {
156156
}
157157
""")
158158
}
159+
160+
func testPackExpansion() throws {
161+
AssertParse(
162+
"""
163+
func f1<@_typeSequence T>() -> T... {}
164+
func f2<@_typeSequence T>() -> (T...) {}
165+
func f3<@_typeSequence T>() -> G<T... > {}
166+
""")
167+
168+
AssertParse(
169+
"""
170+
enum E<@_typeSequence T> {
171+
case f1(_: T...)
172+
case f2(_: G<T... >)
173+
var x: T... { fatalError() }
174+
var x: (T...) { fatalError() }
175+
subscript(_: T...) -> Int { fatalError() }
176+
subscript() -> T... { fatalError() }
177+
subscript() -> (T...) { fatalError() }
178+
}
179+
""")
180+
}
159181
}
160182

0 commit comments

Comments
 (0)