[clang] [clang-format] Add .clang-format.ignore for ignoring files (PR #76327)
Björn Schäpers via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 28 04:33:49 PST 2023
================
@@ -570,6 +571,74 @@ static int dumpConfig(bool IsSTDIN) {
return 0;
}
+// Check whether `FilePath` is ignored according to the nearest
+// .clang-format-ignore file based on the rules below:
+// - A blank line is skipped.
+// - Leading and trailing spaces of a line are trimmed.
+// - A line starting with a hash (`#`) is a comment.
+// - A non-comment line is a single pattern.
+// - The slash (`/`) is used as the directory separator.
+// - A pattern is relative to the directory of the .clang-format-ignore file (or
+// the root directory if the pattern starts with a slash).
+// - A pattern is negated if it starts with a bang (`!`).
+static bool isIgnored(StringRef FilePath) {
+ using namespace llvm::sys::fs;
+ if (!is_regular_file(FilePath))
+ return false;
+
+ using namespace llvm::sys::path;
+ SmallString<128> Path, AbsPath{FilePath};
+
+ make_absolute(AbsPath);
+ remove_dots(AbsPath, /*remove_dot_dot=*/true);
+
+ StringRef IgnoreDir{AbsPath};
+ do {
+ IgnoreDir = parent_path(IgnoreDir);
+ if (IgnoreDir.empty())
+ return false;
+
+ Path = IgnoreDir;
+ append(Path, ".clang-format-ignore");
+ } while (!is_regular_file(Path));
+
+ std::ifstream IgnoreFile{Path.c_str()};
+ if (!IgnoreFile.good())
+ return false;
+
+ AbsPath = convert_to_slash(AbsPath);
+
+ bool HasMatch = false;
+ for (std::string Pattern; std::getline(IgnoreFile, Pattern);) {
+ Pattern = StringRef(Pattern).trim();
+ if (Pattern.empty() || Pattern[0] == '#')
+ continue;
+
+ const bool IsNegated = Pattern[0] == '!';
+ if (IsNegated)
+ Pattern.erase(0, 1);
+
+ if (Pattern.empty())
+ continue;
+
+ Pattern = StringRef(Pattern).ltrim();
+ if (Pattern[0] != '/') {
+ Path = convert_to_slash(IgnoreDir);
+ append(Path, Style::posix, Pattern);
+ remove_dots(Path, /*remove_dot_dot=*/true, Style::posix);
+ Pattern = Path.str();
+ }
+
+ if (clang::format::matchFilePath(Pattern, AbsPath.str()) == !IsNegated) {
+ HasMatch = true;
----------------
HazardyKnusperkeks wrote:
You can directly `return true` and thus omit having `HasMatch` altogether.
https://github.com/llvm/llvm-project/pull/76327
More information about the cfe-commits
mailing list