diff --git a/CHANGELOG.md b/CHANGELOG.md index cf9553d29..420faaa59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +## Master + +##### Breaking + +None. + +##### Enhancements + +None. + +##### Bug Fixes + +* Fixed out-of-bounds exception when parsing the declaration in files starting + with a declaration. + [JP Simard](https://github.com/jpsim) + [#30](https://github.com/jpsim/SourceKitten/issues/30) + ## 0.3.0 ##### Breaking diff --git a/Source/SourceKittenFramework/NSString+SourceKitten.swift b/Source/SourceKittenFramework/NSString+SourceKitten.swift index 483e8797d..0503e67d2 100644 --- a/Source/SourceKittenFramework/NSString+SourceKitten.swift +++ b/Source/SourceKittenFramework/NSString+SourceKitten.swift @@ -45,9 +45,9 @@ extension NSString { :returns: Line breaks. */ public func lineBreaks() -> [Int] { - var lineBreaks = [Int]() + var lineBreaks = [-1] // Count start of file var searchRange = NSRange(location: 0, length: length) - while searchRange.length > 0 { + while searchRange.length > 0 { searchRange.length = length - searchRange.location let foundRange = rangeOfString("\n", options: nil, range: searchRange) if foundRange.location != NSNotFound { @@ -69,6 +69,7 @@ extension NSString { :returns: Filtered string. */ public func filteredSubstring(start: Int, end: Int) -> String { + precondition(end > start, "Range should be positive") let range = NSRange(location: start, length: end - start - 1) let unwantedSet = NSCharacterSet.whitespaceAndNewlineCharacterSet().mutableCopy() as NSMutableCharacterSet unwantedSet.addCharactersInString("{") diff --git a/Source/SourceKittenFrameworkTests/StringTests.swift b/Source/SourceKittenFrameworkTests/StringTests.swift index c18c5f350..5e1096e6f 100644 --- a/Source/SourceKittenFrameworkTests/StringTests.swift +++ b/Source/SourceKittenFrameworkTests/StringTests.swift @@ -43,7 +43,7 @@ class StringTests: XCTestCase { } func testParseLineBreaks() { - XCTAssertEqual("a\nbc\nd\n".lineBreaks(), [1, 4, 6], "should parse line breaks") + XCTAssertEqual("a\nbc\nd\n".lineBreaks(), [-1, 1, 4, 6], "should parse line breaks") } func testFilteredSubstring() {