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 ;
@@ -573,11 +570,9 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplate(const VarDecl *Var) {
573
570
DeclarationFragments After;
574
571
DeclarationFragments ArgumentFragment =
575
572
getFragmentsForType (T, Var->getASTContext (), After);
576
- if (ArgumentFragment.begin ()->Spelling .substr (0 , 14 ).compare (
577
- " type-parameter" ) == 0 ) {
578
- std::string ProperArgName = getNameForTemplateArgument (
579
- Var->getDescribedVarTemplate ()->getTemplateParameters ()->asArray (),
580
- ArgumentFragment.begin ()->Spelling );
573
+ if (StringRef (ArgumentFragment.begin ()->Spelling )
574
+ .starts_with (" type-parameter" )) {
575
+ std::string ProperArgName = T.getAsString ();
581
576
ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
582
577
}
583
578
Fragments.append (std::move (ArgumentFragment))
@@ -608,14 +603,9 @@ DeclarationFragmentsBuilder::getFragmentsForParam(const ParmVarDecl *Param) {
608
603
else
609
604
TypeFragments.append (getFragmentsForType (T, Param->getASTContext (), After));
610
605
611
- if (TypeFragments.begin ()->Spelling .substr (0 , 14 ).compare (" type-parameter" ) ==
612
- 0 ) {
613
- std::string ProperArgName = getNameForTemplateArgument (
614
- dyn_cast<FunctionDecl>(Param->getDeclContext ())
615
- ->getDescribedFunctionTemplate ()
616
- ->getTemplateParameters ()
617
- ->asArray (),
618
- TypeFragments.begin ()->Spelling );
606
+ if (StringRef (TypeFragments.begin ()->Spelling )
607
+ .starts_with (" type-parameter" )) {
608
+ std::string ProperArgName = Param->getOriginalType ().getAsString ();
619
609
TypeFragments.begin ()->Spelling .swap (ProperArgName);
620
610
}
621
611
@@ -706,13 +696,9 @@ DeclarationFragmentsBuilder::getFragmentsForFunction(const FunctionDecl *Func) {
706
696
DeclarationFragments After;
707
697
auto ReturnValueFragment =
708
698
getFragmentsForType (Func->getReturnType (), Func->getASTContext (), After);
709
- if (ReturnValueFragment.begin ()->Spelling .substr (0 , 14 ).compare (
710
- " type-parameter" ) == 0 ) {
711
- std::string ProperArgName =
712
- getNameForTemplateArgument (Func->getDescribedFunctionTemplate ()
713
- ->getTemplateParameters ()
714
- ->asArray (),
715
- ReturnValueFragment.begin ()->Spelling );
699
+ if (StringRef (ReturnValueFragment.begin ()->Spelling )
700
+ .starts_with (" type-parameter" )) {
701
+ std::string ProperArgName = Func->getReturnType ().getAsString ();
716
702
ReturnValueFragment.begin ()->Spelling .swap (ProperArgName);
717
703
}
718
704
@@ -1001,25 +987,6 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters(
1001
987
return Fragments;
1002
988
}
1003
989
1004
- // Find the name of a template argument from the template's parameters.
1005
- std::string DeclarationFragmentsBuilder::getNameForTemplateArgument (
1006
- const ArrayRef<NamedDecl *> TemplateParameters, std::string TypeParameter) {
1007
- // The arg is a generic parameter from a partial spec, e.g.
1008
- // T in template<typename T> Foo<T, int>.
1009
- //
1010
- // Those names appear as "type-parameter-<index>-<depth>", so we must find its
1011
- // name from the template's parameter list.
1012
- for (unsigned i = 0 ; i < TemplateParameters.size (); ++i) {
1013
- const auto *Parameter =
1014
- dyn_cast<TemplateTypeParmDecl>(TemplateParameters[i]);
1015
- if (TypeParameter.compare (" type-parameter-" +
1016
- std::to_string (Parameter->getDepth ()) + " -" +
1017
- std::to_string (Parameter->getIndex ())) == 0 )
1018
- return std::string (TemplateParameters[i]->getName ());
1019
- }
1020
- llvm_unreachable (" Could not find the name of a template argument." );
1021
- }
1022
-
1023
990
// Get fragments for template arguments, e.g. int in template<typename T>
1024
991
// Foo<int>;
1025
992
//
@@ -1029,7 +996,7 @@ std::string DeclarationFragmentsBuilder::getNameForTemplateArgument(
1029
996
DeclarationFragments
1030
997
DeclarationFragmentsBuilder::getFragmentsForTemplateArguments (
1031
998
const ArrayRef<TemplateArgument> TemplateArguments, ASTContext &Context,
1032
- const std::optional<ArrayRef<NamedDecl * >> TemplateParameters ) {
999
+ const std::optional<ArrayRef<TemplateArgumentLoc >> TemplateArgumentLocs ) {
1033
1000
DeclarationFragments Fragments;
1034
1001
for (unsigned i = 0 , end = TemplateArguments.size (); i != end; ++i) {
1035
1002
if (i)
@@ -1041,10 +1008,12 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments(
1041
1008
DeclarationFragments ArgumentFragment =
1042
1009
getFragmentsForType (TemplateArguments[i].getAsType (), Context, After);
1043
1010
1044
- if (ArgumentFragment.begin ()->Spelling .substr (0 , 14 ).compare (
1045
- " type-parameter" ) == 0 ) {
1046
- std::string ProperArgName = getNameForTemplateArgument (
1047
- TemplateParameters.value (), ArgumentFragment.begin ()->Spelling );
1011
+ if (StringRef (ArgumentFragment.begin ()->Spelling )
1012
+ .starts_with (" type-parameter" )) {
1013
+ std::string ProperArgName = TemplateArgumentLocs.value ()[i]
1014
+ .getTypeSourceInfo ()
1015
+ ->getType ()
1016
+ .getAsString ();
1048
1017
ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
1049
1018
}
1050
1019
Fragments.append (std::move (ArgumentFragment));
@@ -1129,7 +1098,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization(
1129
1098
.append (" <" , DeclarationFragments::FragmentKind::Text)
1130
1099
.append (getFragmentsForTemplateArguments (
1131
1100
Decl->getTemplateArgs ().asArray (), Decl->getASTContext (),
1132
- Decl->getTemplateParameters ()->asArray ()))
1101
+ Decl->getTemplateArgsAsWritten ()->arguments ()))
1133
1102
.append (" >" , DeclarationFragments::FragmentKind::Text)
1134
1103
.append (" ;" , DeclarationFragments::FragmentKind::Text);
1135
1104
}
@@ -1170,7 +1139,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplatePartialSpecialization(
1170
1139
.append (" <" , DeclarationFragments::FragmentKind::Text)
1171
1140
.append (getFragmentsForTemplateArguments (
1172
1141
Decl->getTemplateArgs ().asArray (), Decl->getASTContext (),
1173
- Decl->getTemplateParameters ()->asArray ()))
1142
+ Decl->getTemplateArgsAsWritten ()->arguments ()))
1174
1143
.append (" >" , DeclarationFragments::FragmentKind::Text)
1175
1144
.append (" ;" , DeclarationFragments::FragmentKind::Text);
1176
1145
}
0 commit comments