Skip to content

Commit 4bff560

Browse files
authored
Merge pull request #1250 from kimdv/kimdv/2532-merge-incrementaledit-and-sourceedit
Use new API's from SwiftSyntax SourceEdit
2 parents 0e0ef0d + ed61630 commit 4bff560

11 files changed

+37
-42
lines changed

Sources/SourceKitLSP/Rename.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ extension SwiftLanguageService {
989989
}
990990

991991
if let startToken, let endToken {
992-
return snapshot.range(
992+
return snapshot.absolutePositionRange(
993993
of: startToken.positionAfterSkippingLeadingTrivia..<endToken.endPositionBeforeTrailingTrivia
994994
)
995995
}

Sources/SourceKitLSP/Swift/AdjustPositionToStartOfIdentifier.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ extension SwiftLanguageService {
5656
let visitor = StartOfIdentifierFinder(position: snapshot.absolutePosition(of: position))
5757
visitor.walk(tree)
5858
if let resolvedPosition = visitor.resolvedPosition {
59-
return snapshot.position(of: resolvedPosition) ?? position
59+
return snapshot.position(of: resolvedPosition)
6060
}
6161
return position
6262
}

Sources/SourceKitLSP/Swift/CodeActions/PackageManifestEdits.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ fileprivate extension PackageEditResult {
138138
// The edits to perform on the manifest itself.
139139
let manifestTextEdits = manifestEdits.map { edit in
140140
TextEdit(
141-
range: snapshot.range(of: edit.range),
141+
range: snapshot.absolutePositionRange(of: edit.range),
142142
newText: edit.replacement
143143
)
144144
}

Sources/SourceKitLSP/Swift/CodeActions/SyntaxRefactoringCodeActionProvider.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ extension SyntaxRefactoringCodeActionProvider where Self.Context == Void {
3636

3737
let textEdits = sourceEdits.compactMap { (edit) -> TextEdit? in
3838
let edit = TextEdit(
39-
range: scope.snapshot.range(of: edit.range),
39+
range: scope.snapshot.absolutePositionRange(of: edit.range),
4040
newText: edit.replacement
4141
)
4242
if edit.isNoOp(in: scope.snapshot) {

Sources/SourceKitLSP/Swift/Diagnostic.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ extension CodeAction {
6161
init?(_ fixIt: FixIt, in snapshot: DocumentSnapshot) {
6262
var textEdits = [TextEdit]()
6363
for edit in fixIt.edits {
64-
textEdits.append(TextEdit(range: snapshot.range(of: edit.range), newText: edit.replacement))
64+
textEdits.append(TextEdit(range: snapshot.absolutePositionRange(of: edit.range), newText: edit.replacement))
6565
}
6666

6767
self.init(
@@ -281,7 +281,7 @@ extension Diagnostic {
281281
var range = Range(snapshot.position(of: diag.position))
282282
for highlight in diag.highlights {
283283
let swiftSyntaxRange = highlight.positionAfterSkippingLeadingTrivia..<highlight.endPositionBeforeTrailingTrivia
284-
let highlightRange = snapshot.range(of: swiftSyntaxRange)
284+
let highlightRange = snapshot.absolutePositionRange(of: swiftSyntaxRange)
285285
if range.upperBound == highlightRange.lowerBound {
286286
range = range.lowerBound..<highlightRange.upperBound
287287
} else {
@@ -345,7 +345,7 @@ extension DiagnosticRelatedInformation {
345345
init(_ note: Note, in snapshot: DocumentSnapshot) {
346346
let nodeRange = note.node.positionAfterSkippingLeadingTrivia..<note.node.endPositionBeforeTrailingTrivia
347347
self.init(
348-
location: Location(uri: snapshot.uri, range: snapshot.range(of: nodeRange)),
348+
location: Location(uri: snapshot.uri, range: snapshot.absolutePositionRange(of: nodeRange)),
349349
message: note.message
350350
)
351351
}

Sources/SourceKitLSP/Swift/DocumentFormatting.swift

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,29 +106,19 @@ private func edits(from original: DocumentSnapshot, to edited: String) -> [TextE
106106
switch change {
107107
case .insert(offset: let offset, element: let element, associatedWith: _):
108108
let absolutePosition = AbsolutePosition(utf8Offset: offset)
109-
return IncrementalEdit(range: absolutePosition..<absolutePosition, replacement: [element])
109+
return SourceEdit(range: absolutePosition..<absolutePosition, replacement: [element])
110110
case .remove(offset: let offset, element: _, associatedWith: _):
111111
let absolutePosition = AbsolutePosition(utf8Offset: offset)
112-
return IncrementalEdit(range: absolutePosition..<absolutePosition.advanced(by: 1), replacement: [])
112+
return SourceEdit(range: absolutePosition..<absolutePosition.advanced(by: 1), replacement: [])
113113
}
114114
}
115115

116116
let concurrentEdits = ConcurrentEdits(fromSequential: sequentialEdits)
117117

118118
// Map the offset-based edits to line-column based edits to be consumed by LSP
119119

120-
return concurrentEdits.edits.compactMap { (edit) -> TextEdit? in
121-
let (startLine, startColumn) = original.lineTable.lineAndUTF16ColumnOf(utf8Offset: edit.offset)
122-
let (endLine, endColumn) = original.lineTable.lineAndUTF16ColumnOf(utf8Offset: edit.endOffset)
123-
guard let newText = String(bytes: edit.replacement, encoding: .utf8) else {
124-
logger.fault("Failed to get String from UTF-8 bytes \(edit.replacement)")
125-
return nil
126-
}
127-
128-
return TextEdit(
129-
range: Position(line: startLine, utf16index: startColumn)..<Position(line: endLine, utf16index: endColumn),
130-
newText: newText
131-
)
120+
return concurrentEdits.edits.compactMap {
121+
TextEdit(range: original.absolutePositionRange(of: $0.range), newText: $0.replacement)
132122
}
133123
}
134124

Sources/SourceKitLSP/Swift/DocumentSymbols.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ fileprivate final class DocumentSymbolsFinder: SyntaxAnyVisitor {
7474
if !self.range.overlaps(range) {
7575
return .skipChildren
7676
}
77-
let positionRange = snapshot.range(of: range)
78-
let selectionPositionRange = snapshot.range(of: selection)
77+
let positionRange = snapshot.absolutePositionRange(of: range)
78+
let selectionPositionRange = snapshot.absolutePositionRange(of: selection)
7979

8080
// Record MARK comments on the node's leading and trailing trivia in `result` not as a child of `node`.
8181
visit(node.leadingTrivia, position: node.position)
@@ -141,7 +141,9 @@ fileprivate final class DocumentSymbolsFinder: SyntaxAnyVisitor {
141141
let trimmedComment = commentText.trimmingCharacters(in: CharacterSet(["/", "*"]).union(.whitespaces))
142142
if trimmedComment.starts(with: markPrefix) {
143143
let markText = trimmedComment.dropFirst(markPrefix.count)
144-
let range = snapshot.range(of: position..<position.advanced(by: piece.sourceLength.utf8Length))
144+
let range = snapshot.absolutePositionRange(
145+
of: position..<position.advanced(by: piece.sourceLength.utf8Length)
146+
)
145147
result.append(
146148
DocumentSymbol(
147149
name: String(markText),

Sources/SourceKitLSP/Swift/SemanticTokens.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ extension SwiftLanguageService {
5858
if let range = range.flatMap({ snapshot.byteSourceRange(of: $0) }) {
5959
range
6060
} else {
61-
ByteSourceRange(offset: 0, length: await tree.totalLength.utf8Length)
61+
await tree.range
6262
}
6363

6464
let tokens =
@@ -107,7 +107,7 @@ extension SyntaxClassifiedRange {
107107
return SyntaxHighlightingTokens(tokens: [])
108108
}
109109

110-
let multiLineRange = snapshot.positionOf(utf8Offset: self.offset)..<snapshot.positionOf(utf8Offset: self.endOffset)
110+
let multiLineRange = snapshot.absolutePositionRange(of: self.range)
111111
let ranges = multiLineRange.splitToSingleLineRanges(in: snapshot)
112112

113113
let tokens = ranges.map {

Sources/SourceKitLSP/Swift/SwiftLanguageService.swift

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ extension SwiftLanguageService {
537537
keys.enableDiagnostics: 0,
538538
keys.syntacticOnly: 1,
539539
keys.offset: edit.range.lowerBound.utf8Offset,
540-
keys.length: edit.length.utf8Length,
540+
keys.length: edit.range.length.utf8Length,
541541
keys.sourceText: edit.replacement,
542542
])
543543
do {
@@ -553,13 +553,7 @@ extension SwiftLanguageService {
553553
}
554554

555555
let concurrentEdits = ConcurrentEdits(
556-
fromSequential: edits.map {
557-
IncrementalEdit(
558-
offset: $0.range.lowerBound.utf8Offset,
559-
length: $0.length.utf8Length,
560-
replacementLength: $0.replacement.utf8.count
561-
)
562-
}
556+
fromSequential: edits
563557
)
564558
await syntaxTreeManager.registerEdit(
565559
preEditSnapshot: preEditSnapshot,
@@ -690,7 +684,7 @@ extension SwiftLanguageService {
690684

691685
result.append(
692686
ColorInformation(
693-
range: snapshot.range(of: node.position..<node.endPosition),
687+
range: snapshot.absolutePositionRange(of: node.position..<node.endPosition),
694688
color: Color(red: red, green: green, blue: blue, alpha: alpha)
695689
)
696690
)
@@ -1138,7 +1132,7 @@ extension DocumentSnapshot {
11381132
/// If the bounds of the range do not refer to a valid positions with in the snapshot, this function adjusts them to
11391133
/// the closest valid positions and logs a fault containing the file and line of the caller (from `callerFile` and
11401134
/// `callerLine`).
1141-
func range(
1135+
func absolutePositionRange(
11421136
of range: Range<AbsolutePosition>,
11431137
callerFile: StaticString = #fileID,
11441138
callerLine: UInt = #line
@@ -1169,9 +1163,12 @@ extension DocumentSnapshot {
11691163
of range: Range<Position>,
11701164
callerFile: StaticString = #fileID,
11711165
callerLine: UInt = #line
1172-
) -> ByteSourceRange {
1166+
) -> Range<AbsolutePosition> {
11731167
let utf8OffsetRange = utf8OffsetRange(of: range, callerFile: callerFile, callerLine: callerLine)
1174-
return ByteSourceRange(offset: utf8OffsetRange.startIndex, length: utf8OffsetRange.count)
1168+
return Range<AbsolutePosition>(
1169+
position: AbsolutePosition(utf8Offset: utf8OffsetRange.startIndex),
1170+
length: SourceLength(utf8Length: utf8OffsetRange.count)
1171+
)
11751172
}
11761173

11771174
// MARK: Position <-> RenameLocation

Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor {
248248
return .skipChildren
249249
}
250250

251-
let range = snapshot.range(of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia)
251+
let range = snapshot.absolutePositionRange(
252+
of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia
253+
)
252254
// Members won't be extensions since extensions will only be at the top level.
253255
let testItem = AnnotatedTestItem(
254256
testItem: TestItem(
@@ -306,7 +308,9 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor {
306308
let name =
307309
node.name.text + "(" + node.signature.parameterClause.parameters.map { "\($0.firstName.text):" }.joined() + ")"
308310

309-
let range = snapshot.range(of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia)
311+
let range = snapshot.absolutePositionRange(
312+
of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia
313+
)
310314
let testItem = AnnotatedTestItem(
311315
testItem: TestItem(
312316
id: (parentTypeNames + [name]).joined(separator: "/"),

Sources/SourceKitLSP/TestDiscovery.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ final class SyntacticSwiftXCTestScanner: SyntaxVisitor {
402402
// declarations are probably less common than helper functions that start with `test` and have a return type.
403403
return nil
404404
}
405-
let range = snapshot.range(
405+
let range = snapshot.absolutePositionRange(
406406
of: function.positionAfterSkippingLeadingTrivia..<function.endPositionBeforeTrailingTrivia
407407
)
408408

@@ -436,7 +436,9 @@ final class SyntacticSwiftXCTestScanner: SyntaxVisitor {
436436
// Don't report a test class if it doesn't contain any test methods.
437437
return .visitChildren
438438
}
439-
let range = snapshot.range(of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia)
439+
let range = snapshot.absolutePositionRange(
440+
of: node.positionAfterSkippingLeadingTrivia..<node.endPositionBeforeTrailingTrivia
441+
)
440442
let testItem = AnnotatedTestItem(
441443
testItem: TestItem(
442444
id: node.name.text,

0 commit comments

Comments
 (0)