14
14
#include " SourceCode.h"
15
15
#include " support/Logger.h"
16
16
#include " support/Trace.h"
17
+ #include " clang/AST/ASTContext.h"
17
18
#include " clang/AST/ExprCXX.h"
18
19
#include " clang/AST/RecursiveASTVisitor.h"
19
20
#include " clang/Basic/SourceLocation.h"
20
21
#include " clang/Basic/SourceManager.h"
21
22
#include " clang/Lex/HeaderSearch.h"
22
23
#include " clang/Lex/Preprocessor.h"
23
24
#include " clang/Tooling/Syntax/Tokens.h"
25
+ #include " llvm/ADT/STLFunctionalExtras.h"
24
26
#include " llvm/Support/FormatVariadic.h"
25
27
#include " llvm/Support/Path.h"
26
28
@@ -207,10 +209,10 @@ clangd::Range getDiagnosticRange(llvm::StringRef Code, unsigned HashOffset) {
207
209
208
210
// Finds locations of macros referenced from within the main file. That includes
209
211
// references that were not yet expanded, e.g `BAR` in `#define FOO BAR`.
210
- void findReferencedMacros (ParsedAST &AST, ReferencedLocations &Result) {
212
+ void findReferencedMacros (const SourceManager &SM, Preprocessor &PP,
213
+ const syntax::TokenBuffer *Tokens,
214
+ ReferencedLocations &Result) {
211
215
trace::Span Tracer (" IncludeCleaner::findReferencedMacros" );
212
- auto &SM = AST.getSourceManager ();
213
- auto &PP = AST.getPreprocessor ();
214
216
// FIXME(kirillbobyrev): The macros from the main file are collected in
215
217
// ParsedAST's MainFileMacros. However, we can't use it here because it
216
218
// doesn't handle macro references that were not expanded, e.g. in macro
@@ -220,8 +222,7 @@ void findReferencedMacros(ParsedAST &AST, ReferencedLocations &Result) {
220
222
// this mechanism (as opposed to iterating through all tokens) will improve
221
223
// the performance of findReferencedMacros and also improve other features
222
224
// relying on MainFileMacros.
223
- for (const syntax::Token &Tok :
224
- AST.getTokens ().spelledTokens (SM.getMainFileID ())) {
225
+ for (const syntax::Token &Tok : Tokens->spelledTokens (SM.getMainFileID ())) {
225
226
auto Macro = locateMacroAt (Tok, PP);
226
227
if (!Macro)
227
228
continue ;
@@ -287,18 +288,26 @@ FileID headerResponsible(FileID ID, const SourceManager &SM,
287
288
288
289
} // namespace
289
290
290
- ReferencedLocations findReferencedLocations (ParsedAST &AST) {
291
+ ReferencedLocations findReferencedLocations (const SourceManager &SM,
292
+ ASTContext &Ctx, Preprocessor &PP,
293
+ const syntax::TokenBuffer *Tokens) {
291
294
trace::Span Tracer (" IncludeCleaner::findReferencedLocations" );
292
295
ReferencedLocations Result;
293
- ReferencedLocationCrawler Crawler (Result, AST.getSourceManager ());
294
- Crawler.TraverseAST (AST.getASTContext ());
295
- findReferencedMacros (AST, Result);
296
+ ReferencedLocationCrawler Crawler (Result, SM);
297
+ Crawler.TraverseAST (Ctx);
298
+ if (Tokens)
299
+ findReferencedMacros (SM, PP, Tokens, Result);
296
300
return Result;
297
301
}
298
302
299
- ReferencedFiles findReferencedFiles (const ReferencedLocations &Locs,
300
- const IncludeStructure &Includes,
301
- const SourceManager &SM) {
303
+ ReferencedLocations findReferencedLocations (ParsedAST &AST) {
304
+ return findReferencedLocations (AST.getSourceManager (), AST.getASTContext (),
305
+ AST.getPreprocessor (), &AST.getTokens ());
306
+ }
307
+
308
+ ReferencedFiles
309
+ findReferencedFiles (const ReferencedLocations &Locs, const SourceManager &SM,
310
+ llvm::function_ref<FileID(FileID)> HeaderResponsible) {
302
311
std::vector<SourceLocation> Sorted{Locs.User .begin (), Locs.User .end ()};
303
312
llvm::sort (Sorted); // Group by FileID.
304
313
ReferencedFilesBuilder Builder (SM);
@@ -318,7 +327,7 @@ ReferencedFiles findReferencedFiles(const ReferencedLocations &Locs,
318
327
// HeaderIDs, as each inclusion of a non-self-contained file is distinct.
319
328
llvm::DenseSet<FileID> UserFiles;
320
329
for (FileID ID : Builder.Files )
321
- UserFiles.insert (headerResponsible (ID, SM, Includes ));
330
+ UserFiles.insert (HeaderResponsible (ID));
322
331
323
332
llvm::DenseSet<stdlib::Header> StdlibFiles;
324
333
for (const auto &Symbol : Locs.Stdlib )
@@ -328,6 +337,14 @@ ReferencedFiles findReferencedFiles(const ReferencedLocations &Locs,
328
337
return {std::move (UserFiles), std::move (StdlibFiles)};
329
338
}
330
339
340
+ ReferencedFiles findReferencedFiles (const ReferencedLocations &Locs,
341
+ const IncludeStructure &Includes,
342
+ const SourceManager &SM) {
343
+ return findReferencedFiles (Locs, SM, [&SM, &Includes](FileID ID) {
344
+ return headerResponsible (ID, SM, Includes);
345
+ });
346
+ }
347
+
331
348
std::vector<const Inclusion *>
332
349
getUnused (ParsedAST &AST,
333
350
const llvm::DenseSet<IncludeStructure::HeaderID> &ReferencedFiles) {
0 commit comments