@@ -23,7 +23,7 @@ public final class Lexer {
23
23
24
24
static let SLFHeader = " SLF "
25
25
26
- let typeDelimiters : CharacterSet
26
+ let typeDelimiters : Set < Character >
27
27
let filePath : String
28
28
var classNames = [ String] ( )
29
29
var userDirToRedact : String ? {
@@ -38,7 +38,7 @@ public final class Lexer {
38
38
39
39
public init ( filePath: String ) {
40
40
self . filePath = filePath
41
- self . typeDelimiters = CharacterSet ( charactersIn : TokenType . all ( ) )
41
+ self . typeDelimiters = Set ( TokenType . all ( ) )
42
42
self . redactor = LexRedactor ( )
43
43
}
44
44
@@ -53,15 +53,18 @@ public final class Lexer {
53
53
redacted: Bool ,
54
54
withoutBuildSpecificInformation: Bool ) throws -> [ Token ] {
55
55
let scanner = Scanner ( string: contents)
56
+
56
57
guard scanSLFHeader ( scanner: scanner) else {
57
58
throw XCLogParserError . invalidLogHeader ( filePath)
58
59
}
60
+
59
61
var tokens = [ Token] ( )
60
62
while !scanner. isAtEnd {
63
+
61
64
guard let logTokens = scanSLFType ( scanner: scanner,
62
65
redacted: redacted,
63
66
withoutBuildSpecificInformation: withoutBuildSpecificInformation) ,
64
- logTokens. isEmpty == false else {
67
+ logTokens. isEmpty == false else {
65
68
print ( tokens)
66
69
throw XCLogParserError . invalidLine ( scanner. approximateLine)
67
70
}
@@ -71,20 +74,15 @@ public final class Lexer {
71
74
}
72
75
73
76
private func scanSLFHeader( scanner: Scanner ) -> Bool {
74
- #if os(Linux)
75
- var format : String ?
76
- #else
77
- var format : NSString ?
78
- #endif
79
- return scanner. scanString ( Lexer . SLFHeader, into: & format)
77
+ return scanner. scan ( string: Lexer . SLFHeader)
80
78
}
81
79
82
- private func scanSLFType( scanner: Scanner , redacted: Bool , withoutBuildSpecificInformation: Bool ) -> [ Token ] ? {
80
+ private func scanSLFType( scanner: Scanner ,
81
+ redacted: Bool ,
82
+ withoutBuildSpecificInformation: Bool ) -> [ Token ] ? {
83
+ let payload = self . scanPayload ( scanner: scanner)
83
84
84
- guard let payload = scanPayload ( scanner: scanner) else {
85
- return nil
86
- }
87
- guard let tokenTypes = scanTypeDelimiter ( scanner: scanner) , tokenTypes. count > 0 else {
85
+ guard let tokenTypes = self . scanTypeDelimiter ( scanner: scanner) , tokenTypes. count > 0 else {
88
86
return nil
89
87
}
90
88
@@ -97,44 +95,30 @@ public final class Lexer {
97
95
}
98
96
}
99
97
100
- private func scanPayload( scanner: Scanner ) -> String ? {
101
- var payload : String = " "
102
- #if os(Linux)
103
- var char : String ?
104
- #else
105
- var char : NSString ?
106
- #endif
98
+ private func scanPayload( scanner: Scanner ) -> String {
107
99
let hexChars = " abcdef0123456789 "
108
- while scanner. scanCharacters ( from: CharacterSet ( charactersIn: hexChars) , into: & char) ,
109
- let char = char as String ? {
110
- payload. append ( char)
111
- }
112
- return payload
100
+ let characterSet = Set ( hexChars)
101
+ return scanner. scanCharacters ( from: characterSet) ?? " "
113
102
}
114
103
115
104
private func scanTypeDelimiter( scanner: Scanner ) -> [ TokenType ] ? {
116
- #if os(Linux)
117
- var delimiters : String ?
118
- #else
119
- var delimiters : NSString ?
120
- #endif
121
- if scanner. scanCharacters ( from: typeDelimiters, into: & delimiters) , let delimiters = delimiters {
122
- let delimiters = String ( delimiters)
123
- if delimiters. count > 1 {
124
- // if we found a string, we discard other type delimiters because there are part of the string
125
- let tokenString = TokenType . string
126
- if let char = delimiters. first, tokenString. rawValue == String ( char) {
127
- scanner. scanLocation -= delimiters. count - 1
128
- return [ tokenString]
129
- }
130
- }
131
- // sometimes we found one or more nil list (-) next to the type delimiter
132
- // in that case we'll return the delimiter and one or more `Token.null`
133
- return delimiters. compactMap { character -> TokenType ? in
134
- TokenType ( rawValue: String ( character) )
105
+ guard let delimiters = scanner. scanCharacters ( from: self . typeDelimiters) else {
106
+ return nil
107
+ }
108
+
109
+ if delimiters. count > 1 {
110
+ // if we found a string, we discard other type delimiters because there are part of the string
111
+ let tokenString = TokenType . string
112
+ if let char = delimiters. first, tokenString. rawValue == String ( char) {
113
+ scanner. moveOffset ( by: - ( delimiters. count - 1 ) )
114
+ return [ tokenString]
135
115
}
136
116
}
137
- return nil
117
+ // sometimes we found one or more nil list (-) next to the type delimiter
118
+ // in that case we'll return the delimiter and one or more `Token.null`
119
+ return delimiters. compactMap { character -> TokenType ? in
120
+ TokenType ( rawValue: String ( character) )
121
+ }
138
122
}
139
123
140
124
private func scanToken( scanner: Scanner ,
@@ -252,19 +236,12 @@ public final class Lexer {
252
236
scanner: Scanner ,
253
237
redacted: Bool ,
254
238
withoutBuildSpecificInformation: Bool ) -> String ? {
255
- guard let value = Int ( length) else {
239
+ guard let value = Int ( length) , let scannedResult = scanner . scan ( count : value ) else {
256
240
print ( " error parsing string " )
257
241
return nil
258
242
}
259
- #if swift(>=5.0)
260
- let start = String . Index ( utf16Offset: scanner. scanLocation, in: scanner. string)
261
- let end = String . Index ( utf16Offset: scanner. scanLocation + value, in: scanner. string)
262
- #else
263
- let start = String . Index ( encodedOffset: scanner. scanLocation)
264
- let end = String . Index ( encodedOffset: scanner. scanLocation + value)
265
- #endif
266
- scanner. scanLocation += value
267
- var result = String ( scanner. string [ start..< end] )
243
+
244
+ var result = scannedResult
268
245
if redacted {
269
246
result = redactor. redactUserDir ( string: result)
270
247
}
@@ -285,19 +262,18 @@ public final class Lexer {
285
262
}
286
263
}
287
264
288
- extension Scanner {
265
+ private extension Scanner {
289
266
var approximateLine : String {
290
- let endCount = string. count - scanLocation > 21 ? scanLocation + 21 : string. count - scanLocation
291
- #if swift(>=5.0)
292
- let start = String . Index ( utf16Offset: scanLocation, in: self . string)
293
- let end = String . Index ( utf16Offset: endCount, in: self . string)
294
- #else
295
- let start = String . Index ( encodedOffset: scanLocation)
296
- let end = String . Index ( encodedOffset: endCount)
297
- #endif
267
+ let currentLocation = self . offset
268
+ let contentSize = self . string. count
269
+
270
+ let start = String . Index ( compilerSafeOffset: currentLocation, in: self . string)
271
+ let endCount = contentSize - currentLocation > 21 ? currentLocation + 21 : contentSize - currentLocation
272
+ let end = String . Index ( compilerSafeOffset: endCount, in: self . string)
273
+
298
274
if end <= start {
299
- return String ( string [ start..< string . endIndex ] )
275
+ return String ( self . string [ start..< self . stringEndIndex ] )
300
276
}
301
- return String ( string [ start..< end] )
277
+ return String ( self . string [ start..< end] )
302
278
}
303
279
}
0 commit comments