Skip to content

Commit

Permalink
[Sema] Store MacroInfo in CodeCompletionResult for macro results.
Browse files Browse the repository at this point in the history
Summary:
This provides information about the macro definition. For example, it
can be used to compute macro USRs.

Reviewers: sammccall

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D51675

llvm-svn: 341476
  • Loading branch information
Eric Liu committed Sep 5, 2018
1 parent fcc97da commit d485df1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 17 deletions.
10 changes: 9 additions & 1 deletion clang/include/clang/Sema/CodeCompleteConsumer.h
Expand Up @@ -17,6 +17,7 @@
#include "clang-c/Index.h"
#include "clang/AST/Type.h"
#include "clang/Basic/LLVM.h"
#include "clang/Lex/MacroInfo.h"
#include "clang/Sema/CodeCompleteOptions.h"
#include "clang/Sema/DeclSpec.h"
#include "llvm/ADT/ArrayRef.h"
Expand Down Expand Up @@ -843,6 +844,11 @@ class CodeCompletionResult {
/// corresponding `using decl::qualified::name;` nearby.
const UsingShadowDecl *ShadowDecl = nullptr;

/// If the result is RK_Macro, this can store the information about the macro
/// definition. This should be set in most cases but can be missing when
/// the macro has been undefined.
const MacroInfo *MacroDefInfo = nullptr;

/// Build a result that refers to a declaration.
CodeCompletionResult(const NamedDecl *Declaration, unsigned Priority,
NestedNameSpecifier *Qualifier = nullptr,
Expand All @@ -867,11 +873,13 @@ class CodeCompletionResult {

/// Build a result that refers to a macro.
CodeCompletionResult(const IdentifierInfo *Macro,
const MacroInfo *MI = nullptr,
unsigned Priority = CCP_Macro)
: Macro(Macro), Priority(Priority), Kind(RK_Macro),
CursorKind(CXCursor_MacroDefinition), Hidden(false),
QualifierIsInformative(false), StartsNestedNameSpecifier(false),
AllParametersAreInformative(false), DeclaringEntity(false) {}
AllParametersAreInformative(false), DeclaringEntity(false),
MacroDefInfo(MI) {}

/// Build a result that refers to a pattern.
CodeCompletionResult(CodeCompletionString *Pattern,
Expand Down
14 changes: 7 additions & 7 deletions clang/lib/Sema/SemaCodeComplete.cpp
Expand Up @@ -3313,14 +3313,14 @@ static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
M != MEnd; ++M) {
auto MD = PP.getMacroDefinition(M->first);
if (IncludeUndefined || MD) {
if (MacroInfo *MI = MD.getMacroInfo())
if (MI->isUsedForHeaderGuard())
continue;
MacroInfo *MI = MD.getMacroInfo();
if (MI && MI->isUsedForHeaderGuard())
continue;

Results.AddResult(Result(M->first,
getMacroUsagePriority(M->first->getName(),
PP.getLangOpts(),
TargetTypeIsPointer)));
Results.AddResult(
Result(M->first, MI,
getMacroUsagePriority(M->first->getName(), PP.getLangOpts(),
TargetTypeIsPointer)));
}
}

Expand Down
18 changes: 9 additions & 9 deletions clang/tools/libclang/CXCursor.cpp
Expand Up @@ -1412,16 +1412,16 @@ CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
}
} else if (kind == CXCursor_MacroDefinition) {
const MacroDefinitionRecord *definition = getCursorMacroDefinition(cursor);
const IdentifierInfo *MacroInfo = definition->getName();
const IdentifierInfo *Macro = definition->getName();
ASTUnit *unit = getCursorASTUnit(cursor);
CodeCompletionResult Result(MacroInfo);
CodeCompletionString *String
= Result.CreateCodeCompletionString(unit->getASTContext(),
unit->getPreprocessor(),
CodeCompletionContext::CCC_Other,
unit->getCodeCompletionTUInfo().getAllocator(),
unit->getCodeCompletionTUInfo(),
false);
CodeCompletionResult Result(
Macro,
unit->getPreprocessor().getMacroDefinition(Macro).getMacroInfo());
CodeCompletionString *String = Result.CreateCodeCompletionString(
unit->getASTContext(), unit->getPreprocessor(),
CodeCompletionContext::CCC_Other,
unit->getCodeCompletionTUInfo().getAllocator(),
unit->getCodeCompletionTUInfo(), false);
return String;
}
return nullptr;
Expand Down

0 comments on commit d485df1

Please sign in to comment.