|
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
13 | 13 | @_spi(PluginMessage) import SwiftCompilerPluginMessageHandling |
14 | | -import SwiftSyntaxMacros |
15 | | -import CSwiftPluginServer |
| 14 | +@_spi(PluginMessage) import SwiftLibraryPluginProvider |
16 | 15 |
|
17 | 16 | @main |
18 | 17 | final class SwiftPluginServer { |
19 | | - struct MacroRef: Hashable { |
20 | | - var moduleName: String |
21 | | - var typeName: String |
22 | | - init(_ moduleName: String, _ typeName: String) { |
23 | | - self.moduleName = moduleName |
24 | | - self.typeName = typeName |
25 | | - } |
26 | | - } |
27 | | - |
28 | | - struct LoadedLibraryPlugin { |
29 | | - var libraryPath: String |
30 | | - var handle: UnsafeMutableRawPointer |
31 | | - } |
32 | | - |
33 | | - /// Loaded dylib handles associated with the module name. |
34 | | - var loadedLibraryPlugins: [String: LoadedLibraryPlugin] = [:] |
35 | | - |
36 | | - /// Resolved cached macros. |
37 | | - var resolvedMacros: [MacroRef: Macro.Type] = [:] |
38 | | - |
39 | | - /// @main entry point. |
40 | 18 | static func main() throws { |
41 | 19 | let connection = try StandardIOMessageConnection() |
42 | 20 | let listener = CompilerPluginMessageListener( |
43 | 21 | connection: connection, |
44 | | - provider: self.init() |
| 22 | + provider: LibraryPluginProvider.shared |
45 | 23 | ) |
46 | | - try listener.main() |
47 | | - } |
48 | | -} |
49 | | - |
50 | | -extension SwiftPluginServer: PluginProvider { |
51 | | - /// Load a macro implementation from the dynamic link library. |
52 | | - func loadPluginLibrary(libraryPath: String, moduleName: String) throws { |
53 | | - var errorMessage: UnsafePointer<CChar>? |
54 | | - guard let dlHandle = PluginServer_load(libraryPath, &errorMessage) else { |
55 | | - throw PluginServerError(message: "loader error: " + String(cString: errorMessage!)) |
56 | | - } |
57 | | - loadedLibraryPlugins[moduleName] = LoadedLibraryPlugin( |
58 | | - libraryPath: libraryPath, |
59 | | - handle: dlHandle |
60 | | - ) |
61 | | - } |
62 | | - |
63 | | - /// Lookup a loaded macro by a pair of module name and type name. |
64 | | - func resolveMacro(moduleName: String, typeName: String) throws -> Macro.Type { |
65 | | - if let resolved = resolvedMacros[.init(moduleName, typeName)] { |
66 | | - return resolved |
67 | | - } |
68 | | - |
69 | | - // Find 'dlopen'ed library for the module name. |
70 | | - guard let plugin = loadedLibraryPlugins[moduleName] else { |
71 | | - // NOTE: This should be unreachable. Compiler should not use this server |
72 | | - // unless the plugin loading succeeded. |
73 | | - throw PluginServerError(message: "(plugin-server) plugin not loaded for module '\(moduleName)'") |
74 | | - } |
75 | | - |
76 | | - // Lookup the type metadata. |
77 | | - var errorMessage: UnsafePointer<CChar>? |
78 | | - guard let macroTypePtr = PluginServer_lookupMacroTypeMetadataByExternalName( |
79 | | - moduleName, typeName, plugin.handle, &errorMessage |
80 | | - ) else { |
81 | | - throw PluginServerError(message: "macro implementation type '\(moduleName).\(typeName)' could not be found in library plugin '\(plugin.libraryPath)'") |
82 | | - } |
83 | | - |
84 | | - // THe type must be a 'Macro' type. |
85 | | - let macroType = unsafeBitCast(macroTypePtr, to: Any.Type.self) |
86 | | - guard let macro = macroType as? Macro.Type else { |
87 | | - throw PluginServerError(message: "type '\(moduleName).\(typeName)' is not a valid macro implementation type in library plugin '\(plugin.libraryPath)'") |
88 | | - } |
89 | | - |
90 | | - // Cache the resolved type. |
91 | | - resolvedMacros[.init(moduleName, typeName)] = macro |
92 | | - return macro |
93 | | - } |
94 | | - |
95 | | - /// This 'PluginProvider' implements 'loadLibraryMacro()'. |
96 | | - var features: [SwiftCompilerPluginMessageHandling.PluginFeature] { |
97 | | - [.loadPluginLibrary] |
98 | | - } |
99 | | -} |
100 | | - |
101 | | -struct PluginServerError: Error, CustomStringConvertible { |
102 | | - var description: String |
103 | | - init(message: String) { |
104 | | - self.description = message |
| 24 | + listener.main() |
105 | 25 | } |
106 | 26 | } |
0 commit comments