kbobyrev created this revision. kbobyrev added a reviewer: kadircet. Herald added subscribers: usaxena95, arphaman. kbobyrev requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
Collect the macro definition locations for all the macros used in the main file. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D112447 Files: clang-tools-extra/clangd/IncludeCleaner.cpp clang-tools-extra/clangd/IncludeCleaner.h clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp Index: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -103,6 +103,16 @@ "struct ^X { enum ^Language { ^CXX = 42, Python = 9000}; };", "int Lang = X::CXX;", }, + // Macros + { + "#define ^CONSTANT 42", + "int Foo = CONSTANT;", + }, + { + "#define ^FOO x", + "#define BAR FOO", + }, + // Misc { // When a type is resolved via a using declaration, the // UsingShadowDecl is not referenced in the AST. Index: clang-tools-extra/clangd/IncludeCleaner.h =================================================================== --- clang-tools-extra/clangd/IncludeCleaner.h +++ clang-tools-extra/clangd/IncludeCleaner.h @@ -33,11 +33,13 @@ using ReferencedLocations = llvm::DenseSet<SourceLocation>; /// Finds locations of all symbols used in the main file. /// -/// Uses RecursiveASTVisitor to go through main file AST and computes all the -/// locations used symbols are coming from. Returned locations may be macro -/// expansions, and are not resolved to their spelling/expansion location. These -/// locations are later used to determine which headers should be marked as -/// "used" and "directly used". +/// - For non-macros uses RecursiveASTVisitor to go through main file AST and +/// computes all the locations used symbols are coming from. Returned +/// locations may be macro expansions, and are not resolved to their spelling +/// or expansion location. These locations are later used to determine which +/// headers should / be marked as "used" and "directly used". +/// - For macros iteratates over \p AST tokens and collects locations of the +/// used macro definition. /// /// We use this to compute unused headers, so we: /// Index: clang-tools-extra/clangd/IncludeCleaner.cpp =================================================================== --- clang-tools-extra/clangd/IncludeCleaner.cpp +++ clang-tools-extra/clangd/IncludeCleaner.cpp @@ -7,9 +7,11 @@ //===----------------------------------------------------------------------===// #include "IncludeCleaner.h" +#include "SourceCode.h" #include "support/Logger.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Tooling/Syntax/Tokens.h" namespace clang { namespace clangd { @@ -133,13 +135,28 @@ } }; +// Gets the tokens from the main file, iterates through them and adds definition +// locations for the found macros. +void findReferencedMacros(ParsedAST &AST, ReferencedLocations &Result) { + auto Tokens = + AST.getTokens().spelledTokens(AST.getSourceManager().getMainFileID()); + for (const syntax::Token &Tok : Tokens) { + auto Macro = locateMacroAt(Tok, AST.getPreprocessor()); + if (!Macro) + continue; + auto Loc = Macro->Info->getDefinitionLoc(); + if (Loc.isValid()) + Result.insert(Loc); + } +} + } // namespace ReferencedLocations findReferencedLocations(ParsedAST &AST) { ReferencedLocations Result; ReferencedLocationCrawler Crawler(Result); Crawler.TraverseAST(AST.getASTContext()); - // FIXME(kirillbobyrev): Handle macros. + findReferencedMacros(AST, Result); return Result; }
Index: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -103,6 +103,16 @@ "struct ^X { enum ^Language { ^CXX = 42, Python = 9000}; };", "int Lang = X::CXX;", }, + // Macros + { + "#define ^CONSTANT 42", + "int Foo = CONSTANT;", + }, + { + "#define ^FOO x", + "#define BAR FOO", + }, + // Misc { // When a type is resolved via a using declaration, the // UsingShadowDecl is not referenced in the AST. Index: clang-tools-extra/clangd/IncludeCleaner.h =================================================================== --- clang-tools-extra/clangd/IncludeCleaner.h +++ clang-tools-extra/clangd/IncludeCleaner.h @@ -33,11 +33,13 @@ using ReferencedLocations = llvm::DenseSet<SourceLocation>; /// Finds locations of all symbols used in the main file. /// -/// Uses RecursiveASTVisitor to go through main file AST and computes all the -/// locations used symbols are coming from. Returned locations may be macro -/// expansions, and are not resolved to their spelling/expansion location. These -/// locations are later used to determine which headers should be marked as -/// "used" and "directly used". +/// - For non-macros uses RecursiveASTVisitor to go through main file AST and +/// computes all the locations used symbols are coming from. Returned +/// locations may be macro expansions, and are not resolved to their spelling +/// or expansion location. These locations are later used to determine which +/// headers should / be marked as "used" and "directly used". +/// - For macros iteratates over \p AST tokens and collects locations of the +/// used macro definition. /// /// We use this to compute unused headers, so we: /// Index: clang-tools-extra/clangd/IncludeCleaner.cpp =================================================================== --- clang-tools-extra/clangd/IncludeCleaner.cpp +++ clang-tools-extra/clangd/IncludeCleaner.cpp @@ -7,9 +7,11 @@ //===----------------------------------------------------------------------===// #include "IncludeCleaner.h" +#include "SourceCode.h" #include "support/Logger.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Tooling/Syntax/Tokens.h" namespace clang { namespace clangd { @@ -133,13 +135,28 @@ } }; +// Gets the tokens from the main file, iterates through them and adds definition +// locations for the found macros. +void findReferencedMacros(ParsedAST &AST, ReferencedLocations &Result) { + auto Tokens = + AST.getTokens().spelledTokens(AST.getSourceManager().getMainFileID()); + for (const syntax::Token &Tok : Tokens) { + auto Macro = locateMacroAt(Tok, AST.getPreprocessor()); + if (!Macro) + continue; + auto Loc = Macro->Info->getDefinitionLoc(); + if (Loc.isValid()) + Result.insert(Loc); + } +} + } // namespace ReferencedLocations findReferencedLocations(ParsedAST &AST) { ReferencedLocations Result; ReferencedLocationCrawler Crawler(Result); Crawler.TraverseAST(AST.getASTContext()); - // FIXME(kirillbobyrev): Handle macros. + findReferencedMacros(AST, Result); return Result; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits