Skip to content

Commit e44bcca

Browse files
authored
Merge pull request #9014 from benlangmuir/nt-missing-name-piece
2 parents 7163a40 + 7e5dd1f commit e44bcca

File tree

5 files changed

+90
-35
lines changed

5 files changed

+90
-35
lines changed

test/SourceKit/NameTranslation/basic.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ func foo2 (_ a : FooClassDerived) {
3232
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21:withBB: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK8 %s
3333
// RUN: %sourcekitd-test -req=translate -objc-name fooProperty11 -pos=16:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK9 %s
3434
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21:withBB:withC: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
35-
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK-NONE %s
35+
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKFEWER1 %s
36+
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21:: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKMISSING1 %s
37+
// RUN: %sourcekitd-test -req=translate -objc-selector :withBB: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKMISSING2 %s
38+
// RUN: %sourcekitd-test -req=translate -objc-selector :: -pos=15:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECKMISSING3 %s
3639

3740
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc21: -pos=17:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK10 %s
3841
// RUN: %sourcekitd-test -req=translate -objc-selector initWithfloat2: -pos=17:13 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK12 %s
@@ -57,3 +60,8 @@ func foo2 (_ a : FooClassDerived) {
5760
// CHECK12: init(float2:)
5861
// CHECK13: init(_:)
5962
// CHECK14: init
63+
64+
// CHECKFEWER1: fooInstanceFunc21(_:withB:)
65+
// CHECKMISSING1: fooInstanceFunc21(_:withB:)
66+
// CHECKMISSING2: fooInstanceFunc2(_:withBB:)
67+
// CHECKMISSING3: fooInstanceFunc2(_:withB:)

test/SourceKit/NameTranslation/swiftnames.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class C2 {}
5353

5454
// REQUIRES: objc_interop
5555
// 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
56+
// 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
57+
// 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
58+
// 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
5659
// RUN: %sourcekitd-test -req=translate -swift-name "foo(a1:b1:c1:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK2 %s
5760
// RUN: %sourcekitd-test -req=translate -swift-name "foo(_:b1:c1:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK3 %s
5861
// RUN: %sourcekitd-test -req=translate -swift-name "foo1(_:_:c2:)" -pos=11:11 %s -- -F %S/Inputs/mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK4 %s
@@ -92,3 +95,7 @@ class C2 {}
9295
// CHECK14: CustomErrorA2
9396
// CHECK15: C2ObjC
9497
// CHECK16: bar:other:
98+
99+
// CHECKFEWER1: barWithX:y:c:
100+
// CHECKMISSING1: barWithA:b:c:
101+
// CHECKMISSING2: fooWithX:y:z:

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,9 @@ static bool passCursorInfoForDecl(const ValueDecl *VD,
881881
}
882882

883883
static clang::DeclarationName
884-
getClangDeclarationName(clang::ASTContext &Ctx, NameTranslatingInfo &Info) {
884+
getClangDeclarationName(const clang::NamedDecl *ND, NameTranslatingInfo &Info) {
885+
auto &Ctx = ND->getASTContext();
886+
auto OrigName = ND->getDeclName();
885887
assert(SwiftLangSupport::getNameKindForUID(Info.NameKind) == NameKind::ObjC);
886888
if (Info.BaseName.empty() == Info.ArgNames.empty()) {
887889
// cannot have both.
@@ -890,27 +892,61 @@ getClangDeclarationName(clang::ASTContext &Ctx, NameTranslatingInfo &Info) {
890892
if (!Info.BaseName.empty()) {
891893
return clang::DeclarationName(&Ctx.Idents.get(Info.BaseName));
892894
} else {
895+
StringRef last = Info.ArgNames.back();
896+
897+
switch (OrigName.getNameKind()) {
898+
case clang::DeclarationName::ObjCZeroArgSelector:
899+
if (last.endswith(":"))
900+
return clang::DeclarationName();
901+
break;
902+
case clang::DeclarationName::ObjCOneArgSelector:
903+
case clang::DeclarationName::ObjCMultiArgSelector:
904+
if (!last.empty() && !last.endswith(":"))
905+
return clang::DeclarationName();
906+
break;
907+
default:
908+
return clang::DeclarationName();
909+
}
910+
911+
auto OrigSel = OrigName.getObjCSelector();
912+
unsigned NumPieces = OrigSel.isUnarySelector() ? 1 : OrigSel.getNumArgs();
913+
if (Info.ArgNames.size() > NumPieces)
914+
return clang::DeclarationName();
915+
893916
ArrayRef<StringRef> Args = llvm::makeArrayRef(Info.ArgNames);
894917
std::vector<clang::IdentifierInfo *> Pieces;
895-
std::transform(Args.begin(), Args.end(), std::back_inserter(Pieces),
896-
[&](StringRef T) { return &Ctx.Idents.get(T.endswith(":") ?
897-
T.drop_back() : T); });
898-
return clang::DeclarationName(Ctx.Selectors.getSelector(
899-
/*Calculate Args*/std::accumulate(Args.begin(), Args.end(), (unsigned)0,
900-
[](unsigned I, StringRef T) { return I + (T.endswith(":") ? 1 : 0); }),
901-
Pieces.data()));
918+
for (unsigned i = 0; i < NumPieces; ++i) {
919+
if (i >= Info.ArgNames.size() || Info.ArgNames[i].empty()) {
920+
Pieces.push_back(OrigSel.getIdentifierInfoForSlot(i));
921+
} else {
922+
StringRef T = Args[i];
923+
Pieces.push_back(&Ctx.Idents.get(T.endswith(":") ? T.drop_back() : T));
924+
}
925+
}
926+
return clang::DeclarationName(
927+
Ctx.Selectors.getSelector(OrigSel.getNumArgs(), Pieces.data()));
902928
}
903929
}
904930

905-
static DeclName
906-
getSwiftDeclName(ASTContext &Ctx, NameTranslatingInfo &Info) {
931+
static DeclName getSwiftDeclName(const ValueDecl *VD,
932+
NameTranslatingInfo &Info) {
933+
auto &Ctx = VD->getDeclContext()->getASTContext();
907934
assert(SwiftLangSupport::getNameKindForUID(Info.NameKind) == NameKind::Swift);
908-
std::vector<Identifier> Args;
909-
std::transform(Info.ArgNames.begin(), Info.ArgNames.end(),
910-
std::back_inserter(Args),
911-
[&](StringRef T) { return Ctx.getIdentifier(T); });
912-
return DeclName(Ctx, Ctx.getIdentifier(Info.BaseName),
913-
llvm::makeArrayRef(Args));
935+
DeclName OrigName = VD->getFullName();
936+
Identifier BaseName = Info.BaseName.empty()
937+
? OrigName.getBaseName()
938+
: Ctx.getIdentifier(Info.BaseName);
939+
auto OrigArgs = OrigName.getArgumentNames();
940+
SmallVector<Identifier, 8> Args(OrigArgs.begin(), OrigArgs.end());
941+
if (Info.ArgNames.size() > OrigArgs.size())
942+
return DeclName();
943+
for (unsigned i = 0; i < OrigArgs.size(); ++i) {
944+
if (i < Info.ArgNames.size() && !Info.ArgNames[i].empty()) {
945+
StringRef Arg = Info.ArgNames[i];
946+
Args[i] = Ctx.getIdentifier(Arg == "_" ? StringRef() : Arg);
947+
}
948+
}
949+
return DeclName(Ctx, BaseName, llvm::makeArrayRef(Args));
914950
}
915951

916952
/// Returns true for failure to resolve.
@@ -919,9 +955,11 @@ static bool passNameInfoForDecl(const ValueDecl *VD, NameTranslatingInfo &Info,
919955
switch (SwiftLangSupport::getNameKindForUID(Info.NameKind)) {
920956
case NameKind::Swift: {
921957
NameTranslatingInfo Result;
922-
auto &Ctx = VD->getDeclContext()->getASTContext();
923-
auto ResultPair = swift::objc_translation::getObjCNameForSwiftDecl(VD,
924-
getSwiftDeclName(Ctx, Info));
958+
auto DeclName = getSwiftDeclName(VD, Info);
959+
if (!DeclName)
960+
return true;
961+
auto ResultPair =
962+
swift::objc_translation::getObjCNameForSwiftDecl(VD, DeclName);
925963
Identifier Name = ResultPair.first;
926964
if (!Name.empty()) {
927965
Result.NameKind = SwiftLangSupport::getUIDForNameKind(NameKind::ObjC);
@@ -952,8 +990,11 @@ static bool passNameInfoForDecl(const ValueDecl *VD, NameTranslatingInfo &Info,
952990
getASTContext().getClangModuleLoader());
953991

954992
if (auto *Named = dyn_cast_or_null<clang::NamedDecl>(VD->getClangDecl())) {
955-
DeclName Name = Importer->importName(Named,
956-
getClangDeclarationName(Named->getASTContext(), Info));
993+
auto ObjCName = getClangDeclarationName(Named, Info);
994+
if (!ObjCName)
995+
return true;
996+
997+
DeclName Name = Importer->importName(Named, ObjCName);
957998
NameTranslatingInfo Result;
958999
Result.NameKind = SwiftLangSupport::getUIDForNameKind(NameKind::Swift);
9591000
Result.BaseName = Name.getBaseName().str();

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
592592
sourcekitd_request_dictionary_set_uid(Req, KeyRequest, RequestNameTranslation);
593593
sourcekitd_request_dictionary_set_int64(Req, KeyOffset, ByteOffset);
594594
StringRef BaseName;
595-
llvm::SmallVector<StringRef, 4> ArgPices;
595+
llvm::SmallVector<StringRef, 4> ArgPieces;
596596
sourcekitd_uid_t ArgName;
597597
if (!Opts.SwiftName.empty()) {
598598
sourcekitd_request_dictionary_set_uid(Req, KeyNameKind, KindNameSwift);
@@ -609,13 +609,13 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
609609
return 1;
610610
}
611611
StringRef AllArgs = Text.substr(ArgStart + 1, ArgEnd - ArgStart - 1);
612-
AllArgs.split(ArgPices, ':');
612+
AllArgs.split(ArgPieces, ':');
613613
if (!Args.empty()) {
614-
if (!ArgPices.back().empty()) {
614+
if (!ArgPieces.back().empty()) {
615615
llvm::errs() << "Swift name is malformed.\n";
616616
return 1;
617617
}
618-
ArgPices.pop_back();
618+
ArgPieces.pop_back();
619619
}
620620
}
621621
} else if (!Opts.ObjCName.empty()) {
@@ -625,11 +625,13 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
625625
} else if (!Opts.ObjCSelector.empty()) {
626626
sourcekitd_request_dictionary_set_uid(Req, KeyNameKind, KindNameObjc);
627627
StringRef Name(Opts.ObjCSelector);
628-
Name.split(ArgPices, ':', -1, /*keep empty*/false);
628+
Name.split(ArgPieces, ':');
629+
if (ArgPieces.back().empty())
630+
ArgPieces.pop_back();
629631
ArgName = KeySelectorPieces;
630-
std::transform(ArgPices.begin(), ArgPices.end(), ArgPices.begin(),
632+
std::transform(ArgPieces.begin(), ArgPieces.end(), ArgPieces.begin(),
631633
[Name] (StringRef T) {
632-
if (T.data() + T.size() < Name.data() + Name.size() &&
634+
if (!T.empty() && T.data() + T.size() < Name.data() + Name.size() &&
633635
*(T.data() + T.size()) == ':') {
634636
// Include the colon belonging to the piece.
635637
return StringRef(T.data(), T.size() + 1);
@@ -644,9 +646,9 @@ static int handleTestInvocation(ArrayRef<const char *> Args,
644646
std::string S = BaseName;
645647
sourcekitd_request_dictionary_set_string(Req, KeyBaseName, S.c_str());
646648
}
647-
if (!ArgPices.empty()) {
649+
if (!ArgPieces.empty()) {
648650
sourcekitd_object_t Arr = sourcekitd_request_array_create(nullptr, 0);
649-
for (StringRef A: ArgPices) {
651+
for (StringRef A : ArgPieces) {
650652
std::string S = A;
651653
sourcekitd_request_array_set_string(Arr, SOURCEKITD_ARRAY_APPEND,
652654
S.c_str());

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -818,10 +818,7 @@ handleSemanticRequest(RequestDict Req,
818818
}
819819
std::transform(ArgParts.begin(), ArgParts.end(),
820820
std::back_inserter(Input.ArgNames),
821-
[](const char *C) {
822-
StringRef Original(C);
823-
return Original == "_" ? StringRef() : Original;
824-
});
821+
[](const char *C) { return StringRef(C); });
825822
std::transform(Selectors.begin(), Selectors.end(),
826823
std::back_inserter(Input.ArgNames),
827824
[](const char *C) { return StringRef(C); });

0 commit comments

Comments
 (0)