1919#include " llvm/ADT/StringSwitch.h"
2020#include " llvm/Support/CommandLine.h"
2121#include " llvm/Support/MemoryBuffer.h"
22+ #include " llvm/Support/Regex.h"
2223#include " llvm/Support/raw_ostream.h"
2324#include " llvm/Support/Signals.h"
2425#include " llvm/Support/FileSystem.h"
@@ -53,6 +54,10 @@ static void expandPlaceholders(llvm::MemoryBuffer *SourceBuf,
5354static void printModuleGroupNames (sourcekitd_variant_t Info,
5455 llvm::raw_ostream &OS);
5556
57+ static void prepareDemangleRequest (sourcekitd_object_t Req,
58+ const TestOptions &Opts);
59+ static void printDemangleResults (sourcekitd_variant_t Info, raw_ostream &OS);
60+
5661static unsigned resolveFromLineCol (unsigned Line, unsigned Col,
5762 StringRef Filename);
5863static unsigned resolveFromLineCol (unsigned Line, unsigned Col,
@@ -76,6 +81,7 @@ static sourcekitd_uid_t KeySourceFile;
7681static sourcekitd_uid_t KeyModuleName;
7782static sourcekitd_uid_t KeyGroupName;
7883static sourcekitd_uid_t KeyName;
84+ static sourcekitd_uid_t KeyNames;
7985static sourcekitd_uid_t KeyFilePath;
8086static sourcekitd_uid_t KeyModuleInterfaceName;
8187static sourcekitd_uid_t KeyLength;
@@ -105,8 +111,10 @@ static sourcekitd_uid_t KeyPopular;
105111static sourcekitd_uid_t KeyUnpopular;
106112static sourcekitd_uid_t KeyTypeInterface;
107113static sourcekitd_uid_t KeyModuleGroups;
114+ static sourcekitd_uid_t KeySimplified;
108115
109116static sourcekitd_uid_t RequestProtocolVersion;
117+ static sourcekitd_uid_t RequestDemangle;
110118static sourcekitd_uid_t RequestIndex;
111119static sourcekitd_uid_t RequestCodeComplete;
112120static sourcekitd_uid_t RequestCodeCompleteOpen;
@@ -164,6 +172,7 @@ static int skt_main(int argc, const char **argv) {
164172 KeyModuleName = sourcekitd_uid_get_from_cstr (" key.modulename" );
165173 KeyGroupName = sourcekitd_uid_get_from_cstr (" key.groupname" );
166174 KeyName = sourcekitd_uid_get_from_cstr (" key.name" );
175+ KeyNames = sourcekitd_uid_get_from_cstr (" key.names" );
167176 KeyFilePath = sourcekitd_uid_get_from_cstr (" key.filepath" );
168177 KeyModuleInterfaceName = sourcekitd_uid_get_from_cstr (" key.module_interface_name" );
169178 KeyLength = sourcekitd_uid_get_from_cstr (" key.length" );
@@ -195,6 +204,7 @@ static int skt_main(int argc, const char **argv) {
195204 KeyUnpopular = sourcekitd_uid_get_from_cstr (" key.unpopular" );
196205 KeyTypeInterface = sourcekitd_uid_get_from_cstr (" key.typeinterface" );
197206 KeyModuleGroups = sourcekitd_uid_get_from_cstr (" key.modulegroups" );
207+ KeySimplified = sourcekitd_uid_get_from_cstr (" key.simplified" );
198208
199209 SemaDiagnosticStage = sourcekitd_uid_get_from_cstr (" source.diagnostic.stage.swift.sema" );
200210
@@ -203,6 +213,7 @@ static int skt_main(int argc, const char **argv) {
203213 semaSemaphore = dispatch_semaphore_create (0 );
204214
205215 RequestProtocolVersion = sourcekitd_uid_get_from_cstr (" source.request.protocol_version" );
216+ RequestDemangle = sourcekitd_uid_get_from_cstr (" source.request.demangle" );
206217 RequestIndex = sourcekitd_uid_get_from_cstr (" source.request.indexsource" );
207218 RequestCodeComplete = sourcekitd_uid_get_from_cstr (" source.request.codecomplete" );
208219 RequestCodeCompleteOpen = sourcekitd_uid_get_from_cstr (" source.request.codecomplete.open" );
@@ -341,6 +352,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
341352 if (Optargc < Args.size ())
342353 Opts.CompilerArgs = Args.slice (Optargc+1 );
343354
355+ if (Opts.Request == SourceKitRequest::DemangleNames)
356+ Opts.SourceFile .clear ();
357+
344358 std::string SourceFile = Opts.SourceFile ;
345359 if (!SourceFile.empty ()) {
346360 llvm::SmallString<64 > AbsSourceFile;
@@ -380,6 +394,10 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
380394 sourcekitd_request_dictionary_set_uid (Req, KeyRequest, RequestProtocolVersion);
381395 break ;
382396
397+ case SourceKitRequest::DemangleNames:
398+ prepareDemangleRequest (Req, Opts);
399+ break ;
400+
383401 case SourceKitRequest::Index:
384402 sourcekitd_request_dictionary_set_uid (Req, KeyRequest, RequestIndex);
385403 break ;
@@ -642,6 +660,10 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
642660 KeepResponseAlive = true ;
643661 break ;
644662
663+ case SourceKitRequest::DemangleNames:
664+ printDemangleResults (sourcekitd_response_get_value (Resp), outs ());
665+ break ;
666+
645667 case SourceKitRequest::ProtocolVersion:
646668 case SourceKitRequest::Index:
647669 case SourceKitRequest::CodeComplete:
@@ -1107,6 +1129,59 @@ static void printRelatedIdents(sourcekitd_variant_t Info, StringRef Filename,
11071129 OS << " END RANGES\n " ;
11081130}
11091131
1132+ static void prepareDemangleRequest (sourcekitd_object_t Req,
1133+ const TestOptions &Opts) {
1134+ sourcekitd_request_dictionary_set_uid (Req, KeyRequest, RequestDemangle);
1135+ if (Opts.SimplifiedDemangling )
1136+ sourcekitd_request_dictionary_set_int64 (Req, KeySimplified, 1 );
1137+ sourcekitd_object_t arr = sourcekitd_request_array_create (nullptr , 0 );
1138+ sourcekitd_request_dictionary_set_value (Req, KeyNames, arr);
1139+
1140+ auto addName = [&](StringRef MangledName) {
1141+ sourcekitd_request_array_set_stringbuf (arr, SOURCEKITD_ARRAY_APPEND,
1142+ MangledName.data (), MangledName.size ());
1143+ };
1144+
1145+ if (Opts.Inputs .empty ()) {
1146+ auto input = llvm::MemoryBuffer::getSTDIN ();
1147+ if (!input) {
1148+ llvm::errs () << input.getError ().message () << ' \n ' ;
1149+ ::exit (1 );
1150+ }
1151+ llvm::StringRef inputContents = input.get ()->getBuffer ();
1152+
1153+ // This doesn't handle Unicode symbols, but maybe that's okay.
1154+ llvm::Regex maybeSymbol (" _T[_a-zA-Z0-9$]+" );
1155+ llvm::SmallVector<llvm::StringRef, 1 > matches;
1156+ while (maybeSymbol.match (inputContents, &matches)) {
1157+ addName (matches.front ());
1158+ }
1159+
1160+ } else {
1161+ for (llvm::StringRef name : Opts.Inputs ) {
1162+ addName (name);
1163+ }
1164+ }
1165+
1166+ sourcekitd_request_release (arr);
1167+ }
1168+
1169+ static void printDemangleResults (sourcekitd_variant_t Info, raw_ostream &OS) {
1170+ OS << " START DEMANGLE\n " ;
1171+ sourcekitd_variant_t results =
1172+ sourcekitd_variant_dictionary_get_value (Info, KeyResults);
1173+ sourcekitd_variant_array_apply (results, ^bool (size_t index, sourcekitd_variant_t value) {
1174+ StringRef name = sourcekitd_variant_dictionary_get_string (value, KeyName);
1175+ if (name.empty ())
1176+ OS << " <empty>" ;
1177+ else
1178+ OS << name;
1179+ OS << ' \n ' ;
1180+ return true ;
1181+ });
1182+ OS << " END DEMANGLE\n " ;
1183+ }
1184+
11101185static void initializeRewriteBuffer (StringRef Input,
11111186 clang::RewriteBuffer &RewriteBuf) {
11121187 RewriteBuf.Initialize (Input);
0 commit comments