@@ -16,82 +16,83 @@ import LanguageServerProtocol
16
16
import SKSupport
17
17
import SourceKitD
18
18
19
- struct InterfaceInfo {
19
+ struct GeneratedInterfaceInfo {
20
20
var contents : String
21
21
}
22
22
23
23
extension SwiftLanguageService {
24
- public func openInterface ( _ request : OpenInterfaceRequest ) async throws -> InterfaceDetails ? {
25
- let uri = request. textDocument . uri
26
- let moduleName = request . moduleName
24
+ public func openGeneratedInterface (
25
+ _ request: OpenGeneratedInterfaceRequest
26
+ ) async throws -> GeneratedInterfaceDetails ? {
27
27
let name = request. name
28
28
let symbol = request. symbolUSR
29
29
let interfaceFilePath = self . generatedInterfacesPath. appendingPathComponent ( " \( name) .swiftinterface " )
30
30
let interfaceDocURI = DocumentURI ( interfaceFilePath)
31
31
// has interface already been generated
32
32
if let snapshot = try ? self . documentManager. latestSnapshot ( interfaceDocURI) {
33
- return await self . interfaceDetails ( request: request, uri: interfaceDocURI, snapshot: snapshot, symbol: symbol)
33
+ return await self . generatedInterfaceDetails (
34
+ request: request,
35
+ uri: interfaceDocURI,
36
+ snapshot: snapshot,
37
+ symbol: symbol
38
+ )
34
39
} else {
35
- // generate interface
36
- let interfaceInfo = try await self . openInterface (
40
+ let interfaceInfo = try await self . generatedInterfaceInfo ( request: request, interfaceURI: interfaceDocURI)
41
+ try interfaceInfo. contents. write ( to: interfaceFilePath, atomically: true , encoding: String . Encoding. utf8)
42
+ let snapshot = DocumentSnapshot (
43
+ uri: interfaceDocURI,
44
+ language: . swift,
45
+ version: 0 ,
46
+ lineTable: LineTable ( interfaceInfo. contents)
47
+ )
48
+ let result = await self . generatedInterfaceDetails (
37
49
request: request,
38
- uri: uri ,
39
- name : moduleName ,
40
- interfaceURI : interfaceDocURI
50
+ uri: interfaceDocURI ,
51
+ snapshot : snapshot ,
52
+ symbol : symbol
41
53
)
42
- do {
43
- // write to file
44
- try interfaceInfo. contents. write ( to: interfaceFilePath, atomically: true , encoding: String . Encoding. utf8)
45
- // store snapshot
46
- let snapshot = try self . documentManager. open (
47
- interfaceDocURI,
48
- language: . swift,
49
- version: 0 ,
50
- text: interfaceInfo. contents
51
- )
52
- return await self . interfaceDetails ( request: request, uri: interfaceDocURI, snapshot: snapshot, symbol: symbol)
53
- } catch {
54
- throw ResponseError . unknown ( error. localizedDescription)
54
+ _ = await orLog ( " Closing generated interface " ) {
55
+ try await self . sourcekitd. send ( closeDocumentSourcekitdRequest ( uri: interfaceDocURI) , fileContents: nil )
55
56
}
57
+ return result
56
58
}
57
59
}
58
60
59
61
/// Open the Swift interface for a module.
60
62
///
61
63
/// - Parameters:
62
- /// - request: The OpenInterfaceRequest.
63
- /// - uri: The document whose compiler arguments should be used to generate the interface.
64
- /// - name: The name of the module whose interface should be generated.
64
+ /// - request: The OpenGeneratedInterfaceRequest.
65
65
/// - interfaceURI: The file where the generated interface should be written.
66
- private func openInterface(
67
- request: OpenInterfaceRequest ,
68
- uri: DocumentURI ,
69
- name: String ,
66
+ ///
67
+ /// - Important: This opens a document with name `interfaceURI.pseudoPath` in sourcekitd. The caller is responsible
68
+ /// for ensuring that the document will eventually get closed in sourcekitd again.
69
+ private func generatedInterfaceInfo(
70
+ request: OpenGeneratedInterfaceRequest ,
70
71
interfaceURI: DocumentURI
71
- ) async throws -> InterfaceInfo {
72
+ ) async throws -> GeneratedInterfaceInfo {
72
73
let keys = self . keys
73
74
let skreq = sourcekitd. dictionary ( [
74
75
keys. request: requests. editorOpenInterface,
75
- keys. moduleName: name ,
76
+ keys. moduleName: request . moduleName ,
76
77
keys. groupName: request. groupName,
77
78
keys. name: interfaceURI. pseudoPath,
78
79
keys. synthesizedExtension: 1 ,
79
- keys. compilerArgs: await self . buildSettings ( for: uri) ? . compilerArgs as [ SKDRequestValue ] ? ,
80
+ keys. compilerArgs: await self . buildSettings ( for: request . textDocument . uri) ? . compilerArgs as [ SKDRequestValue ] ? ,
80
81
] )
81
82
82
83
let dict = try await self . sourcekitd. send ( skreq, fileContents: nil )
83
- return InterfaceInfo ( contents: dict [ keys. sourceText] ?? " " )
84
+ return GeneratedInterfaceInfo ( contents: dict [ keys. sourceText] ?? " " )
84
85
}
85
86
86
- private func interfaceDetails (
87
- request: OpenInterfaceRequest ,
87
+ private func generatedInterfaceDetails (
88
+ request: OpenGeneratedInterfaceRequest ,
88
89
uri: DocumentURI ,
89
90
snapshot: DocumentSnapshot ,
90
91
symbol: String ?
91
- ) async -> InterfaceDetails {
92
+ ) async -> GeneratedInterfaceDetails {
92
93
do {
93
94
guard let symbol = symbol else {
94
- return InterfaceDetails ( uri: uri, position: nil )
95
+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
95
96
}
96
97
let keys = self . keys
97
98
let skreq = sourcekitd. dictionary ( [
@@ -102,12 +103,12 @@ extension SwiftLanguageService {
102
103
103
104
let dict = try await self . sourcekitd. send ( skreq, fileContents: snapshot. text)
104
105
if let offset: Int = dict [ keys. offset] {
105
- return InterfaceDetails ( uri: uri, position: snapshot. positionOf ( utf8Offset: offset) )
106
+ return GeneratedInterfaceDetails ( uri: uri, position: snapshot. positionOf ( utf8Offset: offset) )
106
107
} else {
107
- return InterfaceDetails ( uri: uri, position: nil )
108
+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
108
109
}
109
110
} catch {
110
- return InterfaceDetails ( uri: uri, position: nil )
111
+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
111
112
}
112
113
}
113
114
}
0 commit comments