From 2358c3485213a02937df847741a0a31d5fddbb05 Mon Sep 17 00:00:00 2001 From: xzz53 Date: Tue, 5 Mar 2019 00:19:05 +0300 Subject: [PATCH] Add clang.excludeGlobs option It allows to disable compilations options matching any of specified patterns. '*', '?', '[' and ']' metacharacters are supported. --- src/config.hh | 8 ++++++-- src/project.cc | 29 +++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/config.hh b/src/config.hh index 0daeec82..83cec9e8 100644 --- a/src/config.hh +++ b/src/config.hh @@ -101,6 +101,10 @@ struct Config { // e.g. If your project is built by GCC and has an option thag clang does not understand. std::vector excludeArgs; + // Arguments matching any of these glob patterns will be excluded. + // * ? and [] metacharacters are supported. + std::vector excludeGlobs; + // Additional arguments to pass to clang. std::vector extraArgs; @@ -323,8 +327,8 @@ REFLECT_STRUCT(Config::ServerCap::Workspace::WorkspaceFolders, supported, REFLECT_STRUCT(Config::ServerCap::Workspace, workspaceFolders); REFLECT_STRUCT(Config::ServerCap, documentOnTypeFormattingProvider, foldingRangeProvider, workspace); -REFLECT_STRUCT(Config::Clang, excludeArgs, extraArgs, pathMappings, - resourceDir); +REFLECT_STRUCT(Config::Clang, excludeArgs, excludeGlobs, extraArgs, + pathMappings, resourceDir); REFLECT_STRUCT(Config::ClientCapability, hierarchicalDocumentSymbolSupport, linkSupport, snippetSupport); REFLECT_STRUCT(Config::CodeLens, localVariables); diff --git a/src/project.cc b/src/project.cc index 7462ca17..6849d253 100644 --- a/src/project.cc +++ b/src/project.cc @@ -30,6 +30,7 @@ limitations under the License. #include #include #include +#include #include #include @@ -82,9 +83,33 @@ struct ProjectProcessor { Project::Folder &folder; std::unordered_set command_set; StringSet<> excludeArgs; + SmallVector excludeGlobs; + ProjectProcessor(Project::Folder &folder) : folder(folder) { for (auto &arg : g_config->clang.excludeArgs) excludeArgs.insert(arg); + + for (const auto &globString : g_config->clang.excludeGlobs) { + auto globOrErr = GlobPattern::create(globString); + + if (!globOrErr) { + LOG_S(WARNING) << "bad glob: " << globString; + continue; + } + excludeGlobs.push_back(globOrErr.get()); + } + } + + bool ArgExcluded(StringRef arg) { + if (excludeArgs.count(arg)) + return true; + + for (const auto &glob : excludeGlobs) { + if (glob.match(arg)) { + return true; + } + } + return false; } // Expand %c %cpp ... in .ccls @@ -115,7 +140,7 @@ struct ProjectProcessor { } if (ok) args.push_back(A.data()); - } else if (!excludeArgs.count(A)) { + } else if (!ArgExcluded(A)) { args.push_back(arg); } } @@ -396,7 +421,7 @@ void Project::LoadDirectory(const std::string &root, Project::Folder &folder) { entry.args.reserve(args.size()); for (std::string &arg : args) { DoPathMapping(arg); - if (!proc.excludeArgs.count(arg)) + if (!proc.ArgExcluded(arg)) entry.args.push_back(Intern(arg)); } entry.compdb_size = entry.args.size();