diff options
author | Erick Velez <erickvelez7@gmail.com> | 2023-08-18 14:33:51 -0700 |
---|---|---|
committer | Erick Velez <erickvelez7@gmail.com> | 2023-08-18 17:42:05 -0700 |
commit | 80b787e803292119f30da2e1e95acff5beea61db (patch) | |
tree | db961868b6cdeae887e99f51c0d596c375588a3f /clang/lib/ExtractAPI/DeclarationFragments.cpp | |
parent | 3e569883fa7d6029a776efc992dbc45c257a2aa1 (diff) | |
download | llvm-80b787e803292119f30da2e1e95acff5beea61db.zip llvm-80b787e803292119f30da2e1e95acff5beea61db.tar.gz llvm-80b787e803292119f30da2e1e95acff5beea61db.tar.bz2 |
[clang][ExtractAPI] Add support for C++ global function templates
Add records, serialization for global function templates and their specializations
Depends on D157350
Reviewed By: dang
Differential Revision: https://reviews.llvm.org/D157579
Diffstat (limited to 'clang/lib/ExtractAPI/DeclarationFragments.cpp')
-rw-r--r-- | clang/lib/ExtractAPI/DeclarationFragments.cpp | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/clang/lib/ExtractAPI/DeclarationFragments.cpp b/clang/lib/ExtractAPI/DeclarationFragments.cpp index 271355d..8a0a628 100644 --- a/clang/lib/ExtractAPI/DeclarationFragments.cpp +++ b/clang/lib/ExtractAPI/DeclarationFragments.cpp @@ -493,6 +493,16 @@ DeclarationFragmentsBuilder::getFragmentsForParam(const ParmVarDecl *Param) { DeclarationFragments TypeFragments = getFragmentsForType(T, Param->getASTContext(), After); + if (TypeFragments.begin()->Spelling.substr(0, 14).compare("type-parameter") == + 0) { + std::string ProperArgName = getNameForTemplateArgument( + dyn_cast<FunctionDecl>(Param->getDeclContext()) + ->getDescribedFunctionTemplate() + ->getTemplateParameters() + ->asArray(), + TypeFragments.begin()->Spelling); + TypeFragments.begin()->Spelling.swap(ProperArgName); + } if (Param->isObjCMethodParameter()) Fragments.append("(", DeclarationFragments::FragmentKind::Text) @@ -536,12 +546,35 @@ DeclarationFragmentsBuilder::getFragmentsForFunction(const FunctionDecl *Func) { // FIXME: Is `after` actually needed here? DeclarationFragments After; - Fragments - .append(getFragmentsForType(Func->getReturnType(), Func->getASTContext(), - After)) + auto ReturnValueFragment = + getFragmentsForType(Func->getReturnType(), Func->getASTContext(), After); + if (ReturnValueFragment.begin()->Spelling.substr(0, 14).compare( + "type-parameter") == 0) { + std::string ProperArgName = + getNameForTemplateArgument(Func->getDescribedFunctionTemplate() + ->getTemplateParameters() + ->asArray(), + ReturnValueFragment.begin()->Spelling); + ReturnValueFragment.begin()->Spelling.swap(ProperArgName); + } + + Fragments.append(std::move(ReturnValueFragment)) .appendSpace() - .append(Func->getName(), DeclarationFragments::FragmentKind::Identifier) - .append(std::move(After)); + .append(Func->getName(), DeclarationFragments::FragmentKind::Identifier); + + if (Func->getTemplateSpecializationInfo()) { + Fragments.append("<", DeclarationFragments::FragmentKind::Text); + + for (unsigned i = 0, end = Func->getNumParams(); i != end; ++i) { + if (i) + Fragments.append(", ", DeclarationFragments::FragmentKind::Text); + Fragments.append( + getFragmentsForType(Func->getParamDecl(i)->getType(), + Func->getParamDecl(i)->getASTContext(), After)); + } + Fragments.append(">", DeclarationFragments::FragmentKind::Text); + } + Fragments.append(std::move(After)); Fragments.append("(", DeclarationFragments::FragmentKind::Text); for (unsigned i = 0, end = Func->getNumParams(); i != end; ++i) { @@ -975,6 +1008,33 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplatePartialSpecialization( } DeclarationFragments +DeclarationFragmentsBuilder::getFragmentsForFunctionTemplate( + const FunctionTemplateDecl *Decl) { + DeclarationFragments Fragments; + return Fragments + .append("template", DeclarationFragments::FragmentKind::Keyword) + .append("<", DeclarationFragments::FragmentKind::Text) + // Partial specs may have new params. + .append(getFragmentsForTemplateParameters( + Decl->getTemplateParameters()->asArray())) + .append(">", DeclarationFragments::FragmentKind::Text) + .appendSpace() + .append(DeclarationFragmentsBuilder::getFragmentsForFunction( + Decl->getAsFunction())); +} + +DeclarationFragments +DeclarationFragmentsBuilder::getFragmentsForFunctionTemplateSpecialization( + const FunctionDecl *Decl) { + DeclarationFragments Fragments; + return Fragments + .append("template", DeclarationFragments::FragmentKind::Keyword) + .append("<>", DeclarationFragments::FragmentKind::Text) + .appendSpace() + .append(DeclarationFragmentsBuilder::getFragmentsForFunction(Decl)); +} + +DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForMacro(StringRef Name, const MacroDirective *MD) { DeclarationFragments Fragments; |