Added inference for indent level

This commit is contained in:
Nick Lockwood
2016-11-15 23:19:44 +00:00
parent 7c18de35ca
commit b58f4be7c1
2 changed files with 36 additions and 0 deletions
+30
View File
@@ -105,6 +105,36 @@ public func inferOptions(_ tokens: [Token]) -> FormatOptions {
let formatter = Formatter(tokens)
var options = FormatOptions()
options.indent = {
var indents = [(indent: String, count: Int)]()
func increment(_ indent: String) {
for (i, element) in indents.enumerated() {
if element.indent == indent {
indents[i] = (indent, element.count + 1)
return
}
}
indents.append((indent, 0))
}
formatter.forEachToken({ $0.isLinebreak }) { i, token in
let start = formatter.startOfLine(atIndex: i)
if case .whitespace(let string) = formatter.tokens[start] {
if string.hasPrefix("\t") {
increment("\t")
} else {
let length = string.characters.count
for i in [8, 4, 3, 2, 1] {
if length % i == 0 {
increment(String(repeating: " ", count: i))
break
}
}
}
}
}
return indents.sorted(by: { $0.count > $1.count }).first.map({ $0.indent }) ?? options.indent
}()
options.linebreak = {
var cr: Int = 0, lf: Int = 0, crlf: Int = 0
formatter.forEachToken { i, token in
+6
View File
@@ -11,6 +11,12 @@ import XCTest
class OptionsTests: XCTestCase {
func testInferIndentLevel() {
let input = "\t\nclass Foo {\n func bar() {\n //baz\n}\n}"
let options = inferOptions(tokenize(input))
XCTAssertEqual(options.indent, " ")
}
func testInferLinebreaks() {
let input = "foo\nbar\r\nbaz\rquux\r\n"
let output = "\r\n"