@@ -57,6 +57,9 @@ static void printModuleGroupNames(sourcekitd_variant_t Info,
5757static void prepareDemangleRequest (sourcekitd_object_t Req,
5858 const TestOptions &Opts);
5959static void printDemangleResults (sourcekitd_variant_t Info, raw_ostream &OS);
60+ static void prepareMangleRequest (sourcekitd_object_t Req,
61+ const TestOptions &Opts);
62+ static void printMangleResults (sourcekitd_variant_t Info, raw_ostream &OS);
6063
6164static unsigned resolveFromLineCol (unsigned Line, unsigned Col,
6265 StringRef Filename);
@@ -116,6 +119,7 @@ static sourcekitd_uid_t KeySimplified;
116119
117120static sourcekitd_uid_t RequestProtocolVersion;
118121static sourcekitd_uid_t RequestDemangle;
122+ static sourcekitd_uid_t RequestMangleSimpleClass;
119123static sourcekitd_uid_t RequestIndex;
120124static sourcekitd_uid_t RequestCodeComplete;
121125static sourcekitd_uid_t RequestCodeCompleteOpen;
@@ -216,6 +220,7 @@ static int skt_main(int argc, const char **argv) {
216220
217221 RequestProtocolVersion = sourcekitd_uid_get_from_cstr (" source.request.protocol_version" );
218222 RequestDemangle = sourcekitd_uid_get_from_cstr (" source.request.demangle" );
223+ RequestMangleSimpleClass = sourcekitd_uid_get_from_cstr (" source.request.mangle_simple_class" );
219224 RequestIndex = sourcekitd_uid_get_from_cstr (" source.request.indexsource" );
220225 RequestCodeComplete = sourcekitd_uid_get_from_cstr (" source.request.codecomplete" );
221226 RequestCodeCompleteOpen = sourcekitd_uid_get_from_cstr (" source.request.codecomplete.open" );
@@ -354,7 +359,8 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
354359 if (Optargc < Args.size ())
355360 Opts.CompilerArgs = Args.slice (Optargc+1 );
356361
357- if (Opts.Request == SourceKitRequest::DemangleNames)
362+ if (Opts.Request == SourceKitRequest::DemangleNames ||
363+ Opts.Request == SourceKitRequest::MangleSimpleClasses)
358364 Opts.SourceFile .clear ();
359365
360366 std::string SourceFile = Opts.SourceFile ;
@@ -400,6 +406,10 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
400406 prepareDemangleRequest (Req, Opts);
401407 break ;
402408
409+ case SourceKitRequest::MangleSimpleClasses:
410+ prepareMangleRequest (Req, Opts);
411+ break ;
412+
403413 case SourceKitRequest::Index:
404414 sourcekitd_request_dictionary_set_uid (Req, KeyRequest, RequestIndex);
405415 break ;
@@ -668,6 +678,10 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
668678 printDemangleResults (sourcekitd_response_get_value (Resp), outs ());
669679 break ;
670680
681+ case SourceKitRequest::MangleSimpleClasses:
682+ printMangleResults (sourcekitd_response_get_value (Resp), outs ());
683+ break ;
684+
671685 case SourceKitRequest::ProtocolVersion:
672686 case SourceKitRequest::Index:
673687 case SourceKitRequest::CodeComplete:
@@ -1170,6 +1184,37 @@ static void prepareDemangleRequest(sourcekitd_object_t Req,
11701184 sourcekitd_request_release (arr);
11711185}
11721186
1187+ static void prepareMangleRequest (sourcekitd_object_t Req,
1188+ const TestOptions &Opts) {
1189+ sourcekitd_request_dictionary_set_uid (Req, KeyRequest, RequestMangleSimpleClass);
1190+ sourcekitd_object_t arr = sourcekitd_request_array_create (nullptr , 0 );
1191+ sourcekitd_request_dictionary_set_value (Req, KeyNames, arr);
1192+
1193+ auto addPair = [&](StringRef ModuleName, StringRef ClassName) {
1194+ sourcekitd_object_t pair =
1195+ sourcekitd_request_dictionary_create (nullptr , nullptr , 0 );
1196+ sourcekitd_request_dictionary_set_stringbuf (pair, KeyModuleName,
1197+ ModuleName.data (), ModuleName.size ());
1198+ sourcekitd_request_dictionary_set_stringbuf (pair, KeyName,
1199+ ClassName.data (), ClassName.size ());
1200+ sourcekitd_request_array_set_value (arr, SOURCEKITD_ARRAY_APPEND, pair);
1201+ sourcekitd_request_release (pair);
1202+ };
1203+
1204+ for (StringRef pair : Opts.Inputs ) {
1205+ auto Idx = pair.find (' .' );
1206+ if (Idx == StringRef::npos) {
1207+ errs () << " expected pairs with format '<module>.<class name>'\n " ;
1208+ ::exit (1 );
1209+ }
1210+ StringRef moduleName = pair.substr (0 , Idx);
1211+ StringRef className = pair.substr (Idx+1 );
1212+ addPair (moduleName, className);
1213+ }
1214+
1215+ sourcekitd_request_release (arr);
1216+ }
1217+
11731218static void printDemangleResults (sourcekitd_variant_t Info, raw_ostream &OS) {
11741219 OS << " START DEMANGLE\n " ;
11751220 sourcekitd_variant_t results =
@@ -1186,6 +1231,22 @@ static void printDemangleResults(sourcekitd_variant_t Info, raw_ostream &OS) {
11861231 OS << " END DEMANGLE\n " ;
11871232}
11881233
1234+ static void printMangleResults (sourcekitd_variant_t Info, raw_ostream &OS) {
1235+ OS << " START MANGLE\n " ;
1236+ sourcekitd_variant_t results =
1237+ sourcekitd_variant_dictionary_get_value (Info, KeyResults);
1238+ sourcekitd_variant_array_apply (results, ^bool (size_t index, sourcekitd_variant_t value) {
1239+ StringRef name = sourcekitd_variant_dictionary_get_string (value, KeyName);
1240+ if (name.empty ())
1241+ OS << " <empty>" ;
1242+ else
1243+ OS << name;
1244+ OS << ' \n ' ;
1245+ return true ;
1246+ });
1247+ OS << " END MANGLE\n " ;
1248+ }
1249+
11891250static void initializeRewriteBuffer (StringRef Input,
11901251 clang::RewriteBuffer &RewriteBuf) {
11911252 RewriteBuf.Initialize (Input);
0 commit comments