Skip to content

Commit e90d261

Browse files
authored
Merge pull request #800 from rintaro/tokenkindsubset-noarray
[Performance] Minimize RawTokenKindSubset.allCases usage
2 parents 4485c84 + 4ad0a19 commit e90d261

12 files changed

+355
-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/DeclarationModifier.swift.gyb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ enum DeclarationModifier: SyntaxText, ContextualKeywords, RawTokenKindSubset {
2525
case ${attr.swift_name} = "${attr.name}"
2626
% end
2727

28+
init?(lexeme: Lexer.Lexeme) {
29+
switch lexeme.tokenKind {
30+
% for attr in DECL_MODIFIER_KINDS:
31+
% if attr.swift_name.endswith('Keyword'):
32+
case .${attr.swift_name}: self = .${attr.swift_name}
33+
% end
34+
% end
35+
case .identifier: self.init(rawValue: lexeme.tokenText)
36+
default: return nil
37+
}
38+
}
39+
2840
var rawTokenKind: RawTokenKind {
2941
switch self {
3042
% for attr in DECL_MODIFIER_KINDS:

Sources/SwiftParser/Declarations.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,10 +410,14 @@ extension Parser {
410410
case postfixOperator
411411
case prefixOperator
412412

413-
func accepts(lexeme: Lexer.Lexeme) -> Bool {
414-
switch self {
415-
case .colon: return true
416-
default: return lexeme.tokenText == "=="
413+
init?(lexeme: Lexer.Lexeme) {
414+
switch (lexeme.tokenKind, lexeme.tokenText) {
415+
case (.colon, _): self = .colon
416+
case (.spacedBinaryOperator, "=="): self = .spacedBinaryOperator
417+
case (.unspacedBinaryOperator, "=="): self = .unspacedBinaryOperator
418+
case (.postfixOperator, "=="): self = .postfixOperator
419+
case (.prefixOperator, "=="): self = .prefixOperator
420+
default: return nil
417421
}
418422
}
419423

@@ -2063,6 +2067,14 @@ extension Parser {
20632067
case poundErrorKeyword
20642068
case poundWarningKeyword
20652069

2070+
init?(lexeme: Lexer.Lexeme) {
2071+
switch lexeme.tokenKind {
2072+
case .poundErrorKeyword: self = .poundErrorKeyword
2073+
case .poundWarningKeyword: self = .poundWarningKeyword
2074+
default: return nil
2075+
}
2076+
}
2077+
20662078
var rawTokenKind: RawTokenKind {
20672079
switch self {
20682080
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
@@ -271,15 +271,15 @@ extension Lexer.Lexeme {
271271
}
272272

273273
func isContextualPunctuator(_ name: SyntaxText) -> Bool {
274-
return Operator(self) != nil && self.tokenText == name
274+
return Operator(lexeme: self) != nil && self.tokenText == name
275275
}
276276

277277
var isKeyword: Bool {
278278
self.tokenKind.isKeyword
279279
}
280280

281281
func starts(with symbol: SyntaxText) -> Bool {
282-
guard Operator(self) != nil || self.tokenKind.isPunctuation else {
282+
guard Operator(lexeme: self) != nil || self.tokenKind.isPunctuation else {
283283
return false
284284
}
285285

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)