C++ 叮当声格式:IncludeIsMainRegex不起作用

C++ 叮当声格式:IncludeIsMainRegex不起作用,c++,include,clang-format,C++,Include,Clang Format,我在查找源文件的主包含时遇到问题。但是一步一步 文件z.h #include "test" #include "azd" #include <vector> #include <boost/something> #include <map> #包括“测试” #包括“azd” #包括 #包括 #包括 文件z.C #include "test" #include "azd" #include <vector> #include <boost

我在查找源文件的主包含时遇到问题。但是一步一步

文件z.h

#include "test"
#include "azd"
#include <vector> 
#include <boost/something>
#include <map>
#包括“测试”
#包括“azd”
#包括
#包括
#包括
文件z.C

#include "test"
#include "azd"
#include <vector>
#include <boost/something>
#include <map>
#include "z.h"
#包括“测试”
#包括“azd”
#包括
#包括
#包括
#包括“z.h”
文件(部分).clang格式与z.h和z.C位于一起

BasedOnStyle: LLVM
Language: Cpp
IncludeIsMainRegex: '(_test)?$'
IncludeCategories:
- Regex:    '^(<boost)'
  Priority: 3
- Regex:    '^<'
  Priority: 4
- Regex:    '.*'
  Priority: 1
BasedOnStyle:LLVM
语言:Cpp
IncludeIsMainRegex:“(_测试)?$”
IncludeCategories:

-正则表达式:“^(看起来,在您的情况下,当源文件具有
*.C
扩展名时,唯一不起作用的是
IncludeIsMainRegex
选项

如果我没有错,那么这个选项只对源代码文件进行工作,这些文件有<代码> *.c、*.cc、*.cp、*.C++、*.cxx < /c>扩展>

我的假设基于
clang(v7.0.0)
文件
clang/lib/Tooling/includes/HeaderIncludes.cpp中的这段代码:

IncludeCategoryManager::IncludeCategoryManager(const IncludeStyle &Style,
                                               StringRef FileName)
    : Style(Style), FileName(FileName) {
  FileStem = llvm::sys::path::stem(FileName);
  for (const auto &Category : Style.IncludeCategories)
    CategoryRegexs.emplace_back(Category.Regex, llvm::Regex::IgnoreCase);
  IsMainFile = FileName.endswith(".c") || FileName.endswith(".cc") ||
               FileName.endswith(".cpp") || FileName.endswith(".c++") ||
               FileName.endswith(".cxx") || FileName.endswith(".m") ||
               FileName.endswith(".mm");
}

int IncludeCategoryManager::getIncludePriority(StringRef IncludeName,
                                               bool CheckMainHeader) const {
  int Ret = INT_MAX;
  for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i)
    if (CategoryRegexs[i].match(IncludeName)) {
      Ret = Style.IncludeCategories[i].Priority;
      break;
    }
  if (CheckMainHeader && IsMainFile && Ret > 0 && isMainHeader(IncludeName))
    Ret = 0;
  return Ret;
}

bool IncludeCategoryManager::isMainHeader(StringRef IncludeName) const {
  if (!IncludeName.startswith("\""))
    return false;
  StringRef HeaderStem =
      llvm::sys::path::stem(IncludeName.drop_front(1).drop_back(1));
  if (FileStem.startswith(HeaderStem) ||
      FileStem.startswith_lower(HeaderStem)) {
    llvm::Regex MainIncludeRegex(HeaderStem.str() + Style.IncludeIsMainRegex,
                                 llvm::Regex::IgnoreCase);
    if (MainIncludeRegex.match(FileStem))
      return true;
  }
  return false;
}
#include "azd"
#include "test"
#include "z.h"
#include <boost/something>
#include <map>
#include <vector>
#include "z.h"
#include "azd"
#include "test"
#include <boost/something>
#include <map>
#include <vector>
IncludeCategoryManager::IncludeCategoryManager(const IncludeStyle &Style,
                                               StringRef FileName)
    : Style(Style), FileName(FileName) {
  FileStem = llvm::sys::path::stem(FileName);
  for (const auto &Category : Style.IncludeCategories)
    CategoryRegexs.emplace_back(Category.Regex, llvm::Regex::IgnoreCase);
  IsMainFile = FileName.endswith(".c") || FileName.endswith(".cc") ||
               FileName.endswith(".cpp") || FileName.endswith(".c++") ||
               FileName.endswith(".cxx") || FileName.endswith(".m") ||
               FileName.endswith(".mm");
}

int IncludeCategoryManager::getIncludePriority(StringRef IncludeName,
                                               bool CheckMainHeader) const {
  int Ret = INT_MAX;
  for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i)
    if (CategoryRegexs[i].match(IncludeName)) {
      Ret = Style.IncludeCategories[i].Priority;
      break;
    }
  if (CheckMainHeader && IsMainFile && Ret > 0 && isMainHeader(IncludeName))
    Ret = 0;
  return Ret;
}

bool IncludeCategoryManager::isMainHeader(StringRef IncludeName) const {
  if (!IncludeName.startswith("\""))
    return false;
  StringRef HeaderStem =
      llvm::sys::path::stem(IncludeName.drop_front(1).drop_back(1));
  if (FileStem.startswith(HeaderStem) ||
      FileStem.startswith_lower(HeaderStem)) {
    llvm::Regex MainIncludeRegex(HeaderStem.str() + Style.IncludeIsMainRegex,
                                 llvm::Regex::IgnoreCase);
    if (MainIncludeRegex.match(FileStem))
      return true;
  }
  return false;
}