Skip to content

Commit 710ca26

Browse files
committed
Follow style configuration in clangd include cleaner
1 parent 7cf2860 commit 710ca26

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

clang-tools-extra/clangd/IncludeCleaner.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST,
117117

118118
std::vector<Diag> generateMissingIncludeDiagnostics(
119119
ParsedAST &AST, llvm::ArrayRef<MissingIncludeDiagInfo> MissingIncludes,
120-
llvm::StringRef Code, HeaderFilter IgnoreHeaders, const ThreadsafeFS &TFS) {
120+
llvm::StringRef Code, HeaderFilter IgnoreHeaders,
121+
HeaderFilter AngledHeaders, const ThreadsafeFS &TFS) {
121122
std::vector<Diag> Result;
122123
const SourceManager &SM = AST.getSourceManager();
123124
const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID());
@@ -142,6 +143,13 @@ std::vector<Diag> generateMissingIncludeDiagnostics(
142143

143144
llvm::StringRef HeaderRef{Spelling};
144145
bool Angled = HeaderRef.starts_with("<");
146+
for (auto Filter : AngledHeaders) {
147+
if (Filter(HeaderRef)) {
148+
Angled = true;
149+
break;
150+
}
151+
}
152+
145153
// We might suggest insertion of an existing include in edge cases, e.g.,
146154
// include is present in a PP-disabled region, or spelling of the header
147155
// turns out to be the same as one of the unresolved includes in the
@@ -481,18 +489,17 @@ bool isPreferredProvider(const Inclusion &Inc,
481489
return false; // no header provides the symbol
482490
}
483491

484-
std::vector<Diag>
485-
issueIncludeCleanerDiagnostics(ParsedAST &AST, llvm::StringRef Code,
486-
const IncludeCleanerFindings &Findings,
487-
const ThreadsafeFS &TFS,
488-
HeaderFilter IgnoreHeaders) {
492+
std::vector<Diag> issueIncludeCleanerDiagnostics(
493+
ParsedAST &AST, llvm::StringRef Code,
494+
const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS,
495+
HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders) {
489496
trace::Span Tracer("IncludeCleaner::issueIncludeCleanerDiagnostics");
490497
std::vector<Diag> UnusedIncludes = generateUnusedIncludeDiagnostics(
491498
AST.tuPath(), Findings.UnusedIncludes, Code, IgnoreHeaders);
492499
std::optional<Fix> RemoveAllUnused = removeAllUnusedIncludes(UnusedIncludes);
493500

494501
std::vector<Diag> MissingIncludeDiags = generateMissingIncludeDiagnostics(
495-
AST, Findings.MissingIncludes, Code, IgnoreHeaders, TFS);
502+
AST, Findings.MissingIncludes, Code, IgnoreHeaders, AngledHeaders, TFS);
496503
std::optional<Fix> AddAllMissing = addAllMissingIncludes(MissingIncludeDiags);
497504

498505
std::optional<Fix> FixAll;

clang-tools-extra/clangd/IncludeCleaner.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,10 @@ IncludeCleanerFindings
5757
computeIncludeCleanerFindings(ParsedAST &AST,
5858
bool AnalyzeAngledIncludes = false);
5959

60-
std::vector<Diag>
61-
issueIncludeCleanerDiagnostics(ParsedAST &AST, llvm::StringRef Code,
62-
const IncludeCleanerFindings &Findings,
63-
const ThreadsafeFS &TFS,
64-
HeaderFilter IgnoreHeader = {});
60+
std::vector<Diag> issueIncludeCleanerDiagnostics(
61+
ParsedAST &AST, llvm::StringRef Code,
62+
const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS,
63+
HeaderFilter IgnoreHeader = {}, HeaderFilter AngledHeaders = {});
6564

6665
/// Converts the clangd include representation to include-cleaner
6766
/// include representation.

clang-tools-extra/clangd/ParsedAST.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,8 @@ std::vector<Diag> getIncludeCleanerDiags(ParsedAST &AST, llvm::StringRef Code,
382382
if (SuppressUnused)
383383
Findings.UnusedIncludes.clear();
384384
return issueIncludeCleanerDiagnostics(AST, Code, Findings, TFS,
385-
Cfg.Diagnostics.Includes.IgnoreHeader);
385+
Cfg.Diagnostics.Includes.IgnoreHeader,
386+
Cfg.Style.AngledHeaders);
386387
}
387388

388389
tidy::ClangTidyCheckFactories

clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,13 @@ TEST(IncludeCleaner, ComputeMissingHeaders) {
220220
TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
221221
Annotations MainFile(R"cpp(
222222
#include "a.h"
223+
#include "a_angled.h"
223224
#include "all.h"
224225
$insert_b[[]]#include "baz.h"
225226
#include "dir/c.h"
226227
$insert_d[[]]$insert_foo[[]]#include "fuzz.h"
227228
#include "header.h"
228-
$insert_foobar[[]]#include <e.h>
229+
$insert_foobar[[]]$insert_b_angled[[]]#include <e.h>
229230
$insert_f[[]]$insert_vector[[]]
230231
231232
#define DEF(X) const Foo *X;
@@ -237,6 +238,7 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
237238
238239
void foo() {
239240
$b[[b]]();
241+
$b_angled[[b_angled]]();
240242
241243
ns::$bar[[Bar]] bar;
242244
bar.d();
@@ -262,6 +264,8 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
262264
TU.Filename = "main.cpp";
263265
TU.AdditionalFiles["a.h"] = guard("#include \"b.h\"");
264266
TU.AdditionalFiles["b.h"] = guard("void b();");
267+
TU.AdditionalFiles["a_angled.h"] = guard("#include \"b_angled.h\"");
268+
TU.AdditionalFiles["b_angled.h"] = guard("void b_angled();");
265269

266270
TU.AdditionalFiles["dir/c.h"] = guard("#include \"d.h\"");
267271
TU.AdditionalFiles["dir/d.h"] =
@@ -297,7 +301,8 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
297301
Findings.UnusedIncludes.clear();
298302
std::vector<clangd::Diag> Diags = issueIncludeCleanerDiagnostics(
299303
AST, TU.Code, Findings, MockFS(),
300-
{[](llvm::StringRef Header) { return Header.ends_with("buzz.h"); }});
304+
{[](llvm::StringRef Header) { return Header.ends_with("buzz.h"); }},
305+
{[](llvm::StringRef Header) { return Header.contains("b_angled.h"); }});
301306
EXPECT_THAT(
302307
Diags,
303308
UnorderedElementsAre(
@@ -306,6 +311,12 @@ TEST(IncludeCleaner, GenerateMissingHeaderDiags) {
306311
withFix({Fix(MainFile.range("insert_b"), "#include \"b.h\"\n",
307312
"#include \"b.h\""),
308313
FixMessage("add all missing includes")})),
314+
AllOf(Diag(MainFile.range("b_angled"),
315+
"No header providing \"b_angled\" is directly included"),
316+
withFix(
317+
{Fix(MainFile.range("insert_b_angled"),
318+
"#include <b_angled.h>\n", "#include \"b_angled.h\""),
319+
FixMessage("add all missing includes")})),
309320
AllOf(Diag(MainFile.range("bar"),
310321
"No header providing \"ns::Bar\" is directly included"),
311322
withFix({Fix(MainFile.range("insert_d"),

0 commit comments

Comments
 (0)