[PATCH] D112447: [clangd] IncludeCleaner: Support macros
Kirill Bobyrev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 26 01:36:14 PDT 2021
kbobyrev updated this revision to Diff 382221.
kbobyrev marked 4 inline comments as done.
kbobyrev added a comment.
Try another strategy to reduce the number of processed tokens (doesn't work in
all cases).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112447/new/
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,26 @@
"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",
+ },
+ {
+ "#define INNER 42\n"
+ "#define ^OUTER INNER",
+ "int answer = OUTER;",
+ },
+ {
+ "#define ^ANSWER 42\n"
+ "#define ^SQUARE(X) X * X",
+ "int sq = SQUARE(ANSWER);",
+ },
+ // Misc
{
"enum class ^Color : int;",
"enum class Color : int {};",
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,12 @@
//===----------------------------------------------------------------------===//
#include "IncludeCleaner.h"
+#include "SourceCode.h"
#include "support/Logger.h"
+#include "support/Trace.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Basic/SourceLocation.h"
+#include "clang/Tooling/Syntax/Tokens.h"
namespace clang {
namespace clangd {
@@ -142,13 +145,27 @@
}
};
+// Gets the tokens from the main file, iterates through them and adds definition
+// locations for the found macros.
+void findReferencedMacros(ParsedAST &AST, ReferencedLocations &Result) {
+ trace::Span Tracer("findReferencedMacros");
+ auto &PP = AST.getPreprocessor();
+ for (const auto &MacroName : AST.getMacros().Names.keys()) {
+ dlog("Processing MacroName: {0}", MacroName);
+ auto Definition = PP.getMacroDefinition(PP.getIdentifierInfo(MacroName));
+ auto Loc = Definition.getMacroInfo()->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;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112447.382221.patch
Type: text/x-patch
Size: 3715 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211026/9e0f8f49/attachment.bin>
More information about the cfe-commits
mailing list