Skip to content

Commit 061c7a0

Browse files
committed
[SwiftLanguageService] CodeActions: Use asWorkspaceEdit in more places
1 parent 0594744 commit 061c7a0

File tree

2 files changed

+56
-46
lines changed

2 files changed

+56
-46
lines changed

Sources/SwiftLanguageService/CodeActions/PackageManifestEdits.swift

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,20 @@ struct PackageManifestEdits: SyntaxCodeActionProvider {
5050
type: type
5151
)
5252

53-
let edits = try AddPackageTarget.textRefactor(
54-
syntax: scope.file,
55-
in: .init(target: target)
56-
)
53+
guard
54+
let edit = try AddPackageTarget.textRefactor(
55+
syntax: scope.file,
56+
in: .init(target: target)
57+
).asWorkspaceEdit(snapshot: scope.snapshot)
58+
else {
59+
continue
60+
}
5761

5862
actions.append(
5963
CodeAction(
6064
title: "Add \(name) target",
6165
kind: .refactor,
62-
edit: edits.asWorkspaceEdit(snapshot: scope.snapshot)
66+
edit: edit
6367
)
6468
)
6569
}
@@ -98,16 +102,20 @@ struct PackageManifestEdits: SyntaxCodeActionProvider {
98102
dependencies: [.byName(name: targetName)],
99103
)
100104

101-
let edits = try AddPackageTarget.textRefactor(
102-
syntax: scope.file,
103-
in: .init(target: target, testHarness: testingLibrary)
104-
)
105+
guard
106+
let edit = try AddPackageTarget.textRefactor(
107+
syntax: scope.file,
108+
in: .init(target: target, testHarness: testingLibrary)
109+
).asWorkspaceEdit(snapshot: scope.snapshot)
110+
else {
111+
continue
112+
}
105113

106114
actions.append(
107115
CodeAction(
108116
title: "Add test target (\(libraryName))",
109117
kind: .refactor,
110-
edit: edits.asWorkspaceEdit(snapshot: scope.snapshot)
118+
edit: edit
111119
)
112120
)
113121
}
@@ -151,16 +159,20 @@ struct PackageManifestEdits: SyntaxCodeActionProvider {
151159
targets: [targetName]
152160
)
153161

154-
let edits = try AddProduct.textRefactor(
155-
syntax: scope.file,
156-
in: .init(product: product)
157-
)
162+
guard
163+
let edit = try AddProduct.textRefactor(
164+
syntax: scope.file,
165+
in: .init(product: product)
166+
).asWorkspaceEdit(snapshot: scope.snapshot)
167+
else {
168+
return []
169+
}
158170

159171
return [
160172
CodeAction(
161173
title: "Add product to export this target",
162174
kind: .refactor,
163-
edit: edits.asWorkspaceEdit(snapshot: scope.snapshot)
175+
edit: edit
164176
)
165177
]
166178
} catch {
@@ -175,24 +187,6 @@ struct PackageManifestEdits: SyntaxCodeActionProvider {
175187
]
176188
}
177189

178-
fileprivate extension [SourceEdit] {
179-
/// Translate package manifest edits into a workspace edit.
180-
/// `snapshot` is the latest snapshot of the `Package.swift` file.
181-
func asWorkspaceEdit(snapshot: DocumentSnapshot) -> WorkspaceEdit {
182-
// The edits to perform on the manifest itself.
183-
let manifestTextEdits = map { edit in
184-
TextEdit(
185-
range: snapshot.absolutePositionRange(of: edit.range),
186-
newText: edit.replacement
187-
)
188-
}
189-
190-
return WorkspaceEdit(
191-
changes: [snapshot.uri: manifestTextEdits]
192-
)
193-
}
194-
}
195-
196190
fileprivate extension SyntaxProtocol {
197191
// Find an enclosing call syntax expression.
198192
func findEnclosingCall() -> FunctionCallExprSyntax? {

Sources/SwiftLanguageService/CodeActions/SyntaxRefactoringCodeActionProvider.swift

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,15 @@ extension SyntaxRefactoringCodeActionProvider where Self.Context == Void {
3737
return []
3838
}
3939

40-
let textEdits = sourceEdits.compactMap { (edit) -> TextEdit? in
41-
let edit = TextEdit(
42-
range: scope.snapshot.absolutePositionRange(of: edit.range),
43-
newText: edit.replacement
44-
)
45-
if edit.isNoOp(in: scope.snapshot) {
46-
return nil
47-
}
48-
return edit
49-
}
50-
51-
if textEdits.isEmpty {
40+
guard let workspaceEdit = sourceEdits.asWorkspaceEdit(snapshot: scope.snapshot) else {
5241
return []
5342
}
5443

5544
return [
5645
CodeAction(
5746
title: Self.title,
5847
kind: .refactorInline,
59-
edit: WorkspaceEdit(changes: [scope.snapshot.uri: textEdits])
48+
edit: workspaceEdit
6049
)
6150
]
6251
}
@@ -140,3 +129,30 @@ extension SyntaxProtocol {
140129
return nil
141130
}
142131
}
132+
133+
extension [SourceEdit] {
134+
/// Translate source edits into a workspace edit.
135+
/// `snapshot` is the latest snapshot of the document to which these edits belong.
136+
func asWorkspaceEdit(snapshot: DocumentSnapshot) -> WorkspaceEdit? {
137+
let textEdits = compactMap { edit -> TextEdit? in
138+
let edit = TextEdit(
139+
range: snapshot.absolutePositionRange(of: edit.range),
140+
newText: edit.replacement
141+
)
142+
143+
if edit.isNoOp(in: snapshot) {
144+
return nil
145+
}
146+
147+
return edit
148+
}
149+
150+
if textEdits.isEmpty {
151+
return nil
152+
}
153+
154+
return WorkspaceEdit(
155+
changes: [snapshot.uri: textEdits]
156+
)
157+
}
158+
}

0 commit comments

Comments
 (0)