Files
SwiftLint/Source/SwiftLintFramework/Extensions/String+SwiftLint.swift
T
Norio Nomura 48b25b6aab Merge commit '83830861d6c6b7fee3218461f699c7d3b457bf2a' into swift3.0
* commit '83830861d6c6b7fee3218461f699c7d3b457bf2a':
  refactor isPrivateLevel(identifier:)
  refactor nameStrippingLeadingUnderscoreIfPrivate
  combine changelog entries for #781 and #831
  Add support for filePrivate and open in rules

# Conflicts:
#	Source/SwiftLintFramework/Extensions/String+SwiftLint.swift
#	Source/SwiftLintFramework/Rules/MissingDocsRule.swift
2016-11-30 20:16:47 +09:00

87 lines
2.7 KiB
Swift

//
// String+SwiftLint.swift
// SwiftLint
//
// Created by JP Simard on 2015-05-16.
// Copyright (c) 2015 Realm. All rights reserved.
//
import Foundation
import SourceKittenFramework
extension String {
internal func hasTrailingWhitespace() -> Bool {
if isEmpty {
return false
}
if let unicodescalar = unicodeScalars.last {
return CharacterSet.whitespaces.contains(unicodescalar)
}
return false
}
internal func isUppercase() -> Bool {
return self == uppercased()
}
internal func isLowercase() -> Bool {
return self == lowercased()
}
internal func nameStrippingLeadingUnderscoreIfPrivate(
_ dict: [String: SourceKitRepresentable]) -> String {
if let aclString = dict["key.accessibility"] as? String,
let acl = AccessControlLevel(identifier: aclString),
acl.isPrivate && characters.first == "_" {
return substring(from: index(after: startIndex))
}
return self
}
internal subscript (range: Range<Int>) -> String {
let nsrange = NSRange(location: range.lowerBound,
length: range.upperBound - range.lowerBound)
if let indexRange = nsrangeToIndexRange(nsrange) {
return self.substring(with: indexRange)
}
fatalError("invalid range")
}
internal func substring(_ from: Int, length: Int? = nil) -> String {
if let length = length {
return self[from..<from + length]
}
let index = characters.index(startIndex, offsetBy: from, limitedBy: endIndex)!
return self.substring(from: index)
}
internal func lastIndexOf(_ search: String) -> Int? {
if let range = range(of: search, options: [.literal, .backwards]) {
return characters.distance(from: startIndex, to: range.lowerBound)
}
return nil
}
internal func nsrangeToIndexRange(_ nsrange: NSRange) -> Range<Index>? {
guard nsrange.location != NSNotFound else {
return nil
}
let from16 = utf16.index(utf16.startIndex,
offsetBy: nsrange.location,
limitedBy: utf16.endIndex) ?? utf16.endIndex
let to16 = utf16.index(from16,
offsetBy: nsrange.length,
limitedBy: utf16.endIndex) ?? utf16.endIndex
if let from = Index(from16, within: self), let to = Index(to16, within: self) {
return from..<to
}
return nil
}
public func absolutePathStandardized() -> String {
return (self.absolutePathRepresentation() as NSString).standardizingPath
}
}