@@ -4537,7 +4537,8 @@ namespace {
45374537 bodyParams, resultTy,
45384538 async, throws, dc, decl);
45394539
4540- result->setAccess (getOverridableAccessLevel (dc));
4540+ result->setAccess (decl->isDirectMethod () ? AccessLevel::Public
4541+ : getOverridableAccessLevel (dc));
45414542
45424543 // Optional methods in protocols.
45434544 if (decl->getImplementationControl () == clang::ObjCMethodDecl::Optional &&
@@ -5289,8 +5290,9 @@ namespace {
52895290 }
52905291
52915292 auto type = importedType.getType ();
5292- auto result = Impl.createDeclWithClangNode <VarDecl>(decl,
5293- getOverridableAccessLevel (dc),
5293+ const auto access = decl->isDirectProperty () ? AccessLevel::Public
5294+ : getOverridableAccessLevel (dc);
5295+ auto result = Impl.createDeclWithClangNode <VarDecl>(decl, access,
52945296 /* IsStatic*/ decl->isClassProperty (), VarDecl::Introducer::Var,
52955297 Impl.importSourceLoc (decl->getLocation ()), name, dc);
52965298 result->setInterfaceType (type);
@@ -6981,7 +6983,13 @@ SwiftDeclConverter::importSubscript(Decl *decl,
69816983 bodyParams, decl->getLoc (),
69826984 elementTy, dc,
69836985 getter->getClangNode ());
6984- const auto access = getOverridableAccessLevel (dc);
6986+
6987+ bool IsObjCDirect = false ;
6988+ if (auto objCDecl = dyn_cast<clang::ObjCMethodDecl>(getter->getClangDecl ())) {
6989+ IsObjCDirect = objCDecl->isDirectMethod ();
6990+ }
6991+ const auto access = IsObjCDirect ? AccessLevel::Public
6992+ : getOverridableAccessLevel (dc);
69856993 subscript->setAccess (access);
69866994 subscript->setSetterAccess (access);
69876995
@@ -7835,10 +7843,13 @@ void ClangImporter::Implementation::importAttributes(
78357843
78367844 if (auto method = dyn_cast<clang::ObjCMethodDecl>(ClangDecl)) {
78377845 if (method->isDirectMethod () && !AnyUnavailable) {
7838- auto attr = AvailableAttr::createPlatformAgnostic (
7839- C, " " , " " , PlatformAgnosticAvailabilityKind::UnavailableInSwift);
7840- MappedDecl->getAttrs ().add (attr);
7841- AnyUnavailable = true ;
7846+ assert (isa<AbstractFunctionDecl>(MappedDecl) &&
7847+ " objc_direct declarations are expected to be an AbstractFunctionDecl" );
7848+ MappedDecl->getAttrs ().add (new (C) FinalAttr (/* IsImplicit=*/ true ));
7849+ if (auto accessorDecl = dyn_cast<AccessorDecl>(MappedDecl)) {
7850+ auto attr = new (C) FinalAttr (/* isImplicit=*/ true );
7851+ accessorDecl->getStorage ()->getAttrs ().add (attr);
7852+ }
78427853 }
78437854 }
78447855
0 commit comments