2020using namespace swift ;
2121
2222void PluginLoader::createModuleToExecutablePluginMap () {
23- for (auto &arg : Ctx.SearchPathOpts .getCompilerPluginExecutablePaths ()) {
24- // Create a moduleName -> pluginPath mapping.
25- assert (!arg.ExecutablePath .empty () && " empty plugin path" );
26- StringRef pathStr = Ctx.AllocateCopy (arg.ExecutablePath );
27- for (auto moduleName : arg.ModuleNames ) {
28- ExecutablePluginPaths[Ctx.getIdentifier (moduleName)] = pathStr;
23+ for (auto &elem : Ctx.SearchPathOpts .PluginSearchOpts ) {
24+ if (auto *arg = elem.dyn_cast <PluginSearchOption::LoadPluginExecutable>()) {
25+ // Create a moduleName -> pluginPath mapping.
26+ assert (!arg->ExecutablePath .empty () && " empty plugin path" );
27+ StringRef pathStr = Ctx.AllocateCopy (arg->ExecutablePath );
28+ for (auto moduleName : arg->ModuleNames ) {
29+ ExecutablePluginPaths[Ctx.getIdentifier (moduleName)] = pathStr;
30+ }
2931 }
3032 }
3133}
@@ -46,69 +48,59 @@ PluginRegistry *PluginLoader::getRegistry() {
4648 return Registry;
4749}
4850
49- llvm::Optional<std::string>
50- PluginLoader::lookupExplicitLibraryPluginByModuleName (Identifier moduleName) {
51- // Look for 'lib${module name}(.dylib|.so)'.
52- SmallString<64 > expectedBasename;
53- expectedBasename.append (" lib" );
54- expectedBasename.append (moduleName.str ());
55- expectedBasename.append (LTDL_SHLIB_EXT);
56-
57- // Try '-load-plugin-library'.
58- for (const auto &libPath :
59- Ctx.SearchPathOpts .getCompilerPluginLibraryPaths ()) {
60- if (llvm::sys::path::filename (libPath) == expectedBasename) {
61- return libPath;
62- }
63- }
64- return None;
65- }
51+ std::pair<std::string, std::string>
52+ PluginLoader::lookupPluginByModuleName (Identifier moduleName) {
53+ auto fs = Ctx.SourceMgr .getFileSystem ();
6654
67- llvm::Optional<std::string>
68- PluginLoader::lookupLibraryPluginInSearchPathByModuleName (
69- Identifier moduleName) {
7055 // Look for 'lib${module name}(.dylib|.so)'.
71- SmallString<64 > expectedBasename;
72- expectedBasename.append (" lib" );
73- expectedBasename.append (moduleName.str ());
74- expectedBasename.append (LTDL_SHLIB_EXT);
75-
76- // Try '-plugin-path'.
77- auto fs = Ctx.SourceMgr .getFileSystem ();
78- for (const auto &searchPath : Ctx.SearchPathOpts .PluginSearchPaths ) {
79- SmallString<128 > fullPath (searchPath);
80- llvm::sys::path::append (fullPath, expectedBasename);
81- if (fs->exists (fullPath)) {
82- return std::string (fullPath);
56+ // FIXME: Shared library prefix might be different between platforms.
57+ SmallString<64 > pluginLibBasename;
58+ pluginLibBasename.append (" lib" );
59+ pluginLibBasename.append (moduleName.str ());
60+ pluginLibBasename.append (LTDL_SHLIB_EXT);
61+
62+ // FIXME: Should we create a lookup table keyed by module name?
63+ for (auto &entry : Ctx.SearchPathOpts .PluginSearchOpts ) {
64+ using namespace PluginSearchOption ;
65+ // Try '-load-plugin-library'.
66+ if (auto *val = entry.dyn_cast <LoadPluginLibrary>()) {
67+ if (llvm::sys::path::filename (val->LibraryPath ) == pluginLibBasename) {
68+ return {val->LibraryPath , " " };
69+ }
70+ continue ;
8371 }
84- }
85-
86- return None;
87- }
8872
89- Optional<std::pair<std::string, std::string>>
90- PluginLoader::lookupExternalLibraryPluginByModuleName (Identifier moduleName) {
91- auto fs = Ctx.SourceMgr .getFileSystem ();
73+ // Try '-load-plugin-executable'.
74+ if (auto *v = entry.dyn_cast <LoadPluginExecutable>()) {
75+ auto found = ExecutablePluginPaths.find (moduleName);
76+ if (found != ExecutablePluginPaths.end ()) {
77+ return {" " , std::string (found->second )};
78+ }
79+ continue ;
80+ }
9281
93- for (auto &pair : Ctx.SearchPathOpts .ExternalPluginSearchPaths ) {
94- SmallString<128 > fullPath (pair.SearchPath );
95- llvm::sys::path::append (fullPath,
96- " lib" + moduleName.str () + LTDL_SHLIB_EXT);
82+ // Try '-plugin-path'.
83+ if (auto *v = entry.dyn_cast <PluginPath>()) {
84+ SmallString<128 > fullPath (v->SearchPath );
85+ llvm::sys::path::append (fullPath, pluginLibBasename);
86+ if (fs->exists (fullPath)) {
87+ return {std::string (fullPath), " " };
88+ }
89+ continue ;
90+ }
9791
98- if (fs->exists (fullPath)) {
99- return {{std::string (fullPath), pair.ServerPath }};
92+ // Try '-external-plugin-path'.
93+ if (auto *v = entry.dyn_cast <ExternalPluginPath>()) {
94+ SmallString<128 > fullPath (v->SearchPath );
95+ llvm::sys::path::append (fullPath, pluginLibBasename);
96+ if (fs->exists (fullPath)) {
97+ return {std::string (fullPath), v->ServerPath };
98+ }
99+ continue ;
100100 }
101101 }
102- return None;
103- }
104102
105- Optional<StringRef>
106- PluginLoader::lookupExecutablePluginByModuleName (Identifier moduleName) {
107- auto &execPluginPaths = ExecutablePluginPaths;
108- auto found = execPluginPaths.find (moduleName);
109- if (found == execPluginPaths.end ())
110- return None;
111- return found->second ;
103+ return {};
112104}
113105
114106LoadedLibraryPlugin *PluginLoader::loadLibraryPlugin (StringRef path) {
0 commit comments