diff --git a/CHANGELOG.md b/CHANGELOG.md index 2198c6a21..9af5264f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,10 @@ ##### Bug Fixes -* None. +* Fix a crash that occurred when a documentation comment ended with an extended + grapheme cluster. + [Lukas StĆ¼hrk](https://github.com/Lukas-Stuehrk) + [#350](https://github.com/jpsim/SourceKitten/issues/350) ## 0.17.0 diff --git a/Source/SourceKittenFramework/String+SourceKitten.swift b/Source/SourceKittenFramework/String+SourceKitten.swift index 3754096c1..432fd55be 100644 --- a/Source/SourceKittenFramework/String+SourceKitten.swift +++ b/Source/SourceKittenFramework/String+SourceKitten.swift @@ -232,15 +232,15 @@ extension NSString { - parameter characterSet: Character set to check for membership. */ public func trimmingTrailingCharacters(in characterSet: CharacterSet) -> String { - if length == 0 { + guard length > 0 else { return "" } - var charBuffer = [unichar](repeating: 0, count: length) - getCharacters(&charBuffer, range: NSRange(location: 0, length: charBuffer.count)) - for newLength in (1...length).reversed() { - if !characterSet.contains(UnicodeScalar(charBuffer[newLength - 1])!) { - return substring(with: NSRange(location: 0, length: newLength)) + var unicodeScalars = self.bridge().unicodeScalars + while let scalar = unicodeScalars.last { + if !characterSet.contains(scalar) { + return String(unicodeScalars) } + unicodeScalars.removeLast() } return "" } diff --git a/Tests/SourceKittenFrameworkTests/StringTests.swift b/Tests/SourceKittenFrameworkTests/StringTests.swift index bbcde8e87..d957d9a70 100644 --- a/Tests/SourceKittenFrameworkTests/StringTests.swift +++ b/Tests/SourceKittenFrameworkTests/StringTests.swift @@ -25,6 +25,7 @@ class StringTests: XCTestCase { XCTAssertEqual(" a ".bridge().trimmingTrailingCharacters(in: .whitespacesAndNewlines), " a") XCTAssertEqual(" ".bridge().trimmingTrailingCharacters(in: .whitespacesAndNewlines), "") XCTAssertEqual("a".bridge().trimmingTrailingCharacters(in: .whitespacesAndNewlines), "a") + XCTAssertEqual("FoobaršŸ’£".bridge().trimmingTrailingCharacters(in: .whitespacesAndNewlines), "FoobaršŸ’£") } func testCommentBody() {