Skip to content

Commit 8e42331

Browse files
authored
Merge pull request #802 from CodaFi/reacher-grabbar
Relax Designated Type Parsing; Parse Pack Expansions
2 parents e929c52 + 3df45b0 commit 8e42331

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,10 +1907,11 @@ extension Parser {
19071907
let (unexpectedBeforeIdentifier, identifier) = self.expectIdentifier()
19081908
var types = [RawDesignatedTypeElementSyntax]()
19091909
while let comma = self.consume(if: .comma) {
1910-
let (unexpectedBeforeDesignatedType, designatedType) = self.expectIdentifier()
1910+
// FIXME: The compiler accepts... anything here. This is a bug.
1911+
// let (unexpectedBeforeDesignatedType, designatedType) = self.expectIdentifier()
1912+
let designatedType = self.consumeAnyToken()
19111913
types.append(RawDesignatedTypeElementSyntax(
19121914
leadingComma: comma,
1913-
unexpectedBeforeDesignatedType,
19141915
name: designatedType,
19151916
arena: self.arena))
19161917
}

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/Declarations.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ final class DeclarationTests: XCTestCase {
357357

358358
AssertParse(
359359
"""
360+
infix operator <*<<< : MediumPrecedence, &
360361
prefix operator ^^ : PrefixMagicOperatorProtocol
361362
infix operator <*< : MediumPrecedence, InfixMagicOperatorProtocol
362363
postfix operator ^^ : PostfixMagicOperatorProtocol

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)