Skip to content

Commit 90f1e38

Browse files
[lldb] Improve swift clang importer when explicit module missing
Instead of dropping all explicit modules when found one module is missing, only drop the ones that are missing. In this case, the implicit build will only fill in the missing ones, rather than rebuild everything.
1 parent efb7606 commit 90f1e38

File tree

1 file changed

+18
-21
lines changed

1 file changed

+18
-21
lines changed

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,29 +1913,26 @@ void SwiftASTContext::AddExtraClangCC1Args(
19131913
GetCompilerInvocation().getClangModuleCachePath().str();
19141914

19151915
// Remove non-existing modules in a systematic way.
1916-
bool module_missing = false;
1917-
auto CheckFileExists = [&](const char *file) {
1918-
if (!llvm::sys::fs::exists(file)) {
1919-
std::string warn;
1920-
llvm::raw_string_ostream(warn)
1921-
<< "Nonexistent explicit module file " << file;
1922-
AddDiagnostic(eSeverityWarning, warn);
1923-
module_missing = true;
1924-
}
1916+
auto CheckFileExists = [&](const std::string &file) -> bool {
1917+
if (llvm::sys::fs::exists(file))
1918+
return true;
1919+
std::string warn;
1920+
llvm::raw_string_ostream(warn)
1921+
<< "Nonexistent explicit module file " << file;
1922+
AddDiagnostic(eSeverityWarning, warn);
1923+
return false;
19251924
};
1926-
llvm::for_each(invocation.getHeaderSearchOpts().PrebuiltModuleFiles,
1927-
[&](const auto &mod) { CheckFileExists(mod.second.c_str()); });
1928-
llvm::for_each(invocation.getFrontendOpts().ModuleFiles,
1929-
[&](const auto &mod) { CheckFileExists(mod.c_str()); });
1930-
1931-
// If missing, clear all the prebuilt module options and switch to implicit
1932-
// modules build.
1933-
if (module_missing) {
1934-
invocation.getHeaderSearchOpts().PrebuiltModuleFiles.clear();
1935-
invocation.getFrontendOpts().ModuleFiles.clear();
1936-
invocation.getLangOpts().ImplicitModules = true;
1937-
invocation.getHeaderSearchOpts().ImplicitModuleMaps = true;
1925+
for (auto it = invocation.getHeaderSearchOpts().PrebuiltModuleFiles.begin();
1926+
it != invocation.getHeaderSearchOpts().PrebuiltModuleFiles.end();) {
1927+
if (!CheckFileExists(it->second))
1928+
it = invocation.getHeaderSearchOpts().PrebuiltModuleFiles.erase(it);
1929+
else
1930+
++it;
19381931
}
1932+
invocation.getFrontendOpts().ModuleFiles.erase(
1933+
llvm::remove_if(invocation.getFrontendOpts().ModuleFiles,
1934+
[&](const auto &mod) { return !CheckFileExists(mod); }),
1935+
invocation.getFrontendOpts().ModuleFiles.end());
19391936

19401937
invocation.generateCC1CommandLine(
19411938
[&](const llvm::Twine &arg) { dest.push_back(arg.str()); });

0 commit comments

Comments
 (0)