Skip to content

Commit 6fca6e7

Browse files
authored
Merge pull request swiftlang#84 from akyrtzi/endpositions
Change `endPosition` to be the end of the node's length and add `endPositionBeforeTrailingTrivia` in its place
2 parents b3ead2e + d634a55 commit 6fca6e7

File tree

4 files changed

+54
-20
lines changed

4 files changed

+54
-20
lines changed

Diff for: Sources/SwiftSyntax/SourceLength.swift

+11
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,15 @@ extension AbsolutePosition {
6464
public static func +=(lhs: inout AbsolutePosition, rhs: SourceLength) {
6565
lhs = lhs + rhs
6666
}
67+
68+
public static func -(
69+
lhs: AbsolutePosition, rhs: SourceLength
70+
) -> AbsolutePosition {
71+
let utf8Offset = lhs.utf8Offset - rhs.utf8Length
72+
return AbsolutePosition(utf8Offset: utf8Offset)
73+
}
74+
75+
public static func -=(lhs: inout AbsolutePosition, rhs: SourceLength) {
76+
lhs = lhs - rhs
77+
}
6778
}

Diff for: Sources/SwiftSyntax/Syntax.swift

+12-14
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,14 @@ extension _SyntaxBase {
170170
return data.positionAfterSkippingLeadingTrivia
171171
}
172172

173-
/// The absolute position where this node (excluding its trailing trivia)
174-
/// ends.
175-
var endPosition: AbsolutePosition {
176-
return data.endPosition
173+
/// The end position of this node's content, before any trailing trivia.
174+
var endPositionBeforeTrailingTrivia: AbsolutePosition {
175+
return data.endPositionBeforeTrailingTrivia
177176
}
178177

179-
/// The absolute position where this node's trailing trivia ends
180-
var endPositionAfterTrailingTrivia: AbsolutePosition {
181-
return data.endPositionAfterTrailingTrivia
178+
/// The end position of this node, including its trivia.
179+
var endPosition: AbsolutePosition {
180+
return data.endPosition
182181
}
183182

184183
/// The textual byte length of this node including leading and trailing trivia.
@@ -384,15 +383,14 @@ extension Syntax {
384383
return base.positionAfterSkippingLeadingTrivia
385384
}
386385

387-
/// The absolute position where this node (excluding its trailing trivia)
388-
/// ends.
389-
public var endPosition: AbsolutePosition {
390-
return base.endPosition
386+
/// The end position of this node's content.
387+
public var endPositionBeforeTrailingTrivia: AbsolutePosition {
388+
return base.endPositionBeforeTrailingTrivia
391389
}
392390

393-
/// The absolute position where this node's trailing trivia ends
394-
public var endPositionAfterTrailingTrivia: AbsolutePosition {
395-
return base.endPositionAfterTrailingTrivia
391+
/// The end position of this node, including its trivia
392+
public var endPosition: AbsolutePosition {
393+
return base.endPosition
396394
}
397395

398396
/// The textual byte length of this node including leading and trailing trivia.

Diff for: Sources/SwiftSyntax/SyntaxData.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,14 @@ struct SyntaxData {
117117
return position + raw.leadingTriviaLength
118118
}
119119

120-
/// The end position of this node's content, excluding its trivia
121-
var endPosition: AbsolutePosition {
122-
return positionAfterSkippingLeadingTrivia + raw.contentLength
120+
/// The end position of this node's content, before any trailing trivia.
121+
var endPositionBeforeTrailingTrivia: AbsolutePosition {
122+
return endPosition - raw.trailingTriviaLength
123123
}
124124

125-
/// The end position of this node's trivia
126-
var endPositionAfterTrailingTrivia: AbsolutePosition {
127-
return endPosition + raw.trailingTriviaLength
125+
/// The end position of this node, including its trivia.
126+
var endPosition: AbsolutePosition {
127+
return position + raw.totalLength
128128
}
129129

130130
/// Creates a `SyntaxData` with the provided raw syntax and parent.

Diff for: Tests/SwiftSyntaxTest/SyntaxTests.swift

+25
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public class SyntaxAPITestCase: XCTestCase {
55

66
public static let allTests = [
77
("testSyntaxAPI", testSyntaxAPI),
8+
("testPositions", testPositions),
89
]
910

1011
public func testSyntaxAPI() {
@@ -63,4 +64,28 @@ public class SyntaxAPITestCase: XCTestCase {
6364
XCTAssertEqual(toks[4].uniqueIdentifier, rtoks[1].uniqueIdentifier)
6465
XCTAssertEqual(toks[5].uniqueIdentifier, rtoks[0].uniqueIdentifier)
6566
}
67+
68+
public func testPositions() {
69+
func testFuncKw(_ funcKW: TokenSyntax) {
70+
XCTAssertEqual("\(funcKW)", " func ")
71+
XCTAssertEqual(funcKW.position, AbsolutePosition(utf8Offset: 0))
72+
XCTAssertEqual(funcKW.positionAfterSkippingLeadingTrivia, AbsolutePosition(utf8Offset: 2))
73+
XCTAssertEqual(funcKW.endPositionBeforeTrailingTrivia, AbsolutePosition(utf8Offset: 6))
74+
XCTAssertEqual(funcKW.endPosition, AbsolutePosition(utf8Offset: 7))
75+
XCTAssertEqual(funcKW.contentLength, SourceLength(utf8Length: 4))
76+
}
77+
do {
78+
let source = " func f() {}"
79+
let tree = try! SyntaxParser.parse(source: source)
80+
let funcKW = tree.firstToken!
81+
testFuncKw(funcKW)
82+
}
83+
do {
84+
let leading = Trivia(pieces: [ .spaces(2) ])
85+
let trailing = Trivia(pieces: [ .spaces(1) ])
86+
let funcKW = SyntaxFactory.makeFuncKeyword(
87+
leadingTrivia: leading, trailingTrivia: trailing)
88+
testFuncKw(funcKW)
89+
}
90+
}
6691
}

0 commit comments

Comments
 (0)