mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[sourcekitd] When searching for a clang decl, look at overrides
Allows us to do name-transation on an override of a clang decl. rdar://problem/32187817
This commit is contained in:
@@ -18,6 +18,12 @@ func foo2 (_ a : FooClassDerived) {
|
|||||||
_ = FooClassBase()
|
_ = FooClassBase()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MyDerived: FooClassDerived {
|
||||||
|
override func fooInstanceFunc0() {
|
||||||
|
self.fooInstanceFunc0()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// REQUIRES: objc_interop
|
// REQUIRES: objc_interop
|
||||||
// RUN: %sourcekitd-test -req=translate -objc-name FooClassDerived2 -pos=5:30 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
|
// RUN: %sourcekitd-test -req=translate -objc-name FooClassDerived2 -pos=5:30 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
|
||||||
// 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
|
// 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
|
||||||
@@ -45,6 +51,9 @@ func foo2 (_ a : FooClassDerived) {
|
|||||||
// 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
|
// 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
|
||||||
// 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
|
// 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
|
||||||
|
|
||||||
|
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc01 -pos=22:17 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK5 %s
|
||||||
|
// RUN: %sourcekitd-test -req=translate -objc-selector fooInstanceFunc01 -pos=23:10 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | %FileCheck -check-prefix=CHECK5 %s
|
||||||
|
|
||||||
// CHECK1: FooClassDerived2
|
// CHECK1: FooClassDerived2
|
||||||
// CHECK-NONE: <empty name translation info>
|
// CHECK-NONE: <empty name translation info>
|
||||||
// CHECK2: fooProperty2
|
// CHECK2: fooProperty2
|
||||||
|
|||||||
@@ -990,23 +990,29 @@ static bool passNameInfoForDecl(const ValueDecl *VD, NameTranslatingInfo &Info,
|
|||||||
ClangImporter *Importer = static_cast<ClangImporter *>(VD->getDeclContext()->
|
ClangImporter *Importer = static_cast<ClangImporter *>(VD->getDeclContext()->
|
||||||
getASTContext().getClangModuleLoader());
|
getASTContext().getClangModuleLoader());
|
||||||
|
|
||||||
if (auto *Named = dyn_cast_or_null<clang::NamedDecl>(VD->getClangDecl())) {
|
const clang::NamedDecl *Named = nullptr;
|
||||||
auto ObjCName = getClangDeclarationName(Named, Info);
|
auto *BaseDecl = VD;
|
||||||
if (!ObjCName)
|
while (!Named && BaseDecl) {
|
||||||
return true;
|
Named = dyn_cast_or_null<clang::NamedDecl>(BaseDecl->getClangDecl());
|
||||||
|
BaseDecl = BaseDecl->getOverriddenDecl();
|
||||||
DeclName Name = Importer->importName(Named, ObjCName);
|
|
||||||
NameTranslatingInfo Result;
|
|
||||||
Result.NameKind = SwiftLangSupport::getUIDForNameKind(NameKind::Swift);
|
|
||||||
Result.BaseName = Name.getBaseName().str();
|
|
||||||
std::transform(Name.getArgumentNames().begin(),
|
|
||||||
Name.getArgumentNames().end(),
|
|
||||||
std::back_inserter(Result.ArgNames),
|
|
||||||
[](Identifier Id) { return Id.str(); });
|
|
||||||
Receiver(Result);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
if (!Named)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
auto ObjCName = getClangDeclarationName(Named, Info);
|
||||||
|
if (!ObjCName)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
DeclName Name = Importer->importName(Named, ObjCName);
|
||||||
|
NameTranslatingInfo Result;
|
||||||
|
Result.NameKind = SwiftLangSupport::getUIDForNameKind(NameKind::Swift);
|
||||||
|
Result.BaseName = Name.getBaseName().str();
|
||||||
|
std::transform(Name.getArgumentNames().begin(),
|
||||||
|
Name.getArgumentNames().end(),
|
||||||
|
std::back_inserter(Result.ArgNames),
|
||||||
|
[](Identifier Id) { return Id.str(); });
|
||||||
|
Receiver(Result);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user