@@ -118,7 +118,8 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST,
118
118
std::vector<Diag> generateMissingIncludeDiagnostics (
119
119
ParsedAST &AST, llvm::ArrayRef<MissingIncludeDiagInfo> MissingIncludes,
120
120
llvm::StringRef Code, HeaderFilter IgnoreHeaders,
121
- HeaderFilter AngledHeaders, const ThreadsafeFS &TFS) {
121
+ HeaderFilter AngledHeaders, HeaderFilter QuotedHeaders,
122
+ const ThreadsafeFS &TFS) {
122
123
std::vector<Diag> Result;
123
124
const SourceManager &SM = AST.getSourceManager ();
124
125
const FileEntry *MainFile = SM.getFileEntryForID (SM.getMainFileID ());
@@ -142,24 +143,37 @@ std::vector<Diag> generateMissingIncludeDiagnostics(
142
143
AST.getPreprocessor ().getHeaderSearchInfo (), MainFile});
143
144
144
145
llvm::StringRef HeaderRef{Spelling};
145
- bool Angled = HeaderRef.starts_with (" <" );
146
+
147
+ bool IsAngled = false ;
146
148
for (auto &Filter : AngledHeaders) {
147
149
if (Filter (HeaderRef)) {
148
- Angled = true ;
150
+ IsAngled = true ;
151
+ break ;
152
+ }
153
+ }
154
+ bool IsQuoted = false ;
155
+ for (auto &Filter : QuotedHeaders) {
156
+ if (Filter (HeaderRef)) {
157
+ IsQuoted = true ;
149
158
break ;
150
159
}
151
160
}
161
+ if (IsAngled == IsQuoted) {
162
+ IsAngled = HeaderRef.starts_with (" <" );
163
+ } else if (!IsAngled && IsQuoted) {
164
+ IsAngled = false ;
165
+ }
152
166
153
167
// We might suggest insertion of an existing include in edge cases, e.g.,
154
168
// include is present in a PP-disabled region, or spelling of the header
155
169
// turns out to be the same as one of the unresolved includes in the
156
170
// main file.
157
171
std::optional<tooling::Replacement> Replacement = HeaderIncludes.insert (
158
- HeaderRef.trim (" \" <>" ), Angled , tooling::IncludeDirective::Include);
172
+ HeaderRef.trim (" \" <>" ), IsAngled , tooling::IncludeDirective::Include);
159
173
if (!Replacement.has_value ())
160
174
continue ;
161
175
162
- if (Angled && Spelling.front () == ' \" ' ) {
176
+ if (IsAngled && Spelling.front () == ' \" ' ) {
163
177
Spelling.front () = ' <' ;
164
178
Spelling.back () = ' >' ;
165
179
}
@@ -497,14 +511,16 @@ bool isPreferredProvider(const Inclusion &Inc,
497
511
std::vector<Diag> issueIncludeCleanerDiagnostics (
498
512
ParsedAST &AST, llvm::StringRef Code,
499
513
const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS,
500
- HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders) {
514
+ HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders,
515
+ HeaderFilter QuotedHeaders) {
501
516
trace::Span Tracer (" IncludeCleaner::issueIncludeCleanerDiagnostics" );
502
517
std::vector<Diag> UnusedIncludes = generateUnusedIncludeDiagnostics (
503
518
AST.tuPath (), Findings.UnusedIncludes , Code, IgnoreHeaders);
504
519
std::optional<Fix> RemoveAllUnused = removeAllUnusedIncludes (UnusedIncludes);
505
520
506
521
std::vector<Diag> MissingIncludeDiags = generateMissingIncludeDiagnostics (
507
- AST, Findings.MissingIncludes , Code, IgnoreHeaders, AngledHeaders, TFS);
522
+ AST, Findings.MissingIncludes , Code, IgnoreHeaders, AngledHeaders,
523
+ QuotedHeaders, TFS);
508
524
std::optional<Fix> AddAllMissing = addAllMissingIncludes (MissingIncludeDiags);
509
525
510
526
std::optional<Fix> FixAll;
0 commit comments