12
12
// ===----------------------------------------------------------------------===//
13
13
14
14
#include " clang/ExtractAPI/DeclarationFragments.h"
15
+ #include " clang/AST/ASTFwd.h"
15
16
#include " clang/AST/Decl.h"
16
17
#include " clang/AST/DeclCXX.h"
18
+ #include " clang/AST/TemplateBase.h"
19
+ #include " clang/AST/TemplateName.h"
17
20
#include " clang/AST/Type.h"
18
21
#include " clang/AST/TypeLoc.h"
19
22
#include " clang/ExtractAPI/TypedefUnderlyingTypeResolver.h"
20
23
#include " clang/Index/USRGeneration.h"
21
24
#include " llvm/ADT/StringSwitch.h"
25
+ #include " llvm/Support/ErrorHandling.h"
26
+ #include " llvm/Support/raw_ostream.h"
27
+ #include < optional>
22
28
23
29
using namespace clang ::extractapi;
24
30
using namespace llvm ;
@@ -386,46 +392,24 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForType(
386
392
getFragmentsForType (AT->getElementType (), Context, After));
387
393
}
388
394
389
- // An ElaboratedType is a sugar for types that are referred to using an
390
- // elaborated keyword, e.g., `struct S`, `enum E`, or (in C++) via a
391
- // qualified name, e.g., `N::M::type`, or both.
392
- if (const ElaboratedType *ET = dyn_cast<ElaboratedType>(T)) {
393
- ElaboratedTypeKeyword Keyword = ET->getKeyword ();
394
- if (Keyword != ElaboratedTypeKeyword::ETK_None) {
395
- Fragments
396
- .append (ElaboratedType::getKeywordName (Keyword),
397
- DeclarationFragments::FragmentKind::Keyword)
398
- .appendSpace ();
399
- }
400
-
401
- if (const NestedNameSpecifier *NNS = ET->getQualifier ())
402
- Fragments.append (getFragmentsForNNS (NNS, Context, After));
403
-
404
- // After handling the elaborated keyword or qualified name, build
405
- // declaration fragments for the desugared underlying type.
406
- return Fragments.append (getFragmentsForType (ET->desugar (), Context, After));
407
- }
395
+ if (const TemplateSpecializationType *TemplSpecTy =
396
+ dyn_cast<TemplateSpecializationType>(T)) {
397
+ const auto TemplName = TemplSpecTy->getTemplateName ();
398
+ std::string Str;
399
+ raw_string_ostream Stream (Str);
400
+ TemplName.print (Stream, Context.getPrintingPolicy (),
401
+ TemplateName::Qualified::AsWritten);
402
+ SmallString<64 > USR (" " );
403
+ if (const auto *TemplDecl = TemplName.getAsTemplateDecl ())
404
+ index::generateUSRForDecl (TemplDecl, USR);
408
405
409
- // If the type is a typedefed type, get the underlying TypedefNameDecl for a
410
- // direct reference to the typedef instead of the wrapped type.
411
-
412
- // 'id' type is a typedef for an ObjCObjectPointerType
413
- // we treat it as a typedef
414
- if (const TypedefType *TypedefTy = dyn_cast<TypedefType>(T)) {
415
- const TypedefNameDecl *Decl = TypedefTy->getDecl ();
416
- TypedefUnderlyingTypeResolver TypedefResolver (Context);
417
- std::string USR = TypedefResolver.getUSRForType (QualType (T, 0 ));
418
-
419
- if (T->isObjCIdType ()) {
420
- return Fragments.append (Decl->getName (),
421
- DeclarationFragments::FragmentKind::Keyword);
422
- }
423
-
424
- return Fragments.append (
425
- Decl->getName (), DeclarationFragments::FragmentKind::TypeIdentifier,
426
- USR, TypedefResolver.getUnderlyingTypeDecl (QualType (T, 0 )));
406
+ return Fragments
407
+ .append (Str, DeclarationFragments::FragmentKind::TypeIdentifier, USR)
408
+ .append (" <" , DeclarationFragments::FragmentKind::Text)
409
+ .append (getFragmentsForTemplateArguments (
410
+ TemplSpecTy->template_arguments (), Context, std::nullopt))
411
+ .append (" >" , DeclarationFragments::FragmentKind::Text);
427
412
}
428
-
429
413
// Everything we care about has been handled now, reduce to the canonical
430
414
// unqualified base type.
431
415
QualType Base = T->getCanonicalTypeUnqualified ();
@@ -689,7 +673,6 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForBlock(
689
673
DeclarationFragments
690
674
DeclarationFragmentsBuilder::getFragmentsForFunction (const FunctionDecl *Func) {
691
675
DeclarationFragments Fragments;
692
- // FIXME: Handle template specialization
693
676
switch (Func->getStorageClass ()) {
694
677
case SC_None:
695
678
case SC_PrivateExtern:
@@ -983,27 +966,84 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateParameters(
983
966
Fragments.append (" ," , DeclarationFragments::FragmentKind::Text)
984
967
.appendSpace ();
985
968
986
- const auto *TemplateParam =
987
- dyn_cast<TemplateTypeParmDecl>(ParameterArray[i]);
988
- if (!TemplateParam)
989
- continue ;
990
- if (TemplateParam->hasTypeConstraint ())
991
- Fragments.append (TemplateParam->getTypeConstraint ()
992
- ->getNamedConcept ()
993
- ->getName ()
994
- .str (),
995
- DeclarationFragments::FragmentKind::TypeIdentifier);
996
- else if (TemplateParam->wasDeclaredWithTypename ())
997
- Fragments.append (" typename" , DeclarationFragments::FragmentKind::Keyword);
998
- else
999
- Fragments.append (" class" , DeclarationFragments::FragmentKind::Keyword);
1000
-
1001
- if (TemplateParam->isParameterPack ())
1002
- Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
1003
-
1004
- Fragments.appendSpace ().append (
1005
- TemplateParam->getName (),
1006
- DeclarationFragments::FragmentKind::GenericParameter);
969
+ if (const auto *TemplateParam =
970
+ dyn_cast<TemplateTypeParmDecl>(ParameterArray[i])) {
971
+ if (TemplateParam->hasTypeConstraint ())
972
+ Fragments.append (TemplateParam->getTypeConstraint ()
973
+ ->getNamedConcept ()
974
+ ->getName ()
975
+ .str (),
976
+ DeclarationFragments::FragmentKind::TypeIdentifier);
977
+ else if (TemplateParam->wasDeclaredWithTypename ())
978
+ Fragments.append (" typename" ,
979
+ DeclarationFragments::FragmentKind::Keyword);
980
+ else
981
+ Fragments.append (" class" , DeclarationFragments::FragmentKind::Keyword);
982
+
983
+ if (TemplateParam->isParameterPack ())
984
+ Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
985
+
986
+ if (!TemplateParam->getName ().empty ())
987
+ Fragments.appendSpace ().append (
988
+ TemplateParam->getName (),
989
+ DeclarationFragments::FragmentKind::GenericParameter);
990
+
991
+ if (TemplateParam->hasDefaultArgument ()) {
992
+ DeclarationFragments After;
993
+ Fragments.append (" = " , DeclarationFragments::FragmentKind::Text)
994
+ .append (getFragmentsForType (TemplateParam->getDefaultArgument (),
995
+ TemplateParam->getASTContext (), After));
996
+ Fragments.append (std::move (After));
997
+ }
998
+ } else if (const auto *NTP =
999
+ dyn_cast<NonTypeTemplateParmDecl>(ParameterArray[i])) {
1000
+ DeclarationFragments After;
1001
+ auto TyFragments =
1002
+ getFragmentsForType (NTP->getType (), NTP->getASTContext (), After);
1003
+ Fragments.append (std::move (TyFragments)).append (std::move (After));
1004
+
1005
+ if (NTP->isParameterPack ())
1006
+ Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
1007
+
1008
+ if (!NTP->getName ().empty ())
1009
+ Fragments.appendSpace ().append (
1010
+ NTP->getName (),
1011
+ DeclarationFragments::FragmentKind::GenericParameter);
1012
+
1013
+ if (NTP->hasDefaultArgument ()) {
1014
+ SmallString<8 > ExprStr;
1015
+ raw_svector_ostream Output (ExprStr);
1016
+ NTP->getDefaultArgument ()->printPretty (
1017
+ Output, nullptr , NTP->getASTContext ().getPrintingPolicy ());
1018
+ Fragments.append (" = " , DeclarationFragments::FragmentKind::Text)
1019
+ .append (ExprStr, DeclarationFragments::FragmentKind::Text);
1020
+ }
1021
+ } else if (const auto *TTP =
1022
+ dyn_cast<TemplateTemplateParmDecl>(ParameterArray[i])) {
1023
+ Fragments.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1024
+ .appendSpace ()
1025
+ .append (" <" , DeclarationFragments::FragmentKind::Text)
1026
+ .append (getFragmentsForTemplateParameters (
1027
+ TTP->getTemplateParameters ()->asArray ()))
1028
+ .append (" >" , DeclarationFragments::FragmentKind::Text)
1029
+ .appendSpace ()
1030
+ .append (" typename" ,
1031
+ DeclarationFragments::FragmentKind::Keyword);
1032
+
1033
+ if (TTP->isParameterPack ())
1034
+ Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
1035
+
1036
+ if (!TTP->getName ().empty ())
1037
+ Fragments.appendSpace ().append (
1038
+ TTP->getName (),
1039
+ DeclarationFragments::FragmentKind::GenericParameter);
1040
+ if (TTP->hasDefaultArgument ()) {
1041
+ const auto Default = TTP->getDefaultArgument ();
1042
+ Fragments.append (" = " , DeclarationFragments::FragmentKind::Text)
1043
+ .append (getFragmentsForTemplateArguments (
1044
+ {Default.getArgument ()}, TTP->getASTContext (), {Default}));
1045
+ }
1046
+ }
1007
1047
}
1008
1048
return Fragments;
1009
1049
}
@@ -1024,23 +1064,78 @@ DeclarationFragmentsBuilder::getFragmentsForTemplateArguments(
1024
1064
Fragments.append (" ," , DeclarationFragments::FragmentKind::Text)
1025
1065
.appendSpace ();
1026
1066
1027
- std::string Type = TemplateArguments[i].getAsType ().getAsString ();
1028
- DeclarationFragments After;
1029
- DeclarationFragments ArgumentFragment =
1030
- getFragmentsForType (TemplateArguments[i].getAsType (), Context, After);
1031
-
1032
- if (StringRef (ArgumentFragment.begin ()->Spelling )
1033
- .starts_with (" type-parameter" )) {
1034
- std::string ProperArgName = TemplateArgumentLocs.value ()[i]
1035
- .getTypeSourceInfo ()
1036
- ->getType ()
1037
- .getAsString ();
1038
- ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
1067
+ const auto &CTA = TemplateArguments[i];
1068
+ switch (CTA.getKind ()) {
1069
+ case TemplateArgument::Type: {
1070
+ DeclarationFragments After;
1071
+ DeclarationFragments ArgumentFragment =
1072
+ getFragmentsForType (CTA.getAsType (), Context, After);
1073
+
1074
+ if (StringRef (ArgumentFragment.begin ()->Spelling )
1075
+ .starts_with (" type-parameter" )) {
1076
+ std::string ProperArgName = TemplateArgumentLocs.value ()[i]
1077
+ .getTypeSourceInfo ()
1078
+ ->getType ()
1079
+ .getAsString ();
1080
+ ArgumentFragment.begin ()->Spelling .swap (ProperArgName);
1081
+ }
1082
+ Fragments.append (std::move (ArgumentFragment));
1083
+ break ;
1084
+ }
1085
+ case TemplateArgument::Declaration: {
1086
+ const auto *VD = CTA.getAsDecl ();
1087
+ SmallString<128 > USR;
1088
+ index::generateUSRForDecl (VD, USR);
1089
+ Fragments.append (VD->getNameAsString (),
1090
+ DeclarationFragments::FragmentKind::Identifier, USR);
1091
+ break ;
1039
1092
}
1040
- Fragments.append (std::move (ArgumentFragment));
1093
+ case TemplateArgument::NullPtr:
1094
+ Fragments.append (" nullptr" , DeclarationFragments::FragmentKind::Keyword);
1095
+ break ;
1041
1096
1042
- if (TemplateArguments[i].isPackExpansion ())
1043
- Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
1097
+ case TemplateArgument::Integral: {
1098
+ SmallString<4 > Str;
1099
+ CTA.getAsIntegral ().toString (Str);
1100
+ Fragments.append (Str, DeclarationFragments::FragmentKind::Text);
1101
+ break ;
1102
+ }
1103
+
1104
+ case TemplateArgument::TemplateExpansion:
1105
+ case TemplateArgument::Template: {
1106
+ std::string Str;
1107
+ raw_string_ostream Stream (Str);
1108
+ CTA.getAsTemplate ().print (Stream, Context.getPrintingPolicy ());
1109
+ SmallString<64 > USR (" " );
1110
+ if (const auto *TemplDecl =
1111
+ CTA.getAsTemplateOrTemplatePattern ().getAsTemplateDecl ())
1112
+ index::generateUSRForDecl (TemplDecl, USR);
1113
+ Fragments.append (Str, DeclarationFragments::FragmentKind::TypeIdentifier,
1114
+ USR);
1115
+ if (CTA.getKind () == TemplateArgument::TemplateExpansion)
1116
+ Fragments.append (" ..." , DeclarationFragments::FragmentKind::Text);
1117
+ break ;
1118
+ }
1119
+
1120
+ case TemplateArgument::Pack:
1121
+ Fragments.append (" <" , DeclarationFragments::FragmentKind::Text)
1122
+ .append (getFragmentsForTemplateArguments (CTA.pack_elements (), Context,
1123
+ {}))
1124
+ .append (" >" , DeclarationFragments::FragmentKind::Text);
1125
+ break ;
1126
+
1127
+ case TemplateArgument::Expression: {
1128
+ SmallString<8 > ExprStr;
1129
+ raw_svector_ostream Output (ExprStr);
1130
+ CTA.getAsExpr ()->printPretty (Output, nullptr ,
1131
+ Context.getPrintingPolicy ());
1132
+ Fragments.append (ExprStr, DeclarationFragments::FragmentKind::Text);
1133
+ break ;
1134
+ }
1135
+
1136
+ case TemplateArgument::Null:
1137
+ break ;
1138
+ }
1044
1139
}
1045
1140
return Fragments;
1046
1141
}
@@ -1050,10 +1145,12 @@ DeclarationFragments DeclarationFragmentsBuilder::getFragmentsForConcept(
1050
1145
DeclarationFragments Fragments;
1051
1146
return Fragments
1052
1147
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1148
+ .appendSpace ()
1053
1149
.append (" <" , DeclarationFragments::FragmentKind::Text)
1054
1150
.append (getFragmentsForTemplateParameters (
1055
1151
Concept->getTemplateParameters ()->asArray ()))
1056
1152
.append (" > " , DeclarationFragments::FragmentKind::Text)
1153
+ .appendSpace ()
1057
1154
.append (" concept" , DeclarationFragments::FragmentKind::Keyword)
1058
1155
.appendSpace ()
1059
1156
.append (Concept->getName ().str (),
@@ -1066,6 +1163,7 @@ DeclarationFragmentsBuilder::getFragmentsForRedeclarableTemplate(
1066
1163
const RedeclarableTemplateDecl *RedeclarableTemplate) {
1067
1164
DeclarationFragments Fragments;
1068
1165
Fragments.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1166
+ .appendSpace ()
1069
1167
.append (" <" , DeclarationFragments::FragmentKind::Text)
1070
1168
.append (getFragmentsForTemplateParameters (
1071
1169
RedeclarableTemplate->getTemplateParameters ()->asArray ()))
@@ -1088,6 +1186,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization(
1088
1186
DeclarationFragments Fragments;
1089
1187
return Fragments
1090
1188
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1189
+ .appendSpace ()
1091
1190
.append (" <" , DeclarationFragments::FragmentKind::Text)
1092
1191
.append (" >" , DeclarationFragments::FragmentKind::Text)
1093
1192
.appendSpace ()
@@ -1108,6 +1207,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization(
1108
1207
DeclarationFragments Fragments;
1109
1208
return Fragments
1110
1209
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1210
+ .appendSpace ()
1111
1211
.append (" <" , DeclarationFragments::FragmentKind::Text)
1112
1212
.append (getFragmentsForTemplateParameters (
1113
1213
Decl->getTemplateParameters ()->asArray ()))
@@ -1130,6 +1230,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplateSpecialization(
1130
1230
DeclarationFragments Fragments;
1131
1231
return Fragments
1132
1232
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1233
+ .appendSpace ()
1133
1234
.append (" <" , DeclarationFragments::FragmentKind::Text)
1134
1235
.append (" >" , DeclarationFragments::FragmentKind::Text)
1135
1236
.appendSpace ()
@@ -1149,6 +1250,7 @@ DeclarationFragmentsBuilder::getFragmentsForVarTemplatePartialSpecialization(
1149
1250
DeclarationFragments Fragments;
1150
1251
return Fragments
1151
1252
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1253
+ .appendSpace ()
1152
1254
.append (" <" , DeclarationFragments::FragmentKind::Text)
1153
1255
// Partial specs may have new params.
1154
1256
.append (getFragmentsForTemplateParameters (
@@ -1171,6 +1273,7 @@ DeclarationFragmentsBuilder::getFragmentsForFunctionTemplate(
1171
1273
DeclarationFragments Fragments;
1172
1274
return Fragments
1173
1275
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1276
+ .appendSpace ()
1174
1277
.append (" <" , DeclarationFragments::FragmentKind::Text)
1175
1278
// Partial specs may have new params.
1176
1279
.append (getFragmentsForTemplateParameters (
@@ -1187,6 +1290,7 @@ DeclarationFragmentsBuilder::getFragmentsForFunctionTemplateSpecialization(
1187
1290
DeclarationFragments Fragments;
1188
1291
return Fragments
1189
1292
.append (" template" , DeclarationFragments::FragmentKind::Keyword)
1293
+ .appendSpace ()
1190
1294
.append (" <>" , DeclarationFragments::FragmentKind::Text)
1191
1295
.appendSpace ()
1192
1296
.append (DeclarationFragmentsBuilder::getFragmentsForFunction (Decl));
0 commit comments