Skip to content

Commit ca07204

Browse files
committed
Simplify fast path lookup
1 parent 9ec3db2 commit ca07204

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

Sources/Chroma/LanguageDefinition+Helpers.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ public extension LanguageDefinition {
55
switch kind {
66
case .keyword:
77
var updated = ensureFastPath()
8-
updated.keywords.formUnion(words)
8+
updated.appendWords(words, kind: .keyword)
99
fastPath = updated
1010
case .type:
1111
var updated = ensureFastPath()
12-
updated.types.formUnion(words)
12+
updated.appendWords(words, kind: .type)
1313
fastPath = updated
1414
default:
1515
break

Sources/Chroma/LanguageDefinition.swift

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,40 @@ public struct LanguageDefinition {
1818
}
1919

2020
public struct LanguageFastPath: Equatable {
21-
public var keywords: Set<String>
22-
public var types: Set<String>
21+
private var lookup: [String: TokenKind]
2322

2423
public init(keywords: [String] = [], types: [String] = []) {
25-
self.keywords = Set(keywords)
26-
self.types = Set(types)
24+
var lookup: [String: TokenKind] = [:]
25+
lookup.reserveCapacity(keywords.count + types.count)
26+
for word in types {
27+
lookup[word] = .type
28+
}
29+
for word in keywords {
30+
lookup[word] = .keyword
31+
}
32+
self.lookup = lookup
2733
}
2834

2935
public var isEmpty: Bool {
30-
keywords.isEmpty && types.isEmpty
36+
lookup.isEmpty
37+
}
38+
39+
func kind(for word: String) -> TokenKind? {
40+
lookup[word]
41+
}
42+
43+
mutating func appendWords(_ words: [String], kind: TokenKind) {
44+
switch kind {
45+
case .keyword:
46+
for word in words {
47+
lookup[word] = .keyword
48+
}
49+
case .type:
50+
for word in words where lookup[word] == nil {
51+
lookup[word] = .type
52+
}
53+
default:
54+
break
55+
}
3156
}
3257
}

Sources/Chroma/Tokenizer.swift

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,8 @@ final class RegexTokenizer {
211211
}
212212
let wordRange = NSRange(location: location, length: index - location)
213213
let word = ns.substring(with: wordRange)
214-
if fastPath.keywords.contains(word) {
215-
return (.keyword, wordRange)
216-
}
217-
if fastPath.types.contains(word) {
218-
return (.type, wordRange)
219-
}
220-
return nil
214+
guard let kind = fastPath.kind(for: word) else { return nil }
215+
return (kind, wordRange)
221216
}
222217

223218
func appendPlainWithFastPath(_ range: NSRange, fastPath: LanguageFastPath) {
@@ -236,10 +231,8 @@ final class RegexTokenizer {
236231
}
237232
let wordRange = NSRange(location: start, length: index - start)
238233
let word = ns.substring(with: wordRange)
239-
if fastPath.keywords.contains(word) {
240-
appendToken(Token(kind: .keyword, range: wordRange))
241-
} else if fastPath.types.contains(word) {
242-
appendToken(Token(kind: .type, range: wordRange))
234+
if let kind = fastPath.kind(for: word) {
235+
appendToken(Token(kind: kind, range: wordRange))
243236
} else {
244237
appendPlainASCII(wordRange)
245238
}

0 commit comments

Comments
 (0)