@@ -118,7 +118,8 @@ bool mayConsiderUnused(const Inclusion &Inc, ParsedAST &AST,
118118std::vector<Diag> generateMissingIncludeDiagnostics (
119119 ParsedAST &AST, llvm::ArrayRef<MissingIncludeDiagInfo> MissingIncludes,
120120 llvm::StringRef Code, HeaderFilter IgnoreHeaders,
121- HeaderFilter AngledHeaders, const ThreadsafeFS &TFS) {
121+ HeaderFilter AngledHeaders, HeaderFilter QuotedHeaders,
122+ const ThreadsafeFS &TFS) {
122123 std::vector<Diag> Result;
123124 const SourceManager &SM = AST.getSourceManager ();
124125 const FileEntry *MainFile = SM.getFileEntryForID (SM.getMainFileID ());
@@ -142,24 +143,37 @@ std::vector<Diag> generateMissingIncludeDiagnostics(
142143 AST.getPreprocessor ().getHeaderSearchInfo (), MainFile});
143144
144145 llvm::StringRef HeaderRef{Spelling};
145- bool Angled = HeaderRef.starts_with (" <" );
146+
147+ bool IsAngled = false ;
146148 for (auto &Filter : AngledHeaders) {
147149 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 ;
149158 break ;
150159 }
151160 }
161+ if (IsAngled == IsQuoted) {
162+ IsAngled = HeaderRef.starts_with (" <" );
163+ } else if (!IsAngled && IsQuoted) {
164+ IsAngled = false ;
165+ }
152166
153167 // We might suggest insertion of an existing include in edge cases, e.g.,
154168 // include is present in a PP-disabled region, or spelling of the header
155169 // turns out to be the same as one of the unresolved includes in the
156170 // main file.
157171 std::optional<tooling::Replacement> Replacement = HeaderIncludes.insert (
158- HeaderRef.trim (" \" <>" ), Angled , tooling::IncludeDirective::Include);
172+ HeaderRef.trim (" \" <>" ), IsAngled , tooling::IncludeDirective::Include);
159173 if (!Replacement.has_value ())
160174 continue ;
161175
162- if (Angled && Spelling.front () == ' \" ' ) {
176+ if (IsAngled && Spelling.front () == ' \" ' ) {
163177 Spelling.front () = ' <' ;
164178 Spelling.back () = ' >' ;
165179 }
@@ -497,14 +511,16 @@ bool isPreferredProvider(const Inclusion &Inc,
497511std::vector<Diag> issueIncludeCleanerDiagnostics (
498512 ParsedAST &AST, llvm::StringRef Code,
499513 const IncludeCleanerFindings &Findings, const ThreadsafeFS &TFS,
500- HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders) {
514+ HeaderFilter IgnoreHeaders, HeaderFilter AngledHeaders,
515+ HeaderFilter QuotedHeaders) {
501516 trace::Span Tracer (" IncludeCleaner::issueIncludeCleanerDiagnostics" );
502517 std::vector<Diag> UnusedIncludes = generateUnusedIncludeDiagnostics (
503518 AST.tuPath (), Findings.UnusedIncludes , Code, IgnoreHeaders);
504519 std::optional<Fix> RemoveAllUnused = removeAllUnusedIncludes (UnusedIncludes);
505520
506521 std::vector<Diag> MissingIncludeDiags = generateMissingIncludeDiagnostics (
507- AST, Findings.MissingIncludes , Code, IgnoreHeaders, AngledHeaders, TFS);
522+ AST, Findings.MissingIncludes , Code, IgnoreHeaders, AngledHeaders,
523+ QuotedHeaders, TFS);
508524 std::optional<Fix> AddAllMissing = addAllMissingIncludes (MissingIncludeDiags);
509525
510526 std::optional<Fix> FixAll;
0 commit comments