Skip to content

Commit 61fc635

Browse files
authored
Merge pull request #85486 from egorzhdan/egorzhdan/wrap-in-objc
[cxx-interop] Wrap methods that take Obj-C params in `#if defined(__OBJC__)`
2 parents cb66f4f + 50035f4 commit 61fc635

File tree

5 files changed

+55
-4
lines changed

5 files changed

+55
-4
lines changed

lib/AST/SwiftNameTranslation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ bool swift::cxx_translation::isObjCxxOnly(const ValueDecl *VD) {
266266

267267
bool swift::cxx_translation::isObjCxxOnly(const clang::Decl *D,
268268
const ASTContext &ctx) {
269+
// Check if this is decl can only be referred to from Objective-C.
270+
if (isa<clang::ObjCInterfaceDecl>(D))
271+
return true;
272+
269273
// By default, we import all modules in Obj-C++ mode, so there is no robust
270274
// way to tell if something is coming from an Obj-C module. Use the
271275
// requirements and the language options to check if we should actually
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module ObjCTypes {
2+
header "objc-types.h"
3+
export *
4+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@interface ObjCKlass
2+
-(ObjCKlass * _Nonnull) init;
3+
@end

test/Interop/ObjCToSwiftToObjCxx/bridge-objc-types-back-to-objcxx.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,19 @@ public class KVOCookieMonster {
105105
// CHECK-NEXT: SWIFT_EXTERN id <ObjCProtocol> _Nullable $s9UseObjCTy03retB17CProtocolNullableSo0bE0_pSgyF(void) SWIFT_NOEXCEPT SWIFT_CALL; // retObjCProtocolNullable()
106106
// CHECK-NEXT: #endif
107107
// CHECK: ObjCKlass *_Nonnull $s9UseObjCTy03retB5ClassSo0B6CKlassCyF(void) SWIFT_NOEXCEPT SWIFT_CALL;
108+
// CHECK-NEXT: #endif // defined(__OBJC__)
109+
// CHECK-NEXT: #if defined(__OBJC__)
108110
// CHECK-NEXT: ObjCKlass *_Nullable $s9UseObjCTy03retB13ClassNullableSo0B6CKlassCSgyF(void) SWIFT_NOEXCEPT SWIFT_CALL;
111+
// CHECK-NEXT: #endif // defined(__OBJC__)
112+
// CHECK-NEXT: #if defined(__OBJC__)
109113
// CHECK-NEXT: void $s9UseObjCTy04takeB6CClassyySo0B6CKlassCF(ObjCKlass *_Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL;
114+
// CHECK-NEXT: #endif // defined(__OBJC__)
115+
// CHECK-NEXT: #if defined(__OBJC__)
110116
// CHECK-NEXT: void $s9UseObjCTy04takeB11CClassInoutyySo0B6CKlassCzF(ObjCKlass *_Nonnull __strong * _Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL;
117+
// CHECK-NEXT: #endif // defined(__OBJC__)
118+
// CHECK-NEXT: #if defined(__OBJC__)
111119
// CHECK-NEXT: void $s9UseObjCTy04takeB14CClassNullableyySo0B6CKlassCSgF(ObjCKlass *_Nullable x) SWIFT_NOEXCEPT SWIFT_CALL;
120+
// CHECK-NEXT: #endif // defined(__OBJC__)
112121
// CHECK-NEXT: #if defined(__OBJC__)
113122
// CHECK-NEXT: SWIFT_EXTERN void $s9UseObjCTy04takeB9CProtocolyySo0bE0_pF(id <ObjCProtocol> _Nonnull x) SWIFT_NOEXCEPT SWIFT_CALL; // takeObjCProtocol(_:)
114123
// CHECK-NEXT: #endif
@@ -124,17 +133,16 @@ public class KVOCookieMonster {
124133
// CHECK-NEXT: }
125134
// CHECK-NEXT: };
126135

127-
// CHECK: #if defined(__OBJC__)
128-
// CHECK-NEXT: SWIFT_INLINE_THUNK id <ObjCProtocol> _Nonnull retObjCProtocol() noexcept SWIFT_SYMBOL("s:9UseObjCTy03retB9CProtocolSo0bE0_pyF") SWIFT_WARN_UNUSED_RESULT {
136+
// CHECK: SWIFT_INLINE_THUNK id <ObjCProtocol> _Nonnull retObjCProtocol() noexcept SWIFT_SYMBOL("s:9UseObjCTy03retB9CProtocolSo0bE0_pyF") SWIFT_WARN_UNUSED_RESULT {
129137
// CHECK-NEXT: return (__bridge_transfer id <ObjCProtocol>)(__bridge void *)UseObjCTy::_impl::$s9UseObjCTy03retB9CProtocolSo0bE0_pyF();
130138
// CHECK-NEXT: }
131-
// CHECK-NEXT: #endif
139+
// CHECK-NEXT: #endif // defined(__OBJC__)
132140

133141
// CHECK: #if defined(__OBJC__)
134142
// CHECK-NEXT: SWIFT_INLINE_THUNK id <ObjCProtocol> _Nullable retObjCProtocolNullable() noexcept SWIFT_SYMBOL("s:9UseObjCTy03retB17CProtocolNullableSo0bE0_pSgyF") SWIFT_WARN_UNUSED_RESULT {
135143
// CHECK-NEXT: return (__bridge_transfer id <ObjCProtocol>)(__bridge void *)UseObjCTy::_impl::$s9UseObjCTy03retB17CProtocolNullableSo0bE0_pSgyF();
136144
// CHECK-NEXT: }
137-
// CHECK-NEXT: #endif
145+
// CHECK-NEXT: #endif // defined(__OBJC__)
138146

139147
// CHECK: SWIFT_INLINE_THUNK ObjCKlass *_Nonnull retObjClass() noexcept SWIFT_SYMBOL({{.*}}) SWIFT_WARN_UNUSED_RESULT {
140148
// CHECK-NEXT: return (__bridge_transfer ObjCKlass *)(__bridge void *)UseObjCTy::_impl::$s9UseObjCTy03retB5ClassSo0B6CKlassCyF();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// RUN: %target-swift-frontend %s -module-name ObjCInCXX -typecheck -verify -I %S/Inputs -emit-clang-header-path %t/ObjCInCXX.h -I %t -cxx-interoperability-mode=default
2+
// RUN: %FileCheck %s < %t/ObjCInCXX.h
3+
4+
// Make sure the header is valid when parsed in C++ language mode, without Obj-C.
5+
// RUN: %target-interop-build-clang -fobjc-arc -c -x c++-header %t/ObjCInCXX.h -o %t/o.o
6+
7+
// REQUIRES: objc_interop
8+
9+
import ObjCTypes
10+
11+
public struct HasObjCInit {
12+
private let privateField: Int = 0
13+
14+
public init(_ o: ObjCKlass) {}
15+
}
16+
17+
public struct HasObjCMethod {
18+
private let privateField: Int = 0
19+
20+
public func takesObjCKlass(_ o: ObjCKlass) {}
21+
}
22+
23+
// CHECK: SWIFT_INLINE_THUNK HasObjCInit HasObjCInit::init(ObjCKlass *_Nonnull o) {
24+
// CHECK: return {{.*}} {
25+
// CHECK: }
26+
// CHECK-NEXT: }
27+
// CHECK-NEXT: #endif // defined(__OBJC__)
28+
29+
// CHECK: SWIFT_INLINE_THUNK void HasObjCMethod::takesObjCKlass(ObjCKlass *_Nonnull o) const {
30+
// CHECK-NEXT: ObjCInCXX::{{.*}}
31+
// CHECK-NEXT: }
32+
// CHECK-NEXT: #endif // defined(__OBJC__)

0 commit comments

Comments
 (0)