[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:
Ben Langmuir
2017-05-14 14:40:42 -07:00
parent fb5734c24f
commit c89d024cd2
2 changed files with 31 additions and 16 deletions

View File

@@ -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

View File

@@ -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;
} }
} }
} }