14
14
#include " clang/ExtractAPI/DeclarationFragments.h"
15
15
#include " clang/AST/Decl.h"
16
16
#include " clang/AST/DeclCXX.h"
17
- #include " clang/AST/QualTypeNames.h"
18
17
#include " clang/AST/Type.h"
19
18
#include " clang/AST/TypeLoc.h"
20
- #include " clang/Basic/OperatorKinds.h"
21
19
#include " clang/ExtractAPI/TypedefUnderlyingTypeResolver.h"
22
20
#include " clang/Index/USRGeneration.h"
23
21
#include " llvm/ADT/StringSwitch.h"
24
- #include < typeinfo>
25
22
26
23
using namespace clang ::extractapi;
27
24
using namespace llvm ;
@@ -535,9 +532,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplate(const VarDecl *Var) {
535
532
getFragmentsForType (T, Var->getASTContext (), After);
536
533
if (StringRef (ArgumentFragment.begin ()->Spelling )
537
534
.starts_with (" type-parameter" )) {
538
- std::string ProperArgName = getNameForTemplateArgument (
539
- Var->getDescribedVarTemplate ()->getTemplateParameters ()->asArray (),
540
- ArgumentFragment.begin ()->Spelling );
535
+ std::string ProperArgName = T.getAsString ();
541
536
ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
542
537
}
543
538
Fragments.append (std::move (ArgumentFragment))
@@ -570,12 +565,7 @@ DeclarationFragmentsBuilder::getFragmentsForParam(const ParmVarDecl *Param) {
570
565
571
566
if (StringRef (TypeFragments.begin ()->Spelling )
572
567
.starts_with (" type-parameter" )) {
573
- std::string ProperArgName = getNameForTemplateArgument (
574
- dyn_cast<FunctionDecl>(Param->getDeclContext ())
575
- ->getDescribedFunctionTemplate ()
576
- ->getTemplateParameters ()
577
- ->asArray (),
578
- TypeFragments.begin ()->Spelling );
568
+ std::string ProperArgName = Param->getOriginalType ().getAsString ();
579
569
TypeFragments.begin ()->Spelling .swap (ProperArgName);
580
570
}
581
571
@@ -668,11 +658,7 @@ DeclarationFragmentsBuilder::getFragmentsForFunction(const FunctionDecl *Func) {
668
658
getFragmentsForType (Func->getReturnType (), Func->getASTContext (), After);
669
659
if (StringRef (ReturnValueFragment.begin ()->Spelling )
670
660
.starts_with (" type-parameter" )) {
671
- std::string ProperArgName =
672
- getNameForTemplateArgument (Func->getDescribedFunctionTemplate ()
673
- ->getTemplateParameters ()
674
- ->asArray (),
675
- ReturnValueFragment.begin ()->Spelling );
661
+ std::string ProperArgName = Func->getReturnType ().getAsString ();
676
662
ReturnValueFragment.begin ()->Spelling .swap (ProperArgName);
677
663
}
678
664
@@ -961,25 +947,6 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters(
961
947
return Fragments;
962
948
}
963
949
964
- // Find the name of a template argument from the template's parameters.
965
- std::string DeclarationFragmentsBuilder::getNameForTemplateArgument (
966
- const ArrayRef<NamedDecl *> TemplateParameters, std::string TypeParameter) {
967
- // The arg is a generic parameter from a partial spec, e.g.
968
- // T in template<typename T> Foo<T, int>.
969
- //
970
- // Those names appear as "type-parameter-<index>-<depth>", so we must find its
971
- // name from the template's parameter list.
972
- for (unsigned i = 0 ; i < TemplateParameters.size (); ++i) {
973
- const auto *Parameter =
974
- dyn_cast<TemplateTypeParmDecl>(TemplateParameters[i]);
975
- if (TypeParameter.compare (" type-parameter-" +
976
- std::to_string (Parameter->getDepth ()) + " -" +
977
- std::to_string (Parameter->getIndex ())) == 0 )
978
- return std::string (TemplateParameters[i]->getName ());
979
- }
980
- llvm_unreachable (" Could not find the name of a template argument." );
981
- }
982
-
983
950
// Get fragments for template arguments, e.g. int in template<typename T>
984
951
// Foo<int>;
985
952
//
@@ -989,7 +956,7 @@ std::string DeclarationFragmentsBuilder::getNameForTemplateArgument(
989
956
DeclarationFragments
990
957
DeclarationFragmentsBuilder::getFragmentsForTemplateArguments (
991
958
const ArrayRef<TemplateArgument> TemplateArguments, ASTContext &Context,
992
- const std::optional<ArrayRef<NamedDecl * >> TemplateParameters ) {
959
+ const std::optional<ArrayRef<TemplateArgumentLoc >> TemplateArgumentLocs ) {
993
960
DeclarationFragments Fragments;
994
961
for (unsigned i = 0 , end = TemplateArguments.size (); i != end; ++i) {
995
962
if (i)
@@ -1003,8 +970,10 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments(
1003
970
1004
971
if (StringRef (ArgumentFragment.begin ()->Spelling )
1005
972
.starts_with (" type-parameter" )) {
1006
- std::string ProperArgName = getNameForTemplateArgument (
1007
- TemplateParameters.value (), ArgumentFragment.begin ()->Spelling );
973
+ std::string ProperArgName = TemplateArgumentLocs.value ()[i]
974
+ .getTypeSourceInfo ()
975
+ ->getType ()
976
+ .getAsString ();
1008
977
ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
1009
978
}
1010
979
Fragments.append (std::move (ArgumentFragment));
@@ -1089,7 +1058,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization(
1089
1058
.append (" <" , DeclarationFragments::FragmentKind::Text)
1090
1059
.append (getFragmentsForTemplateArguments (
1091
1060
Decl->getTemplateArgs ().asArray (), Decl->getASTContext (),
1092
- Decl->getTemplateParameters ()->asArray ()))
1061
+ Decl->getTemplateArgsAsWritten ()->arguments ()))
1093
1062
.append (" >" , DeclarationFragments::FragmentKind::Text)
1094
1063
.append (" ;" , DeclarationFragments::FragmentKind::Text);
1095
1064
}
@@ -1130,7 +1099,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplatePartialSpecialization(
1130
1099
.append (" <" , DeclarationFragments::FragmentKind::Text)
1131
1100
.append (getFragmentsForTemplateArguments (
1132
1101
Decl->getTemplateArgs ().asArray (), Decl->getASTContext (),
1133
- Decl->getTemplateParameters ()->asArray ()))
1102
+ Decl->getTemplateArgsAsWritten ()->arguments ()))
1134
1103
.append (" >" , DeclarationFragments::FragmentKind::Text)
1135
1104
.append (" ;" , DeclarationFragments::FragmentKind::Text);
1136
1105
}
0 commit comments