@@ -181,96 +181,6 @@ extension String {
181181 return newString
182182 }
183183
184- private static let identifierHeadCharactersRanges : [ ClosedRange < Character > ] = {
185- // https://docs.swift.org/swift-book/documentation/the-swift-programming-language/lexicalstructure/#Identifiers
186- var ranges : [ ClosedRange < Character > ] = [ ]
187- // identifier-head → Upper- or lowercase letter A through Z
188- ranges. append ( " A " ... " Z " )
189- ranges. append ( " a " ... " z " )
190- // identifier-head → _
191- ranges. append ( " _ " )
192- // identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA
193- ranges. appendFromSet ( [ 0x00A8 , 0x00AA , 0x00AD , 0x00AF ] )
194- ranges. appendFromScalars ( 0x00B2 ... 0x00B5 )
195- ranges. appendFromScalars ( 0x00B7 ... 0x00BA )
196- // identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF
197- ranges. appendFromScalars ( 0x00BC ... 0x00BE )
198- ranges. appendFromScalars ( 0x00C0 ... 0x00D6 )
199- ranges. appendFromScalars ( 0x00D8 ... 0x00F6 )
200- ranges. appendFromScalars ( 0x00F8 ... 0x00FF )
201- // identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF
202- ranges. appendFromScalars ( 0x0100 ... 0x02FF )
203- ranges. appendFromScalars ( 0x0370 ... 0x167F )
204- ranges. appendFromScalars ( 0x1681 ... 0x180D )
205- ranges. appendFromScalars ( 0x180F ... 0x1DBF )
206- // identifier-head → U+1E00–U+1FFF
207- ranges. appendFromScalars ( 0x1E00 ... 0x1FFF )
208- // identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F
209- ranges. appendFromScalars ( 0x200B ... 0x200D )
210- ranges. appendFromScalars ( 0x202A ... 0x202E )
211- ranges. appendFromScalars ( 0x203F ... 0x2040 )
212- ranges. appendFromScalar ( 0x2054 )
213- ranges. appendFromScalars ( 0x2060 ... 0x206F )
214- // identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793
215- ranges. appendFromScalars ( 0x2070 ... 0x20CF )
216- ranges. appendFromScalars ( 0x2100 ... 0x218F )
217- ranges. appendFromScalars ( 0x2460 ... 0x24FF )
218- ranges. appendFromScalars ( 0x2776 ... 0x2793 )
219- // identifier-head → U+2C00–U+2DFF or U+2E80–U+2FFF
220- ranges. appendFromScalars ( 0x2C00 ... 0x2DFF )
221- ranges. appendFromScalars ( 0x2E80 ... 0x2FFF )
222- // identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF
223- ranges. appendFromScalars ( 0x3004 ... 0x3007 )
224- ranges. appendFromScalars ( 0x3021 ... 0x302F )
225- ranges. appendFromScalars ( 0x3031 ... 0x303F )
226- ranges. appendFromScalars ( 0x3040 ... 0xD7FF )
227- // identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44
228- ranges. appendFromScalars ( 0xF900 ... 0xFD3D )
229- ranges. appendFromScalars ( 0xFD40 ... 0xFDCF )
230- ranges. appendFromScalars ( 0xFDF0 ... 0xFE1F )
231- ranges. appendFromScalars ( 0xFE30 ... 0xFE44 )
232- // identifier-head → U+FE47–U+FFFD
233- ranges. appendFromScalars ( 0xFE47 ... 0xFFFD )
234- // identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD
235- ranges. appendFromScalars ( 0x10000 ... 0x1FFFD )
236- ranges. appendFromScalars ( 0x20000 ... 0x2FFFD )
237- ranges. appendFromScalars ( 0x30000 ... 0x3FFFD )
238- ranges. appendFromScalars ( 0x40000 ... 0x4FFFD )
239- // identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD
240- ranges. appendFromScalars ( 0x50000 ... 0x5FFFD )
241- ranges. appendFromScalars ( 0x60000 ... 0x6FFFD )
242- ranges. appendFromScalars ( 0x70000 ... 0x7FFFD )
243- ranges. appendFromScalars ( 0x80000 ... 0x8FFFD )
244- // identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD
245- ranges. appendFromScalars ( 0x90000 ... 0x9FFFD )
246- ranges. appendFromScalars ( 0xA0000 ... 0xAFFFD )
247- ranges. appendFromScalars ( 0xB0000 ... 0xBFFFD )
248- ranges. appendFromScalars ( 0xC0000 ... 0xCFFFD )
249- // identifier-head → U+D0000–U+DFFFD or U+E0000–U+EFFFD
250- ranges. appendFromScalars ( 0xD0000 ... 0xDFFFD )
251- ranges. appendFromScalars ( 0xE0000 ... 0xEFFFD )
252- return ranges
253- } ( )
254-
255- private static let identifierNonHeadCharactersRanges : [ ClosedRange < Character > ] = {
256- var ranges : [ ClosedRange < Character > ] = [ ]
257- // identifier-character → Digit 0 through 9
258- ranges. append ( " 0 " ... " 9 " )
259- // identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F
260- ranges. appendFromScalars ( 0x0300 ... 0x036F )
261- ranges. appendFromScalars ( 0x1DC0 ... 0x1DFF )
262- ranges. appendFromScalars ( 0x20D0 ... 0x20FF )
263- ranges. appendFromScalars ( 0xFE20 ... 0xFE2F )
264- return ranges
265- } ( )
266-
267- private static let identifierCharactersRanges : [ ClosedRange < Character > ] = {
268- var ranges : [ ClosedRange < Character > ] = [ ]
269- ranges. append ( contentsOf: identifierHeadCharactersRanges)
270- ranges. append ( contentsOf: identifierNonHeadCharactersRanges)
271- return ranges
272- } ( )
273-
274184 /// A list of Swift keywords.
275185 ///
276186 /// Copied from SwiftSyntax/TokenKind.swift
@@ -291,125 +201,3 @@ extension String {
291201 " \\ " : " bsol " , " ] " : " rbrack " , " ^ " : " hat " , " ` " : " grave " , " { " : " lcub " , " | " : " verbar " , " } " : " rcub " , " ~ " : " tilde " ,
292202 ]
293203}
294-
295- extension [ ClosedRange < Character > ] {
296- func contains( _ char: Character ) -> Bool {
297- // TODO: This could be optimized if we create a data structure of sorted ranges and use binary search.
298- for range in self {
299- if range. contains ( char) {
300- return true
301- }
302- }
303- return false
304- }
305-
306- mutating func appendFromScalar( _ scalar: Int ) {
307- append ( Character ( UnicodeScalar ( scalar) !) ... Character ( UnicodeScalar ( scalar) !) )
308- }
309-
310- mutating func appendFromSet( _ set: Set < Int > ) {
311- append ( contentsOf: ClosedRange< Character> . fromSet( set) )
312- }
313-
314- mutating func appendFromScalars( _ range: ClosedRange < Int > ) {
315- append ( Character ( UnicodeScalar ( range. lowerBound) !) ... Character ( UnicodeScalar ( range. upperBound) !) )
316- }
317- }
318-
319- extension ClosedRange : @retroactive ExpressibleByUnicodeScalarLiteral where Bound == Character {
320- public typealias UnicodeScalarLiteralType = Character
321- public init ( unicodeScalarLiteral value: UnicodeScalarLiteralType ) {
322- let char = Character ( unicodeScalarLiteral: value)
323- self = char... char
324- }
325- }
326-
327- extension ClosedRange where Bound == Character {
328- static func fromSet( _ set: Set < Int > ) -> [ Self ] {
329- set. map {
330- Character ( UnicodeScalar ( $0) !) ... Character ( UnicodeScalar ( $0) !)
331- }
332- }
333- }
334-
335- fileprivate extension Set where Element == Character {
336- mutating func insert( charactersInString string: String ) {
337- for character in string {
338- insert ( character)
339- }
340- }
341-
342- mutating func insert( allFrom lowerBound: Character , upTo upperBound: Character ) {
343- for byte in lowerBound. asciiValue!... upperBound. asciiValue! {
344- insert ( Character ( UnicodeScalar ( byte) ) )
345- }
346- }
347-
348- mutating func insert( scalarWithCode code: Int ) {
349- insert ( Character ( UnicodeScalar ( code) !) )
350- }
351-
352- mutating func insert( scalarInSet set: Set < Int > ) {
353- for code in set {
354- insert ( scalarWithCode: code)
355- }
356- }
357-
358- mutating func insert( scalarsInRangeFrom lowerBound: Int , upTo upperBound: Int ) {
359- for code in lowerBound... upperBound {
360- insert ( scalarWithCode: code)
361- }
362- }
363- }
364-
365- @available ( * , deprecated)
366- fileprivate extension UInt8 {
367-
368- var isUppercaseLetter : Bool {
369- ( 0x41 ... 0x5a ) . contains ( self )
370- }
371-
372- var isLowercaseLetter : Bool {
373- ( 0x61 ... 0x7a ) . contains ( self )
374- }
375-
376- var isLetter : Bool {
377- isUppercaseLetter || isLowercaseLetter
378- }
379-
380- var isNumber : Bool {
381- ( 0x30 ... 0x39 ) . contains ( self )
382- }
383-
384- var isLowercaseLetterOrNumber : Bool {
385- isLowercaseLetter || isNumber
386- }
387-
388- var isAlphanumeric : Bool {
389- isLetter || isNumber
390- }
391-
392- var asUppercase : UInt8 {
393- if isUppercaseLetter || isNumber {
394- return self
395- }
396- if isLowercaseLetter {
397- return self - 0x20
398- }
399- preconditionFailure ( " Cannot uppercase not a letter or number " )
400- }
401-
402- var asLowercase : UInt8 {
403- if isLowercaseLetter || isNumber {
404- return self
405- }
406- if isUppercaseLetter {
407- return self + 0x20
408- }
409- preconditionFailure ( " Cannot lowercase not a letter or number " )
410- }
411-
412- var isWordSeparator : Bool {
413- self == 0x2d /* - */ || self == 0x5f /* _ */
414- }
415- }
0 commit comments