Skip to content

Commit 8aaf2d6

Browse files
committed
[sourcekitd] Take the colons out of name-translation API
This makes us more lenient about what we accept for Objective-C selectors by allowing you to include or not include the trailing colons. We don't actually need that information, because we have access to the declaration, so it was only being used for validation, which made the API harder to use for clients that didn't carefully track zero vs one-arg selector names. Also remove the colons from the response, and instead add a bit to say whether it is a zero-arg or one-arg selector. This makes the response easier to use for clients that don't care about this information, and more consistent with the change to the input. rdar://problem/32177934
1 parent 3f55690 commit 8aaf2d6

File tree

9 files changed

+48
-21
lines changed

9 files changed

+48
-21
lines changed

test/SourceKit/NameTranslation/basic.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func foo2 (_ a : FooClassDerived) {
2323
// RUN: %sourcekitd-test -req=translate -objc-selector FooClassDerived2 -pos=3:23 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK11 %s
2424
// RUN: %sourcekitd-test -req=translate -objc-name fooProperty2 -pos=6:16 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK2 %s
2525
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc1 -pos=7:16 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK3 %s
26+
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc1: -pos=7:16 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK3 %s
2627
// RUN: %sourcekitd-test -req=translate -objc-selector fooFunc3:d:d:d: -pos=8:4 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
2728

2829
// RUN: %sourcekitd-test -req=translate -objc-selector fooBaseInstanceFuncOverridden1 -pos=12:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK4 %s
@@ -42,7 +43,6 @@ func foo2 (_ a : FooClassDerived) {
4243
// RUN: %sourcekitd-test -req=translate -objc-selector initWithfloat2:D: -pos=17:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
4344
// RUN: %sourcekitd-test -req=translate -objc-selector init: -pos=17:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK13 %s
4445
// RUN: %sourcekitd-test -req=translate -objc-selector iit: -pos=17:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK13 %s
45-
// RUN: %sourcekitd-test -req=translate -objc-selector init: -pos=18:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
4646
// RUN: %sourcekitd-test -req=translate -objc-selector NAME -pos=18:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK14 %s
4747

4848
// CHECK1: FooClassDerived2

test/SourceKit/NameTranslation/init.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ func foo2 () {
77

88
// REQUIRES: objc_interop
99
// RUN: %sourcekitd-test -req=translate -objc-selector initWithFloat2: -pos=4:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
10-
// RUN: %sourcekitd-test -req=translate -objc-selector initWithFloat2 -pos=4:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
10+
// RUN: %sourcekitd-test -req=translate -objc-selector initWithFloat2 -pos=4:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
1111
// RUN: %sourcekitd-test -req=translate -objc-selector initWithFloat2:second2: -pos=5:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK2 %s
1212
// RUN: %sourcekitd-test -req=translate -objc-selector initWithFloat2:second2:third: -pos=5:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
1313
// RUN: %sourcekitd-test -req=translate -objc-selector initFloat2:second2: -pos=5:15 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK2 %s

test/SourceKit/NameTranslation/swiftnames.swift

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,13 @@ class C2 {}
5151
@objc open func /*MyClass_foo*/foo(/*MyClass_foo_p1*/bar: Int, /*MyClass_foo_p2*/baz: Int) {}
5252
}
5353

54+
class C3: NSObject {
55+
@objc func oneArg(_: Int) {}
56+
}
57+
5458
// REQUIRES: objc_interop
5559
// RUN: %sourcekitd-test -req=translate -swift-name "foo(a:b:c:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
60+
// RUN: %sourcekitd-test -req=translate -swift-name "foo(a:b:c:)" -pos=11:11 %s -print-raw-response -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK_RAW1 %s
5661
// RUN: %sourcekitd-test -req=translate -swift-name "bar(x:y:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKFEWER1 %s
5762
// RUN: %sourcekitd-test -req=translate -swift-name "bar(::)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKMISSING1 %s
5863
// RUN: %sourcekitd-test -req=translate -swift-name "(x:y:z:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKMISSING2 %s
@@ -63,6 +68,7 @@ class C2 {}
6368
// RUN: %sourcekitd-test -req=translate -swift-name "foo2(a:b:c:)" -pos=12:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK6 %s
6469
// RUN: %sourcekitd-test -req=translate -swift-name "foo2(_:_:_:)" -pos=12:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK7 %s
6570
// RUN: %sourcekitd-test -req=translate -swift-name "foo1()" -pos=14:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK8 %s
71+
// RUN: %sourcekitd-test -req=translate -swift-name "foo1()" -pos=14:11 %s -print-raw-response -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK_RAW8 %s
6672
// RUN: %sourcekitd-test -req=translate -swift-name "foo1(a:b:c:)" -pos=14:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
6773
// RUN: %sourcekitd-test -req=translate -swift-name "C11" -pos=1:8 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK9 %s
6874

@@ -76,6 +82,8 @@ class C2 {}
7682
// RUN: %sourcekitd-test -req=translate -swift-name "A2" -pos=41:10 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK14 %s
7783
// RUN: %sourcekitd-test -req=translate -swift-name "C3" -pos=48:8 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK15 %s
7884
// RUN: %sourcekitd-test -req=translate -swift-name "bar(_:other:)" -pos=51:36 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK16 %s
85+
// RUN: %sourcekitd-test -req=translate -swift-name "zoo(m:)" -pos=55:14 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK17 %s
86+
// RUN: %sourcekitd-test -req=translate -swift-name "zoo(m:)" -pos=55:14 %s -print-raw-response -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK_RAW17 %s
7987

8088
// CHECK-NONE: <empty name translation info>
8189
// CHECK1: fooWithA:b:c:
@@ -85,7 +93,7 @@ class C2 {}
8593
// CHECK5: foo1:::
8694
// CHECK6: foo2WithA:b:c:
8795
// CHECK7: foo2:::
88-
// CHECK8: foo1
96+
// CHECK8: foo1{{$}}
8997
// CHECK9: C11
9098

9199
// CHECK10: initWithA1:b2:
@@ -95,7 +103,24 @@ class C2 {}
95103
// CHECK14: CustomErrorA2
96104
// CHECK15: C2ObjC
97105
// CHECK16: bar:other:
106+
// CHECK17: zooWithM:
98107

99108
// CHECKFEWER1: barWithX:y:c:
100109
// CHECKMISSING1: barWithA:b:c:
101110
// CHECKMISSING2: fooWithX:y:z:
111+
112+
// CHECK_RAW1-LABEL: key.selectorpieces
113+
// CHECK_RAW1: "fooWithA"
114+
// CHECK_RAW1: "b"
115+
// CHECK_RAW1: "c"
116+
// CHECK_RAW1: key.namekind: source.lang.name.kind.objc
117+
118+
// CHECK_RAW8-LABEL: key.selectorpieces
119+
// CHECK_RAW8: "foo1"
120+
// CHECK_RAW8: key.namekind: source.lang.name.kind.objc
121+
// CHECK_RAW8: key.is_zero_arg_selector: 1
122+
123+
// CHECK_RAW17-LABEL: key.selectorpieces
124+
// CHECK_RAW17: "zooWithM"
125+
// CHECK_RAW17: key.namekind: source.lang.name.kind.objc
126+
// CHECK_RAW17-NOT: key.is_zero_arg_selector

tools/SourceKit/include/SourceKit/Core/LangSupport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ struct NameTranslatingInfo {
300300
UIdent NameKind;
301301
StringRef BaseName;
302302
std::vector<StringRef> ArgNames;
303+
bool IsZeroArgSelector = false;
303304
};
304305

305306
struct RelatedIdentsInfo {

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -900,17 +900,10 @@ getClangDeclarationName(const clang::NamedDecl *ND, NameTranslatingInfo &Info) {
900900
if (!Info.BaseName.empty()) {
901901
return clang::DeclarationName(&Ctx.Idents.get(Info.BaseName));
902902
} else {
903-
StringRef last = Info.ArgNames.back();
904-
905903
switch (OrigName.getNameKind()) {
906904
case clang::DeclarationName::ObjCZeroArgSelector:
907-
if (last.endswith(":"))
908-
return clang::DeclarationName();
909-
break;
910905
case clang::DeclarationName::ObjCOneArgSelector:
911906
case clang::DeclarationName::ObjCMultiArgSelector:
912-
if (!last.empty() && !last.endswith(":"))
913-
return clang::DeclarationName();
914907
break;
915908
default:
916909
return clang::DeclarationName();
@@ -982,8 +975,8 @@ static bool passNameInfoForDecl(const ValueDecl *VD, NameTranslatingInfo &Info,
982975
if (Selector.getNumArgs()) {
983976
assert(Pieces.back().empty());
984977
Pieces.pop_back();
985-
std::transform(Pieces.begin(), Pieces.end(), Pieces.begin(),
986-
[](StringRef P) { return StringRef(P.data(), P.size() + 1); });
978+
} else {
979+
Result.IsZeroArgSelector = true;
987980
}
988981
Result.ArgNames.insert(Result.ArgNames.begin(), Pieces.begin(), Pieces.end());
989982
Receiver(Result);

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ static sourcekitd_uid_t KeyRangeContent;
139139
static sourcekitd_uid_t KeyBaseName;
140140
static sourcekitd_uid_t KeyArgNames;
141141
static sourcekitd_uid_t KeySelectorPieces;
142+
static sourcekitd_uid_t KeyIsZeroArgSelector;
142143
static sourcekitd_uid_t KeyNameKind;
143144
static sourcekitd_uid_t KeySwiftVersion;
144145
static sourcekitd_uid_t KeyCancelOnSubsequentRequest;
@@ -271,6 +272,7 @@ static int skt_main(int argc, const char **argv) {
271272
KeyBaseName = sourcekitd_uid_get_from_cstr("key.basename");
272273
KeyArgNames = sourcekitd_uid_get_from_cstr("key.argnames");
273274
KeySelectorPieces = sourcekitd_uid_get_from_cstr("key.selectorpieces");
275+
KeyIsZeroArgSelector = sourcekitd_uid_get_from_cstr("key.is_zero_arg_selector");
274276
KeyNameKind = sourcekitd_uid_get_from_cstr("key.namekind");
275277

276278
KeySwiftVersion = sourcekitd_uid_get_from_cstr("key.swift_version");
@@ -634,15 +636,6 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
634636
if (ArgPieces.back().empty())
635637
ArgPieces.pop_back();
636638
ArgName = KeySelectorPieces;
637-
std::transform(ArgPieces.begin(), ArgPieces.end(), ArgPieces.begin(),
638-
[Name] (StringRef T) {
639-
if (!T.empty() && T.data() + T.size() < Name.data() + Name.size() &&
640-
*(T.data() + T.size()) == ':') {
641-
// Include the colon belonging to the piece.
642-
return StringRef(T.data(), T.size() + 1);
643-
}
644-
return T;
645-
});
646639
} else {
647640
llvm::errs() << "must specify either -swift-name or -objc-name or -objc-selector\n";
648641
return 1;
@@ -1163,6 +1156,12 @@ static void printNameTranslationInfo(sourcekitd_variant_t Info,
11631156
Selectors.push_back(sourcekitd_variant_dictionary_get_string(Entry, KeyName));
11641157
}
11651158

1159+
bool IsZeroArgSelector = false;
1160+
auto IsZeroArgObj = sourcekitd_variant_dictionary_get_value(Info, KeyIsZeroArgSelector);
1161+
if (sourcekitd_variant_get_type(IsZeroArgObj) != SOURCEKITD_VARIANT_TYPE_NULL) {
1162+
IsZeroArgSelector = sourcekitd_variant_int64_get_value(IsZeroArgObj);
1163+
}
1164+
11661165
std::vector<const char *> Args;
11671166
sourcekitd_variant_t ArgsObj =
11681167
sourcekitd_variant_dictionary_get_value(Info, KeyArgNames);
@@ -1188,6 +1187,9 @@ static void printNameTranslationInfo(sourcekitd_variant_t Info,
11881187
}
11891188
for (auto S : Selectors) {
11901189
OS << S;
1190+
if (!IsZeroArgSelector) {
1191+
OS << ":";
1192+
}
11911193
}
11921194
OS << '\n';
11931195
}

tools/SourceKit/tools/sourcekitd/lib/API/DictionaryKeys.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ extern SourceKit::UIdent KeyArgNames;
132132
extern SourceKit::UIdent KeySelectorPieces;
133133
extern SourceKit::UIdent KeyNameKind;
134134
extern SourceKit::UIdent KeyLocalizationKey;
135+
extern SourceKit::UIdent KeyIsZeroArgSelector;
135136

136137
extern SourceKit::UIdent KeySwiftVersion;
137138

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,6 +1523,9 @@ static void reportNameInfo(const NameTranslatingInfo &Info, ResponseReceiver Rec
15231523
NameEle.set(KeyName, N);
15241524
}
15251525
}
1526+
if (Info.IsZeroArgSelector) {
1527+
Elem.set(KeyIsZeroArgSelector, Info.IsZeroArgSelector);
1528+
}
15261529
Rec(RespBuilder.createResponse());
15271530
}
15281531

tools/SourceKit/tools/sourcekitd/lib/API/sourcekitdAPI-Common.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ UIdent sourcekitd::KeyArgNames("key.argnames");
145145
UIdent sourcekitd::KeySelectorPieces("key.selectorpieces");
146146
UIdent sourcekitd::KeyNameKind("key.namekind");
147147
UIdent sourcekitd::KeyLocalizationKey("key.localization_key");
148+
UIdent sourcekitd::KeyIsZeroArgSelector("key.is_zero_arg_selector");
148149

149150
UIdent sourcekitd::KeySwiftVersion("key.swift_version");
150151

@@ -247,6 +248,7 @@ static UIdent *OrderedKeys[] = {
247248
&KeySelectorPieces,
248249
&KeyNameKind,
249250
&KeyLocalizationKey,
251+
&KeyIsZeroArgSelector,
250252

251253
&KeySwiftVersion,
252254
};

0 commit comments

Comments
 (0)