Skip to content

Commit bc21bbe

Browse files
committed
[SourceKit] Add a 'mangle simple classes' request, intended to supersede _swift_mangleSimpleClass.
rdar://23525281
1 parent cca9ef5 commit bc21bbe

File tree

5 files changed

+133
-2
lines changed

5 files changed

+133
-2
lines changed

test/SourceKit/Demangle/demangle.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@
1111
// SIMPLIFIED-NEXT: Builtin.Float80
1212
// SIMPLIFIED-NEXT: bar
1313
// SIMPLIFIED-NEXT: END DEMANGLE
14+
15+
// RUN: %sourcekitd-test -req=mangle Foo.Baru Swift.Beer | FileCheck %s -check-prefix=MANGLED
16+
// MANGLED: START MANGLE
17+
// MANGLED-NEXT: _TtC3Foo4Baru
18+
// MANGLED-NEXT: _TtCs4Beer
19+
// MANGLED-NEXT: END MANGLE

tools/SourceKit/tools/sourcekitd-test/TestOptions.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
104104
Request = llvm::StringSwitch<SourceKitRequest>(InputArg->getValue())
105105
.Case("version", SourceKitRequest::ProtocolVersion)
106106
.Case("demangle", SourceKitRequest::DemangleNames)
107+
.Case("mangle", SourceKitRequest::MangleSimpleClasses)
107108
.Case("index", SourceKitRequest::Index)
108109
.Case("complete", SourceKitRequest::CodeComplete)
109110
.Case("complete.open", SourceKitRequest::CodeCompleteOpen)
@@ -132,7 +133,7 @@ bool TestOptions::parseArgs(llvm::ArrayRef<const char *> Args) {
132133
.Default(SourceKitRequest::None);
133134
if (Request == SourceKitRequest::None) {
134135
llvm::errs() << "error: invalid request, expected one of "
135-
<< "version/demangle/index/complete/cursor/related-idents/syntax-map/structure/"
136+
<< "version/demangle/mangle/index/complete/cursor/related-idents/syntax-map/structure/"
136137
"format/expand-placeholder/doc-info/sema/interface-gen/interface-gen-open/"
137138
"find-usr/find-interface/open/edit/print-annotations/extract-comment/"
138139
"module-groups\n";

tools/SourceKit/tools/sourcekitd-test/TestOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum class SourceKitRequest {
2323
None,
2424
ProtocolVersion,
2525
DemangleNames,
26+
MangleSimpleClasses,
2627
Index,
2728
CodeComplete,
2829
CodeCompleteOpen,

tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ static void printModuleGroupNames(sourcekitd_variant_t Info,
5757
static void prepareDemangleRequest(sourcekitd_object_t Req,
5858
const TestOptions &Opts);
5959
static 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

6164
static unsigned resolveFromLineCol(unsigned Line, unsigned Col,
6265
StringRef Filename);
@@ -116,6 +119,7 @@ static sourcekitd_uid_t KeySimplified;
116119

117120
static sourcekitd_uid_t RequestProtocolVersion;
118121
static sourcekitd_uid_t RequestDemangle;
122+
static sourcekitd_uid_t RequestMangleSimpleClass;
119123
static sourcekitd_uid_t RequestIndex;
120124
static sourcekitd_uid_t RequestCodeComplete;
121125
static 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+
11731218
static 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+
11891250
static void initializeRewriteBuffer(StringRef Input,
11901251
clang::RewriteBuffer &RewriteBuf) {
11911252
RewriteBuf.Initialize(Input);

tools/SourceKit/tools/sourcekitd/lib/API/Requests.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class LazySKDUID {
6161
static LazySKDUID RequestProtocolVersion("source.request.protocol_version");
6262

6363
static LazySKDUID RequestDemangle("source.request.demangle");
64+
static LazySKDUID RequestMangleSimpleClass("source.request.mangle_simple_class");
6465

6566
static LazySKDUID RequestIndex("source.request.indexsource");
6667
static LazySKDUID RequestDocInfo("source.request.docinfo");
@@ -146,6 +147,9 @@ static SourceKit::Context &getGlobalContext() {
146147
static sourcekitd_response_t demangleNames(ArrayRef<const char *> MangledNames,
147148
bool Simplified);
148149

150+
static sourcekitd_response_t
151+
mangleSimpleClassNames(ArrayRef<std::pair<StringRef, StringRef>> ModuleClassPairs);
152+
149153
static sourcekitd_response_t indexSource(StringRef Filename,
150154
ArrayRef<const char *> Args,
151155
StringRef KnownHash);
@@ -321,6 +325,33 @@ void handleRequestImpl(sourcekitd_object_t ReqObj, ResponseReceiver Rec) {
321325
return Rec(demangleNames(MangledNames, Simplified));
322326
}
323327

328+
if (ReqUID == RequestMangleSimpleClass) {
329+
SmallVector<std::pair<StringRef, StringRef>, 16> ModuleClassPairs;
330+
sourcekitd_response_t err = nullptr;
331+
bool failed = Req.dictionaryArrayApply(KeyNames, [&](RequestDict dict) {
332+
Optional<StringRef> ModuleName = dict.getString(KeyModuleName);
333+
if (!ModuleName.hasValue()) {
334+
err = createErrorRequestInvalid("missing 'key.modulename'");
335+
return true;
336+
}
337+
Optional<StringRef> ClassName = dict.getString(KeyName);
338+
if (!ClassName.hasValue()) {
339+
err = createErrorRequestInvalid("missing 'key.name'");
340+
return true;
341+
}
342+
ModuleClassPairs.push_back(std::make_pair(*ModuleName, *ClassName));
343+
return false;
344+
});
345+
346+
if (failed) {
347+
if (!err)
348+
err = createErrorRequestInvalid("missing 'key.names'");
349+
return Rec(err);
350+
}
351+
352+
return Rec(mangleSimpleClassNames(ModuleClassPairs));
353+
}
354+
324355
// Just accept 'source.request.buildsettings.register' for now, don't do
325356
// anything else.
326357
// FIXME: Heavy WIP here.
@@ -994,6 +1025,37 @@ static sourcekitd_response_t demangleNames(ArrayRef<const char *> MangledNames,
9941025
return RespBuilder.createResponse();
9951026
}
9961027

1028+
static std::string mangleSimpleClass(StringRef moduleName,
1029+
StringRef className) {
1030+
using namespace swift::Demangle;
1031+
1032+
auto moduleNode = NodeFactory::create(Node::Kind::Module, moduleName);
1033+
auto IdNode = NodeFactory::create(Node::Kind::Identifier, className);
1034+
auto classNode = NodeFactory::create(Node::Kind::Class);
1035+
auto typeNode = NodeFactory::create(Node::Kind::Type);
1036+
auto typeManglingNode = NodeFactory::create(Node::Kind::TypeMangling);
1037+
auto globalNode = NodeFactory::create(Node::Kind::Global);
1038+
1039+
classNode->addChildren(moduleNode, IdNode);
1040+
typeNode->addChild(classNode);
1041+
typeManglingNode->addChild(typeNode);
1042+
globalNode->addChild(typeManglingNode);
1043+
return mangleNode(globalNode);
1044+
}
1045+
1046+
static sourcekitd_response_t
1047+
mangleSimpleClassNames(ArrayRef<std::pair<StringRef, StringRef>> ModuleClassPairs) {
1048+
ResponseBuilder RespBuilder;
1049+
auto Arr = RespBuilder.getDictionary().setArray(KeyResults);
1050+
for (auto &pair : ModuleClassPairs) {
1051+
std::string Result = mangleSimpleClass(pair.first, pair.second);
1052+
auto Entry = Arr.appendDictionary();
1053+
Entry.set(KeyName, Result.c_str());
1054+
}
1055+
1056+
return RespBuilder.createResponse();
1057+
}
1058+
9971059
static sourcekitd_response_t reportDocInfo(llvm::MemoryBuffer *InputBuf,
9981060
StringRef ModuleName,
9991061
ArrayRef<const char *> Args) {

0 commit comments

Comments
 (0)