Skip to content

Commit 492b4f2

Browse files
committed
Use at(prefix:) when consuming generic arguments
1 parent 7d6cbf2 commit 492b4f2

File tree

3 files changed

+73
-15
lines changed

3 files changed

+73
-15
lines changed

Sources/SwiftParser/Names.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ extension Parser {
193193

194194
let (unexpectedBeforeName, name) = self.expect(anyIn: IdentifierTypeSyntax.NameOptions.self, default: .identifier)
195195
let generics: RawGenericArgumentClauseSyntax?
196-
if self.atContextualPunctuator("<") {
196+
if self.at(prefix: "<") {
197197
generics = self.parseGenericArguments()
198198
} else {
199199
generics = nil
@@ -229,7 +229,7 @@ extension Parser {
229229
default: .identifier
230230
)
231231
let generics: RawGenericArgumentClauseSyntax?
232-
if self.atContextualPunctuator("<") {
232+
if self.at(prefix: "<") {
233233
generics = self.parseGenericArguments()
234234
} else {
235235
generics = nil

Sources/SwiftParser/Types.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ extension Parser {
295295
name = missingToken(.identifier)
296296
}
297297
let generics: RawGenericArgumentClauseSyntax?
298-
if self.atContextualPunctuator("<") {
298+
if self.at(prefix: "<") {
299299
generics = self.parseGenericArguments()
300300
} else {
301301
generics = nil
@@ -702,15 +702,6 @@ extension Parser.Lookahead {
702702
fallthrough
703703
}
704704

705-
// '-123' for value generics.
706-
if self.currentToken.tokenText == "-",
707-
self.peek(isAt: .integerLiteral)
708-
{
709-
self.consumeAnyToken()
710-
self.consumeAnyToken()
711-
return true
712-
}
713-
714705
return false
715706
case TokenSpec(.Self), TokenSpec(.identifier):
716707
guard self.canParseTypeIdentifier() else {
@@ -861,7 +852,7 @@ extension Parser.Lookahead {
861852
}
862853

863854
mutating func canParseAsGenericArgumentList() -> Bool {
864-
guard self.atContextualPunctuator("<") else {
855+
guard self.at(prefix: "<") else {
865856
return false
866857
}
867858

@@ -881,9 +872,21 @@ extension Parser.Lookahead {
881872
if !self.at(prefix: ">") {
882873
var loopProgress = LoopProgressCondition()
883874
repeat {
884-
guard self.canParseType() else {
885-
return false
875+
// A generic argument can either be a type or an integer literal (who is
876+
// optionally negative).
877+
if self.canParseType() {
878+
continue
879+
} else if self.currentToken.tokenText == "-",
880+
self.peek(isAt: .integerLiteral)
881+
{
882+
self.consumeAnyToken()
883+
self.consumeAnyToken()
884+
continue
885+
} else if self.consume(if: .integerLiteral) != nil {
886+
continue
886887
}
888+
889+
return false
887890
// Parse the comma, if the list continues.
888891
} while self.consume(if: .comma) != nil && self.hasProgressed(&loopProgress)
889892
}

Tests/SwiftParserTest/ValueGenericsTests.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,49 @@ final class ValueGenericsTests: ParserTestCase {
139139
""",
140140
experimentalFeatures: .valueGenerics
141141
)
142+
143+
assertParse(
144+
"""
145+
let x = Generic<123>.self
146+
""",
147+
experimentalFeatures: .valueGenerics
148+
)
149+
150+
assertParse(
151+
"""
152+
let x = Generic<-123>.self
153+
""",
154+
experimentalFeatures: .valueGenerics
155+
)
156+
157+
assertParse(
158+
"""
159+
let x = Generic<123, Int>.self
160+
""",
161+
experimentalFeatures: .valueGenerics
162+
)
163+
164+
assertParse(
165+
"""
166+
let x = Generic<-123, Int>.self
167+
""",
168+
experimentalFeatures: .valueGenerics
169+
)
170+
171+
assertParse(
172+
"""
173+
let x = Generic<Int, 123>.self
174+
""",
175+
experimentalFeatures: .valueGenerics
176+
)
142177

178+
assertParse(
179+
"""
180+
let x: Generic<Int, -123>.self
181+
""",
182+
experimentalFeatures: .valueGenerics
183+
)
184+
143185
assertParse(
144186
"""
145187
typealias One = 1️⃣1
@@ -251,5 +293,18 @@ final class ValueGenericsTests: ParserTestCase {
251293
],
252294
experimentalFeatures: .valueGenerics
253295
)
296+
297+
assertParse(
298+
"func foo() -> (1️⃣-1) X",
299+
diagnostics: [
300+
DiagnosticSpec(
301+
message: "expected type in tuple type",
302+
fixIts: ["insert type"]
303+
),
304+
DiagnosticSpec(message: "unexpected code '-1' in tuple type"),
305+
],
306+
fixedSource: "func foo() -> (<#type#>-1) X",
307+
experimentalFeatures: [.valueGenerics]
308+
)
254309
}
255310
}

0 commit comments

Comments
 (0)