@@ -16,82 +16,83 @@ import LanguageServerProtocol
1616import SKSupport
1717import SourceKitD
1818
19- struct InterfaceInfo {
19+ struct GeneratedInterfaceInfo {
2020 var contents : String
2121}
2222
2323extension 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 ? {
2727 let name = request. name
2828 let symbol = request. symbolUSR
2929 let interfaceFilePath = self . generatedInterfacesPath. appendingPathComponent ( " \( name) .swiftinterface " )
3030 let interfaceDocURI = DocumentURI ( interfaceFilePath)
3131 // has interface already been generated
3232 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+ )
3439 } 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 (
3749 request: request,
38- uri: uri ,
39- name : moduleName ,
40- interfaceURI : interfaceDocURI
50+ uri: interfaceDocURI ,
51+ snapshot : snapshot ,
52+ symbol : symbol
4153 )
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 )
5556 }
57+ return result
5658 }
5759 }
5860
5961 /// Open the Swift interface for a module.
6062 ///
6163 /// - 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.
6565 /// - 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 ,
7071 interfaceURI: DocumentURI
71- ) async throws -> InterfaceInfo {
72+ ) async throws -> GeneratedInterfaceInfo {
7273 let keys = self . keys
7374 let skreq = sourcekitd. dictionary ( [
7475 keys. request: requests. editorOpenInterface,
75- keys. moduleName: name ,
76+ keys. moduleName: request . moduleName ,
7677 keys. groupName: request. groupName,
7778 keys. name: interfaceURI. pseudoPath,
7879 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 ] ? ,
8081 ] )
8182
8283 let dict = try await self . sourcekitd. send ( skreq, fileContents: nil )
83- return InterfaceInfo ( contents: dict [ keys. sourceText] ?? " " )
84+ return GeneratedInterfaceInfo ( contents: dict [ keys. sourceText] ?? " " )
8485 }
8586
86- private func interfaceDetails (
87- request: OpenInterfaceRequest ,
87+ private func generatedInterfaceDetails (
88+ request: OpenGeneratedInterfaceRequest ,
8889 uri: DocumentURI ,
8990 snapshot: DocumentSnapshot ,
9091 symbol: String ?
91- ) async -> InterfaceDetails {
92+ ) async -> GeneratedInterfaceDetails {
9293 do {
9394 guard let symbol = symbol else {
94- return InterfaceDetails ( uri: uri, position: nil )
95+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
9596 }
9697 let keys = self . keys
9798 let skreq = sourcekitd. dictionary ( [
@@ -102,12 +103,12 @@ extension SwiftLanguageService {
102103
103104 let dict = try await self . sourcekitd. send ( skreq, fileContents: snapshot. text)
104105 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) )
106107 } else {
107- return InterfaceDetails ( uri: uri, position: nil )
108+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
108109 }
109110 } catch {
110- return InterfaceDetails ( uri: uri, position: nil )
111+ return GeneratedInterfaceDetails ( uri: uri, position: nil )
111112 }
112113 }
113114}
0 commit comments