@@ -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+ var primaryFileURL = expandMacroCommand. textDocument. uri. arbitrarySchemeURL
81+ let referenceDocumentURL = try ? ReferenceDocumentURL ( from : expandMacroCommand . textDocument . uri )
82+ primaryFileURL = referenceDocumentURL ? . primaryFile . arbitrarySchemeURL ?? primaryFileURL
6883
6984 let expansion = try await self . refactoring ( expandMacroCommand)
7085
@@ -74,15 +89,32 @@ 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 =
78- ReferenceDocumentURL . macroExpansion (
79- MacroExpansionReferenceDocumentURLData (
80- macroExpansionEditRange: macroEdit. range,
81- primaryFileURL: primaryFileURL,
82- selectionRange: expandMacroCommand. positionRange,
83- bufferName: bufferName
98+ switch referenceDocumentURL {
99+ case . macroExpansion( let parentReferenceDocument) :
100+ ReferenceDocumentURL . macroExpansion (
101+ MacroExpansionReferenceDocumentURLData (
102+ macroExpansionEditRange: macroEdit. range,
103+ primaryFileURL: primaryFileURL,
104+ selectionRange: expandMacroCommand. positionRange,
105+ bufferName: bufferName
106+ )
84107 )
85- )
108+ case nil :
109+ ReferenceDocumentURL . macroExpansion (
110+ MacroExpansionReferenceDocumentURLData (
111+ macroExpansionEditRange: macroEdit. range,
112+ primaryFileURL: primaryFileURL,
113+ selectionRange: expandMacroCommand. positionRange,
114+ bufferName: bufferName
115+ )
116+ )
117+ }
86118
87119 macroExpansionReferenceDocumentURLs. append ( macroExpansionReferenceDocumentURLData)
88120
@@ -108,10 +140,19 @@ extension SwiftLanguageService {
108140 let expansionURIs = try macroExpansionReferenceDocumentURLs. map {
109141 return DocumentURI ( try $0. url)
110142 }
143+
111144 Task {
145+ var uri = expandMacroCommand. textDocument. uri
146+ var position = expandMacroCommand. positionRange. lowerBound
147+
148+ if let referenceDocumentURL, case let . macroExpansion( referenceDocumentURLData) = referenceDocumentURL {
149+ uri = referenceDocumentURL. primaryFile
150+ position = referenceDocumentURLData. macroExpansionEditRange. lowerBound
151+ }
152+
112153 let req = PeekDocumentsRequest (
113- uri: expandMacroCommand . textDocument . uri,
114- position: expandMacroCommand . positionRange . lowerBound ,
154+ uri: uri,
155+ position: position ,
115156 locations: expansionURIs
116157 )
117158
@@ -180,21 +221,14 @@ extension SwiftLanguageService {
180221 }
181222
182223 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-
190224 guard
191- let macroExpansionEdit = expansion . edits . filter ( {
192- $0 . bufferName == macroExpansionURLData. bufferName
193- } ) . only
225+ let content = await GeneratedMacroExpansionsStorage . shared . retrieveAndDeleteMacroExpansion (
226+ havingBufferName : macroExpansionURLData. bufferName
227+ )
194228 else {
195229 throw ResponseError . unknown ( " Macro expansion edit doesn't exist " )
196230 }
197231
198- return macroExpansionEdit . newText
232+ return content
199233 }
200234}
0 commit comments