@@ -4579,7 +4579,8 @@ namespace {
45794579 /* genericParams=*/ nullptr , bodyParams,
45804580 resultTy, async, throws, dc, decl);
45814581
4582- result->setAccess (getOverridableAccessLevel (dc));
4582+ result->setAccess (decl->isDirectMethod () ? AccessLevel::Public
4583+ : getOverridableAccessLevel (dc));
45834584
45844585 // Optional methods in protocols.
45854586 if (decl->getImplementationControl () == clang::ObjCMethodDecl::Optional &&
@@ -5331,8 +5332,9 @@ namespace {
53315332 }
53325333
53335334 auto type = importedType.getType ();
5334- auto result = Impl.createDeclWithClangNode <VarDecl>(decl,
5335- getOverridableAccessLevel (dc),
5335+ const auto access = decl->isDirectProperty () ? AccessLevel::Public
5336+ : getOverridableAccessLevel (dc);
5337+ auto result = Impl.createDeclWithClangNode <VarDecl>(decl, access,
53365338 /* IsStatic*/ decl->isClassProperty (), VarDecl::Introducer::Var,
53375339 Impl.importSourceLoc (decl->getLocation ()), name, dc);
53385340 result->setInterfaceType (type);
@@ -7023,7 +7025,13 @@ SwiftDeclConverter::importSubscript(Decl *decl,
70237025 bodyParams, decl->getLoc (),
70247026 elementTy, dc,
70257027 getter->getClangNode ());
7026- const auto access = getOverridableAccessLevel (dc);
7028+
7029+ bool IsObjCDirect = false ;
7030+ if (auto objCDecl = dyn_cast<clang::ObjCMethodDecl>(getter->getClangDecl ())) {
7031+ IsObjCDirect = objCDecl->isDirectMethod ();
7032+ }
7033+ const auto access = IsObjCDirect ? AccessLevel::Public
7034+ : getOverridableAccessLevel (dc);
70277035 subscript->setAccess (access);
70287036 subscript->setSetterAccess (access);
70297037
@@ -7877,10 +7885,13 @@ void ClangImporter::Implementation::importAttributes(
78777885
78787886 if (auto method = dyn_cast<clang::ObjCMethodDecl>(ClangDecl)) {
78797887 if (method->isDirectMethod () && !AnyUnavailable) {
7880- auto attr = AvailableAttr::createPlatformAgnostic (
7881- C, " " , " " , PlatformAgnosticAvailabilityKind::UnavailableInSwift);
7882- MappedDecl->getAttrs ().add (attr);
7883- AnyUnavailable = true ;
7888+ assert (isa<AbstractFunctionDecl>(MappedDecl) &&
7889+ " objc_direct declarations are expected to be an AbstractFunctionDecl" );
7890+ MappedDecl->getAttrs ().add (new (C) FinalAttr (/* IsImplicit=*/ true ));
7891+ if (auto accessorDecl = dyn_cast<AccessorDecl>(MappedDecl)) {
7892+ auto attr = new (C) FinalAttr (/* isImplicit=*/ true );
7893+ accessorDecl->getStorage ()->getAttrs ().add (attr);
7894+ }
78847895 }
78857896 }
78867897
0 commit comments