diff options
author | Daniel Grumberg <dgrumberg@apple.com> | 2022-03-29 17:48:11 +0100 |
---|---|---|
committer | Daniel Grumberg <dgrumberg@apple.com> | 2022-03-30 18:33:10 +0100 |
commit | 529a0570f7e8c5144bd3ad057e43f00e3af58d1b (patch) | |
tree | 113bbcd01f2df35cd3e16fdac2f0ae187efad3aa /clang/lib/ExtractAPI/DeclarationFragments.cpp | |
parent | a9909d23e9bb8c4649cba1c14d479c28df4ca185 (diff) | |
download | llvm-529a0570f7e8c5144bd3ad057e43f00e3af58d1b.zip llvm-529a0570f7e8c5144bd3ad057e43f00e3af58d1b.tar.gz llvm-529a0570f7e8c5144bd3ad057e43f00e3af58d1b.tar.bz2 |
[clang][extract-api] Add support for macros
To achieve this we hook into the preprocessor during the
ExtractAPIAction and record definitions for macros that don't get
undefined during preprocessing.
Diffstat (limited to 'clang/lib/ExtractAPI/DeclarationFragments.cpp')
-rw-r--r-- | clang/lib/ExtractAPI/DeclarationFragments.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/ExtractAPI/DeclarationFragments.cpp b/clang/lib/ExtractAPI/DeclarationFragments.cpp index 7c6c9dc..5997a8f 100644 --- a/clang/lib/ExtractAPI/DeclarationFragments.cpp +++ b/clang/lib/ExtractAPI/DeclarationFragments.cpp @@ -466,7 +466,37 @@ DeclarationFragmentsBuilder::getFragmentsForStruct(const RecordDecl *Record) { if (!Record->getName().empty()) Fragments.appendSpace().append( Record->getName(), DeclarationFragments::FragmentKind::Identifier); + return Fragments; +} +DeclarationFragments +DeclarationFragmentsBuilder::getFragmentsForMacro(StringRef Name, + const MacroDirective *MD) { + DeclarationFragments Fragments; + Fragments.append("#define", DeclarationFragments::FragmentKind::Keyword) + .appendSpace(); + Fragments.append(Name, DeclarationFragments::FragmentKind::Identifier); + + auto *MI = MD->getMacroInfo(); + + if (MI->isFunctionLike()) { + Fragments.append("(", DeclarationFragments::FragmentKind::Text); + unsigned numParameters = MI->getNumParams(); + if (MI->isC99Varargs()) + --numParameters; + for (unsigned i = 0; i < numParameters; ++i) { + if (i) + Fragments.append(", ", DeclarationFragments::FragmentKind::Text); + Fragments.append(MI->params()[i]->getName(), + DeclarationFragments::FragmentKind::InternalParam); + } + if (MI->isVariadic()) { + if (numParameters && MI->isC99Varargs()) + Fragments.append(", ", DeclarationFragments::FragmentKind::Text); + Fragments.append("...", DeclarationFragments::FragmentKind::Text); + } + Fragments.append(")", DeclarationFragments::FragmentKind::Text); + } return Fragments; } @@ -699,3 +729,11 @@ DeclarationFragmentsBuilder::getSubHeading(const ObjCMethodDecl *Method) { return Fragments.append(Method->getNameAsString(), DeclarationFragments::FragmentKind::Identifier); } + +// Subheading of a symbol defaults to its name. +DeclarationFragments +DeclarationFragmentsBuilder::getSubHeadingForMacro(StringRef Name) { + DeclarationFragments Fragments; + Fragments.append(Name, DeclarationFragments::FragmentKind::Identifier); + return Fragments; +} |