@@ -44,6 +44,21 @@ struct MacroExpansion: RefactoringResponse {
4444 }
4545}
4646
47+ actor GeneratedMacroExpansionsStorage {
48+ static var shared = GeneratedMacroExpansionsStorage ( )
49+ private init ( ) { }
50+
51+ private var generatedMacroExpansions : [ String : String ] = [ : ]
52+
53+ func addOrUpdateMacroExpansion( havingBufferName bufferName: String , withContents content: String ) {
54+ generatedMacroExpansions [ bufferName] = content
55+ }
56+
57+ func retrieveAndDeleteMacroExpansion( havingBufferName bufferName: String ) -> String ? {
58+ return generatedMacroExpansions. removeValue ( forKey: bufferName)
59+ }
60+ }
61+
4762extension SwiftLanguageService {
4863 /// Handles the `ExpandMacroCommand`.
4964 ///
@@ -62,9 +77,9 @@ extension SwiftLanguageService {
6277 throw ResponseError . unknown ( " Connection to the editor closed " )
6378 }
6479
65- guard let primaryFileURL = expandMacroCommand. textDocument. uri. fileURL else {
66- throw ResponseError . unknown ( " Given URI is not a file URL " )
67- }
80+ let referenceDocumentURL = try ? ReferenceDocumentURL ( from : expandMacroCommand. textDocument. uri)
81+ let primaryFileURL =
82+ referenceDocumentURL ? . primaryFile . arbitrarySchemeURL ?? expandMacroCommand . textDocument . uri . arbitrarySchemeURL
6883
6984 let expansion = try await self . refactoring ( expandMacroCommand)
7085
@@ -74,6 +89,11 @@ extension SwiftLanguageService {
7489 var macroExpansionReferenceDocumentURLs : [ ReferenceDocumentURL ] = [ ]
7590 for macroEdit in expansion. edits {
7691 if let bufferName = macroEdit. bufferName {
92+ await GeneratedMacroExpansionsStorage . shared. addOrUpdateMacroExpansion (
93+ havingBufferName: bufferName,
94+ withContents: macroEdit. newText
95+ )
96+
7797 let macroExpansionReferenceDocumentURLData =
7898 ReferenceDocumentURL . macroExpansion (
7999 MacroExpansionReferenceDocumentURLData (
@@ -108,10 +128,24 @@ extension SwiftLanguageService {
108128 let expansionURIs = try macroExpansionReferenceDocumentURLs. map {
109129 return DocumentURI ( try $0. url)
110130 }
131+
111132 Task {
133+ let ( uri, position) =
134+ if let referenceDocumentURL, case let . macroExpansion( referenceDocumentURLData) = referenceDocumentURL {
135+ (
136+ referenceDocumentURL. primaryFile,
137+ referenceDocumentURLData. macroExpansionEditRange. lowerBound
138+ )
139+ } else {
140+ (
141+ expandMacroCommand. textDocument. uri,
142+ expandMacroCommand. positionRange. lowerBound
143+ )
144+ }
145+
112146 let req = PeekDocumentsRequest (
113- uri: expandMacroCommand . textDocument . uri,
114- position: expandMacroCommand . positionRange . lowerBound ,
147+ uri: uri,
148+ position: position ,
115149 locations: expansionURIs
116150 )
117151
@@ -179,22 +213,15 @@ extension SwiftLanguageService {
179213 }
180214 }
181215
182- func expandMacro( macroExpansionURLData: MacroExpansionReferenceDocumentURLData ) async throws -> String {
183- let expandMacroCommand = ExpandMacroCommand (
184- positionRange: macroExpansionURLData. selectionRange,
185- textDocument: TextDocumentIdentifier ( macroExpansionURLData. primaryFile)
186- )
187-
188- let expansion = try await self . refactoring ( expandMacroCommand)
189-
216+ func getMacroExpansion( macroExpansionURLData: MacroExpansionReferenceDocumentURLData ) async throws -> String {
190217 guard
191- let macroExpansionEdit = expansion . edits . filter ( {
192- $0 . bufferName == macroExpansionURLData. bufferName
193- } ) . only
218+ let content = await GeneratedMacroExpansionsStorage . shared . retrieveAndDeleteMacroExpansion (
219+ havingBufferName : macroExpansionURLData. bufferName
220+ )
194221 else {
195222 throw ResponseError . unknown ( " Macro expansion edit doesn't exist " )
196223 }
197224
198- return macroExpansionEdit . newText
225+ return content
199226 }
200227}
0 commit comments