Skip to content

Commit 62d9c34

Browse files
committed
Manually cherry-pick tests from apple/swift:
572a144 Rename byteOffset to utf8Offset and remote utf16 9323d08 [SwiftSyntax] Add accessors for source locations and test diagnostic emission (#16141)
1 parent 60e37d0 commit 62d9c34

File tree

3 files changed

+74
-21
lines changed

3 files changed

+74
-21
lines changed

Tests/SwiftSyntaxTest/AbsolutePosition.swift

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ public class AbsolutePositionTestCase: XCTestCase {
1313
XCTAssertNoThrow(try {
1414
let source = try String(contentsOf: getInput("visitor.swift"))
1515
let parsed = try SourceFileSyntax.parse(getInput("visitor.swift"))
16-
XCTAssertEqual(parsed.position.byteOffset, 0)
17-
XCTAssertEqual(parsed.eofToken.positionAfterSkippingLeadingTrivia.byteOffset,
18-
source.count)
19-
XCTAssertEqual(parsed.position.byteOffset, 0)
20-
XCTAssertEqual(parsed.byteSize, source.count)
16+
XCTAssertEqual(0, parsed.position.utf8Offset)
17+
XCTAssertEqual(source.count,
18+
parsed.eofToken.positionAfterSkippingLeadingTrivia.utf8Offset)
19+
XCTAssertEqual(0, parsed.position.utf8Offset)
20+
XCTAssertEqual(source.count, parsed.byteSize)
2121
}())
2222
}
2323

2424
public func testClosure() {
2525
XCTAssertNoThrow(try {
2626
let source = try String(contentsOf: getInput("closure.swift"))
2727
let parsed = try SourceFileSyntax.parse(getInput("closure.swift"))
28-
XCTAssertEqual(parsed.eofToken.positionAfterSkippingLeadingTrivia.byteOffset,
29-
source.count)
30-
XCTAssertEqual(parsed.position.byteOffset, 0)
31-
XCTAssertEqual(parsed.byteSize, source.count)
28+
XCTAssertEqual(source.count,
29+
parsed.eofToken.positionAfterSkippingLeadingTrivia.utf8Offset)
30+
XCTAssertEqual(0, parsed.position.utf8Offset)
31+
XCTAssertEqual(source.count, parsed.byteSize)
3232
}())
3333
}
3434

@@ -37,9 +37,9 @@ public class AbsolutePositionTestCase: XCTestCase {
3737
let parsed = try SourceFileSyntax.parse(getInput("visitor.swift"))
3838
let renamed = FuncRenamer().visit(parsed) as! SourceFileSyntax
3939
let renamedSource = renamed.description
40-
XCTAssertEqual(renamed.eofToken.positionAfterSkippingLeadingTrivia.byteOffset,
41-
renamedSource.count)
42-
XCTAssertEqual(renamed.byteSize, renamedSource.count)
40+
XCTAssertEqual(renamedSource.count,
41+
renamed.eofToken.positionAfterSkippingLeadingTrivia.utf8Offset)
42+
XCTAssertEqual(renamedSource.count, renamed.byteSize)
4343
}())
4444
}
4545

@@ -53,8 +53,8 @@ public class AbsolutePositionTestCase: XCTestCase {
5353
_ = node.positionAfterSkippingLeadingTrivia
5454
}
5555
override func visit(_ node: TokenSyntax) {
56-
XCTAssertEqual(node.position.byteOffset + node.leadingTrivia.byteSize,
57-
node.positionAfterSkippingLeadingTrivia.byteOffset)
56+
XCTAssertEqual(node.positionAfterSkippingLeadingTrivia.utf8Offset,
57+
node.position.utf8Offset + node.leadingTrivia.byteSize)
5858
}
5959
}
6060
Visitor().visit(parsed)
@@ -101,13 +101,14 @@ public class AbsolutePositionTestCase: XCTestCase {
101101
public func testTrivias() {
102102
let idx = 5
103103
let root = createSourceFile(idx + 1)
104-
XCTAssertEqual(root.leadingTrivia!.count, 3)
105-
XCTAssertEqual(root.trailingTrivia!.count, 0)
104+
XCTAssertEqual(3, root.leadingTrivia!.count)
105+
XCTAssertEqual(0, root.trailingTrivia!.count)
106106
let state = root.statements[idx]
107-
XCTAssertEqual(state.leadingTrivia!.count, 3)
108-
XCTAssertEqual(state.trailingTrivia!.count, 1)
109-
XCTAssertEqual(state.leadingTrivia!.byteSize + state.trailingTrivia!.byteSize
110-
+ state.byteSizeAfterTrimmingTrivia, state.byteSize)
107+
XCTAssertEqual(3, state.leadingTrivia!.count)
108+
XCTAssertEqual(1, state.trailingTrivia!.count)
109+
XCTAssertEqual(state.byteSize,
110+
state.leadingTrivia!.byteSize + state.trailingTrivia!.byteSize
111+
+ state.byteSizeAfterTrimmingTrivia)
111112
XCTAssertFalse(root.statements.isImplicit)
112113
}
113114

Tests/SwiftSyntaxTest/DiagnosticTest.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ extension Diagnostic.Message {
1818
/// Suggestion for the user to explicitly check a value does not equal zero.
1919
static let checkEqualToZero =
2020
Diagnostic.Message(.note, "check for explicit equality to '0'")
21+
22+
static func badFunction(_ name: TokenSyntax) -> Diagnostic.Message {
23+
return .init(.error, "bad function '\(name.text)'")
24+
}
25+
static func endOfFunction(_ name: TokenSyntax) -> Diagnostic.Message {
26+
return .init(.warning, "end of function '\(name.text)'")
27+
}
2128
}
2229

2330
public class DiagnosticsTestCase: XCTestCase {
@@ -50,4 +57,38 @@ public class DiagnosticsTestCase: XCTestCase {
5057
guard let fixIt = note.fixIts.first else { return }
5158
XCTAssertEqual(fixIt.text, " != 0")
5259
}
53-
}
60+
61+
public func testSourceLocations() {
62+
let engine = DiagnosticEngine()
63+
engine.addConsumer(PrintingDiagnosticConsumer())
64+
let url = getInput("diagnostics.swift")
65+
66+
class Visitor: SyntaxVisitor {
67+
let url: URL
68+
let engine: DiagnosticEngine
69+
init(url: URL, engine: DiagnosticEngine) {
70+
self.url = url
71+
self.engine = engine
72+
}
73+
override func visit(_ function: FunctionDeclSyntax) {
74+
let startLoc = function.identifier.startLocation(in: url)
75+
let endLoc = function.endLocation(in: url)
76+
engine.diagnose(.badFunction(function.identifier), location: startLoc) {
77+
$0.highlight(function.identifier.sourceRange(in: self.url))
78+
}
79+
engine.diagnose(.endOfFunction(function.identifier), location: endLoc)
80+
}
81+
}
82+
83+
XCTAssertNoThrow(try {
84+
let file = try SourceFileSyntax.parse(url)
85+
Visitor(url: url, engine: engine).visit(file)
86+
}())
87+
88+
XCTAssertEqual(6, engine.diagnostics.count)
89+
let lines = Set(engine.diagnostics.compactMap { $0.location?.line })
90+
XCTAssertEqual([1, 3, 5, 7, 9, 11], lines)
91+
let columns = Set(engine.diagnostics.compactMap { $0.location?.column })
92+
XCTAssertEqual([6, 2], columns)
93+
}
94+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
func foo() {
2+
3+
}
4+
5+
func bar() {
6+
7+
}
8+
9+
func baz() {
10+
11+
}

0 commit comments

Comments
 (0)