[clang-tools-extra] 418ae6c - [include-cleaner][NFC] expose and test `normalizePath` helper (#189364)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 3 12:34:13 PDT 2026
Author: Daniil Dudkin
Date: 2026-04-03T19:34:07Z
New Revision: 418ae6c60007c710a2b3df9d0c1e01d05314eb7e
URL: https://github.com/llvm/llvm-project/commit/418ae6c60007c710a2b3df9d0c1e01d05314eb7e
DIFF: https://github.com/llvm/llvm-project/commit/418ae6c60007c710a2b3df9d0c1e01d05314eb7e.diff
LOG: [include-cleaner][NFC] expose and test `normalizePath` helper (#189364)
Also fix a bug where the root `/` path would become an empty string.
Added:
Modified:
clang-tools-extra/include-cleaner/lib/Types.cpp
clang-tools-extra/include-cleaner/lib/TypesInternal.h
clang-tools-extra/include-cleaner/unittests/TypesTest.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/include-cleaner/lib/Types.cpp b/clang-tools-extra/include-cleaner/lib/Types.cpp
index 7a637639edf8b..d7635c258e522 100644
--- a/clang-tools-extra/include-cleaner/lib/Types.cpp
+++ b/clang-tools-extra/include-cleaner/lib/Types.cpp
@@ -100,14 +100,12 @@ std::string Include::quote() const {
.str();
}
-static llvm::SmallString<128> normalizePath(llvm::StringRef Path) {
+llvm::SmallString<128> normalizePath(llvm::StringRef Path) {
namespace path = llvm::sys::path;
llvm::SmallString<128> P = Path;
path::remove_dots(P, /*remove_dot_dot=*/true);
path::native(P, path::Style::posix);
- while (!P.empty() && P.back() == '/')
- P.pop_back();
return P;
}
diff --git a/clang-tools-extra/include-cleaner/lib/TypesInternal.h b/clang-tools-extra/include-cleaner/lib/TypesInternal.h
index 0bd2766c900ab..60c28956c13c9 100644
--- a/clang-tools-extra/include-cleaner/lib/TypesInternal.h
+++ b/clang-tools-extra/include-cleaner/lib/TypesInternal.h
@@ -96,6 +96,8 @@ template <typename T> struct Hinted : public T {
}
};
+llvm::SmallString<128> normalizePath(llvm::StringRef Path);
+
} // namespace clang::include_cleaner
#endif
diff --git a/clang-tools-extra/include-cleaner/unittests/TypesTest.cpp b/clang-tools-extra/include-cleaner/unittests/TypesTest.cpp
index 609563da488e3..6f7491928fb05 100644
--- a/clang-tools-extra/include-cleaner/unittests/TypesTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/TypesTest.cpp
@@ -1,4 +1,4 @@
-//===-- RecordTest.cpp ----------------------------------------------------===//
+//===-- TypesTest.cpp -----------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "clang-include-cleaner/Types.h"
+#include "TypesInternal.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/FileSystemOptions.h"
#include "clang/Tooling/Inclusions/StandardLibrary.h"
@@ -98,5 +99,20 @@ TEST(RecordedIncludesTest, MatchVerbatimMixedAbsoluteRelative) {
EXPECT_THAT(Inc.match(Header("<bar.h>")), IsEmpty());
}
+TEST(NormalizePathTest, RemovesDotSegments) {
+ EXPECT_EQ(normalizePath("foo/./bar/../baz").str(), "foo/baz");
+ EXPECT_EQ(normalizePath("/foo/./bar").str(), "/foo/bar");
+ EXPECT_EQ(normalizePath("/foo/../bar").str(), "/bar");
+ EXPECT_EQ(normalizePath("foo/bar/").str(), "foo/bar");
+}
+
+TEST(NormalizePathTest, CanonicalizesSeparators) {
+ EXPECT_EQ(normalizePath("foo\\bar").str(), "foo/bar");
+}
+
+TEST(NormalizePathTest, PreservesRootPath) {
+ EXPECT_EQ(normalizePath("/").str(), "/");
+}
+
} // namespace
} // namespace clang::include_cleaner
More information about the cfe-commits
mailing list