Skip to content

Commit f37a23a

Browse files
committed
[Performance] Minimize RawTokenKindSubset.allCases usage
'allCases' is not trivial because it creates an Array. We should avoid creating temporary array if possible.
1 parent 3b3f372 commit f37a23a

File tree

11 files changed

+342
-91
lines changed

11 files changed

+342
-91
lines changed

Sources/SwiftParser/Attributes.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,15 @@ extension Parser {
311311
case integerLiteral
312312
case selfKeyword
313313

314+
init?(lexeme: Lexer.Lexeme) {
315+
switch lexeme.tokenKind {
316+
case .identifier: self = .identifier
317+
case .integerLiteral: self = .integerLiteral
318+
case .selfKeyword: self = .selfKeyword
319+
default: return nil
320+
}
321+
}
322+
314323
var rawTokenKind: RawTokenKind {
315324
switch self {
316325
case .identifier: return .identifier

Sources/SwiftParser/Declarations.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -393,10 +393,14 @@ extension Parser {
393393
case postfixOperator
394394
case prefixOperator
395395

396-
func accepts(lexeme: Lexer.Lexeme) -> Bool {
397-
switch self {
398-
case .colon: return true
399-
default: return lexeme.tokenText == "=="
396+
init?(lexeme: Lexer.Lexeme) {
397+
switch (lexeme.tokenKind, lexeme.tokenText) {
398+
case (.colon, _): self = .colon
399+
case (.spacedBinaryOperator, "=="): self = .spacedBinaryOperator
400+
case (.unspacedBinaryOperator, "=="): self = .unspacedBinaryOperator
401+
case (.postfixOperator, "=="): self = .postfixOperator
402+
case (.prefixOperator, "=="): self = .prefixOperator
403+
default: return nil
400404
}
401405
}
402406

@@ -2045,6 +2049,14 @@ extension Parser {
20452049
case poundErrorKeyword
20462050
case poundWarningKeyword
20472051

2052+
init?(lexeme: Lexer.Lexeme) {
2053+
switch lexeme.tokenKind {
2054+
case .poundErrorKeyword: self = .poundErrorKeyword
2055+
case .poundWarningKeyword: self = .poundWarningKeyword
2056+
default: return nil
2057+
}
2058+
}
2059+
20482060
var rawTokenKind: RawTokenKind {
20492061
switch self {
20502062
case .poundErrorKeyword: return .poundErrorKeyword

Sources/SwiftParser/Expressions.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,21 @@ extension Parser {
173173
case arrow
174174
case throwsKeyword
175175

176+
init?(lexeme: Lexer.Lexeme) {
177+
switch lexeme.tokenKind {
178+
case .spacedBinaryOperator: self = .spacedBinaryOperator
179+
case .unspacedBinaryOperator: self = .unspacedBinaryOperator
180+
case .infixQuestionMark: self = .infixQuestionMark
181+
case .equal: self = .equal
182+
case .isKeyword: self = .isKeyword
183+
case .asKeyword: self = .asKeyword
184+
case .identifier where lexeme.tokenText == "async": self = .async
185+
case .arrow: self = .arrow
186+
case .throwsKeyword: self = .throwsKeyword
187+
default: return nil
188+
}
189+
}
190+
176191
var rawTokenKind: RawTokenKind {
177192
switch self {
178193
case .spacedBinaryOperator: return .spacedBinaryOperator

Sources/SwiftParser/Lookahead.swift

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -283,20 +283,6 @@ extension Parser.Lookahead {
283283
"_opaqueReturnTypeOf",
284284
]
285285

286-
func isParenthesizedUnowned() -> Bool {
287-
assert(self.atContextualKeyword("unowned") && self.peek().tokenKind == .leftParen,
288-
"Invariant violated")
289-
290-
// Look ahead to parse the parenthesized expression.
291-
var lookahead = self.lookahead()
292-
lookahead.expectIdentifierWithoutRecovery()
293-
guard lookahead.consume(if: .leftParen) != nil else {
294-
return false
295-
}
296-
return lookahead.at(.identifier)
297-
&& lookahead.peek().tokenKind == .rightParen
298-
&& (lookahead.atContextualKeyword("safe") || lookahead.atContextualKeyword("unsafe"))
299-
}
300286
}
301287

302288
extension Parser.Lookahead {
@@ -365,6 +351,18 @@ extension Parser.Lookahead {
365351
case poundElseKeyword
366352
case poundElseifKeyword
367353

354+
init?(lexeme: Lexer.Lexeme) {
355+
switch lexeme.tokenKind {
356+
case .leftParen: self = .leftParen
357+
case .leftBrace: self = .leftBrace
358+
case .leftSquareBracket: self = .leftSquareBracket
359+
case .poundIfKeyword: self = .poundIfKeyword
360+
case .poundElseKeyword: self = .poundElseKeyword
361+
case .poundElseifKeyword: self = .poundElseifKeyword
362+
default: return nil
363+
}
364+
}
365+
368366
var rawTokenKind: RawTokenKind {
369367
switch self {
370368
case .leftParen: return .leftParen

Sources/SwiftParser/Names.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,15 +227,15 @@ extension Lexer.Lexeme {
227227
}
228228

229229
func isContextualPunctuator(_ name: SyntaxText) -> Bool {
230-
return Operator(self) != nil && self.tokenText == name
230+
return Operator(lexeme: self) != nil && self.tokenText == name
231231
}
232232

233233
var isKeyword: Bool {
234234
self.tokenKind.isKeyword
235235
}
236236

237237
func starts(with symbol: SyntaxText) -> Bool {
238-
guard Operator(self) != nil || self.tokenKind.isPunctuation else {
238+
guard Operator(lexeme: self) != nil || self.tokenKind.isPunctuation else {
239239
return false
240240
}
241241

Sources/SwiftParser/Patterns.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ extension Parser {
5252
case letKeyword
5353
case varKeyword
5454

55+
init?(lexeme: Lexer.Lexeme) {
56+
switch lexeme.tokenKind {
57+
case .leftParen: self = .leftParen
58+
case .wildcardKeyword: self = .wildcardKeyword
59+
case .identifier: self = .identifier
60+
case .letKeyword: self = .letKeyword
61+
case .varKeyword: self = .varKeyword
62+
default: return nil
63+
}
64+
}
65+
5566
var rawTokenKind: RawTokenKind {
5667
switch self {
5768
case .leftParen: return .leftParen
@@ -213,6 +224,17 @@ extension Parser.Lookahead {
213224
case varKeyword
214225
case leftParen
215226

227+
init?(lexeme: Lexer.Lexeme) {
228+
switch lexeme.tokenKind {
229+
case .identifier: self = .identifier
230+
case .wildcardKeyword: self = .wildcardKeyword
231+
case .letKeyword: self = .letKeyword
232+
case .varKeyword: self = .varKeyword
233+
case .leftParen: self = .leftParen
234+
default: return nil
235+
}
236+
}
237+
216238
var rawTokenKind: RawTokenKind {
217239
switch self {
218240
case .identifier: return .identifier

0 commit comments

Comments
 (0)