@@ -109,309 +109,6 @@ package actor SkipUnless {
109
109
}
110
110
}
111
111
112
- package static func sourcekitdHasSemanticTokensRequest(
113
- file: StaticString = #filePath,
114
- line: UInt = #line
115
- ) async throws {
116
- try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 5 , 11 ) , file: file, line: line) {
117
- let testClient = try await TestSourceKitLSPClient ( )
118
- let uri = DocumentURI ( for: . swift)
119
- testClient. openDocument ( " 0.bitPattern " , uri: uri)
120
- let response = try unwrap (
121
- await testClient. send ( DocumentSemanticTokensRequest ( textDocument: TextDocumentIdentifier ( uri) ) )
122
- )
123
-
124
- let tokens = SyntaxHighlightingTokens ( lspEncodedTokens: response. data)
125
-
126
- // If we don't have semantic token support in sourcekitd, the second token is an identifier based on the syntax
127
- // tree, not a property.
128
- return tokens. tokens != [
129
- SyntaxHighlightingToken (
130
- range: Position ( line: 0 , utf16index: 0 ) ..< Position ( line: 0 , utf16index: 1 ) ,
131
- kind: . number,
132
- modifiers: [ ]
133
- ) ,
134
- SourceKitLSP . SyntaxHighlightingToken (
135
- range: Position ( line: 0 , utf16index: 2 ) ..< Position ( line: 0 , utf16index: 12 ) ,
136
- kind: . identifier,
137
- modifiers: [ ]
138
- ) ,
139
- ]
140
- }
141
- }
142
-
143
- package static func sourcekitdSupportsRename(
144
- file: StaticString = #filePath,
145
- line: UInt = #line
146
- ) async throws {
147
- try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 5 , 11 ) , file: file, line: line) {
148
- let testClient = try await TestSourceKitLSPClient ( )
149
- let uri = DocumentURI ( for: . swift)
150
- let positions = testClient. openDocument ( " func 1️⃣test() {} " , uri: uri)
151
- do {
152
- _ = try await testClient. send (
153
- RenameRequest ( textDocument: TextDocumentIdentifier ( uri) , position: positions [ " 1️⃣ " ] , newName: " test2 " )
154
- )
155
- } catch let error as ResponseError {
156
- return error. message != " Running sourcekit-lsp with a version of sourcekitd that does not support rename "
157
- }
158
- return true
159
- }
160
- }
161
-
162
- /// Checks whether the sourcekitd contains a fix to rename labels of enum cases correctly
163
- /// (https://github.com/apple/swift/pull/74241).
164
- package static func sourcekitdCanRenameEnumCaseLabels(
165
- file: StaticString = #filePath,
166
- line: UInt = #line
167
- ) async throws {
168
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
169
- let testClient = try await TestSourceKitLSPClient ( )
170
- let uri = DocumentURI ( for: . swift)
171
- let positions = testClient. openDocument (
172
- """
173
- enum MyEnum {
174
- case 1️⃣myCase(2️⃣String)
175
- }
176
- """ ,
177
- uri: uri
178
- )
179
-
180
- let renameResult = try await testClient. send (
181
- RenameRequest ( textDocument: TextDocumentIdentifier ( uri) , position: positions [ " 1️⃣ " ] , newName: " myCase(label:) " )
182
- )
183
- return renameResult? . changes == [ uri: [ TextEdit ( range: Range ( positions [ " 2️⃣ " ] ) , newText: " label: " ) ] ]
184
- }
185
- }
186
-
187
- /// Whether clangd has support for the `workspace/indexedRename` request.
188
- package static func clangdSupportsIndexBasedRename(
189
- file: StaticString = #filePath,
190
- line: UInt = #line
191
- ) async throws {
192
- try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 5 , 11 ) , file: file, line: line) {
193
- let testClient = try await TestSourceKitLSPClient ( )
194
- let uri = DocumentURI ( for: . c)
195
- let positions = testClient. openDocument ( " void 1️⃣test() {} " , uri: uri)
196
- do {
197
- _ = try await testClient. send (
198
- IndexedRenameRequest (
199
- textDocument: TextDocumentIdentifier ( uri) ,
200
- oldName: " test " ,
201
- newName: " test2 " ,
202
- positions: [ uri: [ positions [ " 1️⃣ " ] ] ]
203
- )
204
- )
205
- } catch let error as ResponseError {
206
- return error. message != " method not found "
207
- }
208
- return true
209
- }
210
- }
211
-
212
- /// SwiftPM moved the location where it stores Swift modules to a subdirectory in
213
- /// https://github.com/swiftlang/swift-package-manager/pull/7103.
214
- package static func swiftpmStoresModulesInSubdirectory(
215
- file: StaticString = #filePath,
216
- line: UInt = #line
217
- ) async throws {
218
- try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 5 , 11 ) , file: file, line: line) {
219
- let workspace = try await SwiftPMTestProject ( files: [ " test.swift " : " " ] )
220
- try await SwiftPMTestProject . build ( at: workspace. scratchDirectory)
221
- let modulesDirectory = workspace. scratchDirectory
222
- . appendingPathComponent ( " .build " )
223
- . appendingPathComponent ( " debug " )
224
- . appendingPathComponent ( " Modules " )
225
- . appendingPathComponent ( " MyLibrary.swiftmodule " )
226
- return FileManager . default. fileExists ( at: modulesDirectory)
227
- }
228
- }
229
-
230
- package static func toolchainContainsSwiftFormat(
231
- file: StaticString = #filePath,
232
- line: UInt = #line
233
- ) async throws {
234
- try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 5 , 11 ) , file: file, line: line) {
235
- return await ToolchainRegistry . forTesting. default? . swiftFormat != nil
236
- }
237
- }
238
-
239
- /// Checks if the toolchain contains https://github.com/apple/swift/pull/74080.
240
- package static func sourcekitdReportsOverridableFunctionDefinitionsAsDynamic(
241
- file: StaticString = #filePath,
242
- line: UInt = #line
243
- ) async throws {
244
- struct ExpectedLocationsResponse : Error { }
245
-
246
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
247
- let project = try await IndexedSingleSwiftFileTestProject (
248
- """
249
- protocol TestProtocol {
250
- func 1️⃣doThing()
251
- }
252
-
253
- struct TestImpl: TestProtocol {}
254
- extension TestImpl {
255
- func 2️⃣doThing() { }
256
- }
257
- """
258
- )
259
-
260
- let response = try await project. testClient. send (
261
- DefinitionRequest ( textDocument: TextDocumentIdentifier ( project. fileURI) , position: project. positions [ " 1️⃣ " ] )
262
- )
263
- guard case . locations( let locations) = response else {
264
- throw ExpectedLocationsResponse ( )
265
- }
266
- return locations. contains { $0. range == Range ( project. positions [ " 2️⃣ " ] ) }
267
- }
268
- }
269
-
270
- package static func sourcekitdReturnsRawDocumentationResponse(
271
- file: StaticString = #filePath,
272
- line: UInt = #line
273
- ) async throws {
274
- struct ExpectedMarkdownContentsError : Error { }
275
-
276
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
277
- // The XML-based doc comment conversion did not preserve `Precondition`.
278
- let testClient = try await TestSourceKitLSPClient ( )
279
- let uri = DocumentURI ( for: . swift)
280
- let positions = testClient. openDocument (
281
- """
282
- /// - Precondition: Must have an apple
283
- func 1️⃣test() {}
284
- """ ,
285
- uri: uri
286
- )
287
- let response = try await testClient. send (
288
- HoverRequest ( textDocument: TextDocumentIdentifier ( uri) , position: positions [ " 1️⃣ " ] )
289
- )
290
- let hover = try XCTUnwrap ( response, file: file, line: line)
291
- XCTAssertEqual (
292
- hover. range,
293
- Position ( line: 1 , utf16index: 5 ) ..< Position ( line: 1 , utf16index: 9 ) ,
294
- file: file,
295
- line: line
296
- )
297
- guard case . markupContent( let content) = hover. contents else {
298
- throw ExpectedMarkdownContentsError ( )
299
- }
300
- return content. value. contains ( " Precondition " )
301
- }
302
- }
303
-
304
- /// Checks whether the index contains a fix that prevents it from adding relations to non-indexed locals
305
- /// (https://github.com/apple/swift/pull/72930).
306
- package static func indexOnlyHasContainedByRelationsToIndexedDecls(
307
- file: StaticString = #filePath,
308
- line: UInt = #line
309
- ) async throws {
310
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
311
- let project = try await IndexedSingleSwiftFileTestProject (
312
- """
313
- func foo() {}
314
-
315
- func 1️⃣testFunc(x: String) {
316
- let myVar = foo
317
- }
318
- """
319
- )
320
- let prepare = try await project. testClient. send (
321
- CallHierarchyPrepareRequest (
322
- textDocument: TextDocumentIdentifier ( project. fileURI) ,
323
- position: project. positions [ " 1️⃣ " ]
324
- )
325
- )
326
- let initialItem = try XCTUnwrap ( prepare? . only)
327
- let calls = try await project. testClient. send ( CallHierarchyOutgoingCallsRequest ( item: initialItem) )
328
- return calls != [ ]
329
- }
330
- }
331
-
332
- public static func swiftPMSupportsExperimentalPrepareForIndexing(
333
- file: StaticString = #filePath,
334
- line: UInt = #line
335
- ) async throws {
336
- struct NoSwiftInToolchain : Error { }
337
-
338
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
339
- guard let swift = await ToolchainRegistry . forTesting. default? . swift else {
340
- throw NoSwiftInToolchain ( )
341
- }
342
-
343
- let result = try await Process . run (
344
- arguments: [ swift. filePath, " build " , " --help-hidden " ] ,
345
- workingDirectory: nil
346
- )
347
- guard let output = String ( bytes: try result. output. get ( ) , encoding: . utf8) else {
348
- return false
349
- }
350
- return output. contains ( " --experimental-prepare-for-indexing " )
351
- }
352
- }
353
-
354
- package static func swiftPMStoresModulesForTargetAndHostInSeparateFolders(
355
- file: StaticString = #filePath,
356
- line: UInt = #line
357
- ) async throws {
358
- struct NoSwiftInToolchain : Error { }
359
-
360
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
361
- guard let swift = await ToolchainRegistry . forTesting. default? . swift else {
362
- throw NoSwiftInToolchain ( )
363
- }
364
-
365
- let project = try await SwiftPMTestProject (
366
- files: [
367
- " Lib/MyFile.swift " : """
368
- public func foo() {}
369
- """ ,
370
- " MyExec/MyExec.swift " : """
371
- import Lib
372
- func bar() {
373
- foo()
374
- }
375
- """ ,
376
- " Plugins/MyPlugin/MyPlugin.swift " : " " ,
377
- ] ,
378
- manifest: """
379
- let package = Package(
380
- name: " MyLibrary " ,
381
- targets: [
382
- .target(name: " Lib " ),
383
- .executableTarget(name: " MyExec " , dependencies: [ " Lib " ]),
384
- .plugin(
385
- name: " MyPlugin " ,
386
- capability: .command(
387
- intent: .sourceCodeFormatting(),
388
- permissions: []
389
- ),
390
- dependencies: [ " MyExec " ]
391
- )
392
- ]
393
- )
394
- """
395
- )
396
- do {
397
- // In older version of SwiftPM building `MyPlugin` followed by `Lib` resulted in an error about a redefinition
398
- // of Lib when building Lib.
399
- for target in [ " MyPlugin " , " Lib " ] {
400
- var arguments = [
401
- try swift. filePath, " build " , " --package-path " , try project. scratchDirectory. filePath, " --target " , target,
402
- ]
403
- if let globalModuleCache = try globalModuleCache {
404
- arguments += [ " -Xswiftc " , " -module-cache-path " , " -Xswiftc " , try globalModuleCache. filePath]
405
- }
406
- try await Process. run ( arguments: arguments, workingDirectory: nil )
407
- }
408
- return true
409
- } catch {
410
- return false
411
- }
412
- }
413
- }
414
-
415
112
/// A long test is a test that takes longer than 1-2s to execute.
416
113
package static func longTestsEnabled( ) throws {
417
114
if let value = ProcessInfo . processInfo. environment [ " SKIP_LONG_TESTS " ] , value == " 1 " || value == " YES " {
@@ -541,37 +238,6 @@ package actor SkipUnless {
541
238
}
542
239
}
543
240
544
- /// Checks if sourcekitd contains https://github.com/swiftlang/swift/pull/71049
545
- package static func solverBasedCursorInfoWorksForMemoryOnlyFiles(
546
- file: StaticString = #filePath,
547
- line: UInt = #line
548
- ) async throws {
549
- struct ExpectedLocationsResponse : Error { }
550
-
551
- return try await shared. skipUnlessSupportedByToolchain ( swiftVersion: SwiftVersion ( 6 , 0 ) , file: file, line: line) {
552
- let testClient = try await TestSourceKitLSPClient ( )
553
- let uri = DocumentURI ( for: . swift)
554
- let positions = testClient. openDocument (
555
- """
556
- func foo() -> Int { 1 }
557
- func foo() -> String { " " }
558
- func test() {
559
- _ = 3️⃣foo()
560
- }
561
- """ ,
562
- uri: uri
563
- )
564
-
565
- let response = try await testClient. send (
566
- DefinitionRequest ( textDocument: TextDocumentIdentifier ( uri) , position: positions [ " 3️⃣ " ] )
567
- )
568
- guard case . locations( let locations) = response else {
569
- throw ExpectedLocationsResponse ( )
570
- }
571
- return locations. count > 0
572
- }
573
- }
574
-
575
241
package static func sourcekitdSupportsPlugin(
576
242
file: StaticString = #filePath,
577
243
line: UInt = #line
0 commit comments