Skip to content

Commit ce99bae

Browse files
LaurenWhiteallevato
authored andcommitted
Implement OneSpaceInsideBraces (swiftlang#84)
1 parent 1aca262 commit ce99bae

File tree

3 files changed

+94
-15
lines changed

3 files changed

+94
-15
lines changed

tools/swift-format/Sources/Rules/OneSpaceBeforeExpressions.swift

-15
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Core
2+
import Foundation
3+
import SwiftSyntax
4+
5+
/// A single space is required between an expression and a brace on the same line.
6+
///
7+
/// Lint: If an expression appears on the same line as a brace with invalid spaces between
8+
/// them, a lint error is raised.
9+
///
10+
/// Format: A single space will be inserted between braces and same-line expressions.
11+
///
12+
/// - SeeAlso: https://google.github.io/swift#horizontal-whitespace
13+
public final class OneSpaceInsideBraces: SyntaxFormatRule {
14+
15+
public override func visit(_ token: TokenSyntax) -> Syntax {
16+
17+
guard let next = token.nextToken else { return token }
18+
guard !next.leadingTrivia.containsNewlines else { return token }
19+
20+
let trailingSpaces = token.trailingTrivia.numberOfSpaces
21+
guard trailingSpaces != 1 else { return token }
22+
23+
// Insert single space between open brace and next token
24+
if token.tokenKind == .leftBrace {
25+
diagnose(trailingSpaces > 1 ? .removeSpaceAfterOpenBrace : .insertSpaceAfterOpenBrace,
26+
on: token)
27+
return token.withTrailingTrivia(next.tokenKind == .rightBrace ? [] : .spaces(1))
28+
// Insert single space between token and close brace
29+
} else if next.tokenKind == .rightBrace {
30+
diagnose(trailingSpaces > 1 ? .removeSpaceBeforeCloseBrace : .insertSpaceBeforeCloseBrace,
31+
on: next)
32+
return token.withTrailingTrivia(.spaces(1))
33+
}
34+
return token
35+
}
36+
}
37+
38+
extension Diagnostic.Message {
39+
static let removeSpaceAfterOpenBrace =
40+
Diagnostic.Message(.warning, "remove extra spaces after this '{'")
41+
static let insertSpaceAfterOpenBrace =
42+
Diagnostic.Message(.warning, "insert a space after this '{'")
43+
static let removeSpaceBeforeCloseBrace =
44+
Diagnostic.Message(.warning, "remove extra spaces before this '}'")
45+
static let insertSpaceBeforeCloseBrace =
46+
Diagnostic.Message(.warning, "insert a space before this '}'")
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Foundation
2+
import XCTest
3+
import SwiftSyntax
4+
5+
@testable import Rules
6+
7+
public class OneSpaceInsideBracesTests: DiagnosingTestCase {
8+
public func testInvalidSpacesInsideBraces() {
9+
XCTAssertFormatting(
10+
OneSpaceInsideBraces.self,
11+
input: """
12+
let nonNegativeCubes = numbers.map {$0 * $0 * $0 }.filter { $0 >= 0}
13+
func foo() {}
14+
func bar() { }
15+
guard x = y else {return nil }
16+
if y > x {
17+
// ...
18+
}
19+
func baz() {if(true) { print("yes!")}}
20+
""",
21+
expected: """
22+
let nonNegativeCubes = numbers.map { $0 * $0 * $0 }.filter { $0 >= 0 }
23+
func foo() {}
24+
func bar() {}
25+
guard x = y else { return nil }
26+
if y > x {
27+
// ...
28+
}
29+
func baz() { if(true) { print("yes!") } }
30+
""")
31+
XCTAssertDiagnosed(.insertSpaceAfterOpenBrace)
32+
XCTAssertDiagnosed(.removeSpaceBeforeCloseBrace)
33+
XCTAssertDiagnosed(.removeSpaceAfterOpenBrace)
34+
XCTAssertDiagnosed(.insertSpaceAfterOpenBrace)
35+
XCTAssertDiagnosed(.removeSpaceBeforeCloseBrace)
36+
XCTAssertDiagnosed(.insertSpaceAfterOpenBrace)
37+
XCTAssertDiagnosed(.removeSpaceAfterOpenBrace)
38+
XCTAssertDiagnosed(.insertSpaceBeforeCloseBrace)
39+
XCTAssertDiagnosed(.insertSpaceBeforeCloseBrace)
40+
}
41+
42+
#if !os(macOS)
43+
static let allTests = [
44+
OneSpaceInsideBracesTests.testInvalidSpacesInsideBraces,
45+
]
46+
#endif
47+
}

0 commit comments

Comments
 (0)