Skip to content

Commit 2d032c5

Browse files
author
Harlan Haskins
authored
Merge pull request swiftlang#37 from harlanhaskins/trivial-pursuit
Properly compute start location after leading trivia
2 parents efecb4f + 8b06475 commit 2d032c5

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

Sources/SwiftSyntax/Syntax.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,9 @@ extension Syntax {
239239
in file: URL,
240240
afterLeadingTrivia: Bool = true
241241
) -> SourceLocation {
242-
let pos = afterLeadingTrivia ?
243-
data.position :
244-
data.positionAfterSkippingLeadingTrivia
242+
let pos = afterLeadingTrivia ?
243+
data.positionAfterSkippingLeadingTrivia :
244+
data.position
245245
return SourceLocation(file: file.path, position: pos)
246246
}
247247

Tests/SwiftSyntaxTest/AbsolutePosition.swift

+26
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class AbsolutePositionTestCase: XCTestCase {
1919
("testTrivias", testTrivias),
2020
("testImplicit", testImplicit),
2121
("testWithoutSourceFileRoot", testWithoutSourceFileRoot),
22+
("testSourceLocation", testSourceLocation),
2223
]
2324

2425
public func testVisitor() {
@@ -139,4 +140,29 @@ public class AbsolutePositionTestCase: XCTestCase {
139140
XCTAssertEqual(0, item.position.utf8Offset)
140141
XCTAssertEqual(1, item.positionAfterSkippingLeadingTrivia.utf8Offset)
141142
}
143+
144+
public func testSourceLocation() {
145+
let url = URL(fileURLWithPath: "/tmp/test.swift")
146+
let root = self.createSourceFile(2)
147+
guard let secondReturnStmt = root.child(at: 0)?.child(at: 1) else {
148+
fatalError("out of sync with createSourceFile")
149+
}
150+
let startLoc = secondReturnStmt.startLocation(in: url)
151+
XCTAssertEqual(startLoc.line, 4)
152+
XCTAssertEqual(startLoc.column, 18)
153+
154+
let startLocBeforeTrivia =
155+
secondReturnStmt.startLocation(in: url, afterLeadingTrivia: false)
156+
XCTAssertEqual(startLocBeforeTrivia.line, 3)
157+
XCTAssertEqual(startLocBeforeTrivia.column, 1)
158+
159+
let endLoc = secondReturnStmt.endLocation(in: url)
160+
XCTAssertEqual(endLoc.line, 4)
161+
XCTAssertEqual(endLoc.column, 24)
162+
163+
let endLocAfterTrivia =
164+
secondReturnStmt.endLocation(in: url, afterTrailingTrivia: true)
165+
XCTAssertEqual(endLocAfterTrivia.line, 5)
166+
XCTAssertEqual(endLocAfterTrivia.column, 1)
167+
}
142168
}

0 commit comments

Comments
 (0)