【问题标题】:clang-format: IncludeIsMainRegex does not workclang 格式:IncludeIsMainRegex 不起作用
【发布时间】:2018-01-10 16:01:11
【问题描述】:

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

文件 z.h

#include "test"
#include "azd"
#include <vector> 
#include <boost/something>
#include <map>

文件 z.C

#include "test"
#include "azd"
#include <vector>
#include <boost/something>
#include <map>
#include "z.h"

文件(部分).clang-format 与 z.h 和 z.C 一起定位

BasedOnStyle: LLVM
Language: Cpp
IncludeIsMainRegex: '(_test)?$'
IncludeCategories:
- Regex:    '^(<boost)'
  Priority: 3
- Regex:    '^<'
  Priority: 4
- Regex:    '.*'
  Priority: 1

现在,测试:

$ clang-format z.h

#include "azd"
#include "test"
#include <boost/something>
#include <map>
#include <vector>

在这里,一切看起来都很棒,包括按预期排序,但是

$ clang-format z.C

#include "azd"
#include "test"
#include "z.h"
#include <boost/something>
#include <map>
#include <vector>

这里,“a.z”在中间,虽然它应该被 '(_test)?$' 检测为主要包含。有趣的是,当我重命名 z.C -> z.cc 然后:

$ clang-format z.cc

#include "z.h"
#include "azd"
#include "test"
#include <boost/something>
#include <map>
#include <vector>

工作正常...

clang-format 似乎无法将 *.C 文件识别为 C++ 语言。我正在处理 C++ 项目,我没有奢侈地将所有 *.C 文件重命名为 *.cc,所以请有人告诉我如何强制 clang-format 对 *.C 文件使用 C++ 样式格式吗? 或者通过另一种方法找到主要包含来解决这个问题?

第二个问题/问题。 我们有时将模板声明和定义拆分为 template.h 和 templateImpl.h 文件。如何强制 clang-format 将 templateImpl.h 视为源并将 #include "template.h" 作为主要包含?

问候

【问题讨论】:

    标签: c++ include clang-format


    【解决方案1】:

    当源文件具有 *.C 扩展名时,看起来唯一在您的情况下不起作用的是 IncludeIsMainRegex 选项。

    如果我没记错的话,那么这个选项目前只适用于具有*.c, *.cc, *.cpp, *.c++, *.cxx 扩展名的源文件。

    我的假设是基于来自clang (v7.0.0),文件clang/lib/Tooling/Inclusions/HeaderIncludes.cpp的代码的这个sn-p:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多