Skip to content

Commit

Permalink
[clangd] Handle the C++2b elifdef and elindef PP structure in Collect…
Browse files Browse the repository at this point in the history
…MainFileMacros.

Reviewed By: kadircet

Differential Revision: https://reviews.llvm.org/D146717
  • Loading branch information
hokein committed Mar 29, 2023
1 parent 2f68ddc commit 3ddfea0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
18 changes: 18 additions & 0 deletions clang-tools-extra/clangd/CollectMacros.cpp
Expand Up @@ -36,33 +36,51 @@ void CollectMainFileMacros::FileChanged(SourceLocation Loc, FileChangeReason,
SrcMgr::CharacteristicKind, FileID) {
InMainFile = isInsideMainFile(Loc, SM);
}

void CollectMainFileMacros::MacroExpands(const Token &MacroName,
const MacroDefinition &MD,
SourceRange Range,
const MacroArgs *Args) {
add(MacroName, MD.getMacroInfo());
}

void CollectMainFileMacros::MacroUndefined(const clang::Token &MacroName,
const clang::MacroDefinition &MD,
const clang::MacroDirective *Undef) {
add(MacroName, MD.getMacroInfo());
}

void CollectMainFileMacros::Ifdef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) {
add(MacroName, MD.getMacroInfo(), /*IsDefinition=*/false,
/*InConditionalDirective=*/true);
}

void CollectMainFileMacros::Ifndef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) {
add(MacroName, MD.getMacroInfo(), /*IsDefinition=*/false,
/*InConditionalDirective=*/true);
}

void CollectMainFileMacros::Elifdef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) {
add(MacroName, MD.getMacroInfo(), /*IsDefinition=*/false,
/*InConditionalDirective=*/true);
}

void CollectMainFileMacros::Elifndef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) {
add(MacroName, MD.getMacroInfo(), /*IsDefinition=*/false,
/*InConditionalDirective=*/true);
}

void CollectMainFileMacros::Defined(const Token &MacroName,
const MacroDefinition &MD,
SourceRange Range) {
add(MacroName, MD.getMacroInfo(), /*IsDefinition=*/false,
/*InConditionalDirective=*/true);
}

void CollectMainFileMacros::SourceRangeSkipped(SourceRange R,
SourceLocation EndifLoc) {
if (!InMainFile)
Expand Down
8 changes: 7 additions & 1 deletion clang-tools-extra/clangd/CollectMacros.h
Expand Up @@ -12,6 +12,7 @@
#include "Protocol.h"
#include "SourceCode.h"
#include "index/SymbolID.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Lex/Preprocessor.h"
#include "llvm/ADT/DenseMap.h"
Expand Down Expand Up @@ -61,11 +62,16 @@ class CollectMainFileMacros : public PPCallbacks {
const clang::MacroDefinition &MD,
const clang::MacroDirective *Undef) override;

// FIXME: handle C++23 #elifdef, #elifndef
void Ifdef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) override;
void Ifndef(SourceLocation Loc, const Token &MacroName,
const MacroDefinition &MD) override;
using PPCallbacks::Elifdef;
using PPCallbacks::Elifndef;
void Elifdef(SourceLocation Loc, const Token &MacroNameTok,
const MacroDefinition &MD) override;
void Elifndef(SourceLocation Loc, const Token &MacroNameTok,
const MacroDefinition &MD) override;

void Defined(const Token &MacroName, const MacroDefinition &MD,
SourceRange Range) override;
Expand Down
10 changes: 8 additions & 2 deletions clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp
Expand Up @@ -56,6 +56,11 @@ TEST(CollectMainFileMacros, SelectedMacros) {
// )cpp",
R"cpp(
#ifdef $Unknown(condit)[[UNDEFINED]]
#elifdef $Unknown(condit)[[UNDEFINED]]
#endif
#ifdef $Unknown(condit)[[UNDEFINED]]
#elifndef $Unknown(condit)[[UNDEFINED]]
#endif
#ifndef $Unknown(condit)[[UNDEFINED]]
Expand Down Expand Up @@ -101,11 +106,12 @@ TEST(CollectMainFileMacros, SelectedMacros) {

for (const char *Test : Tests) {
Annotations T(Test);
auto AST = TestTU::withCode(T.code()).build();
auto Inputs = TestTU::withCode(T.code());
Inputs.ExtraArgs.push_back("-std=c++2b");
auto AST = Inputs.build();
auto ActualMacroRefs = AST.getMacros();
auto &SM = AST.getSourceManager();
auto &PP = AST.getPreprocessor();

for (const auto &[Name, Ranges] : T.all_ranges()) {
if (Name == "Unknown") {
EXPECT_THAT(ActualMacroRefs.UnknownMacros,
Expand Down

0 comments on commit 3ddfea0

Please sign in to comment.