Skip to content

Commit 42cbacf

Browse files
authored
Merge pull request #67653 from apple/egorzhdan/stream-delegate
[cxx-interop] Import `NSStreamDelegate.stream` correctly
2 parents 713a0a0 + 6edde29 commit 42cbacf

File tree

6 files changed

+50
-6
lines changed

6 files changed

+50
-6
lines changed

lib/ClangImporter/ImportType.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -2609,6 +2609,9 @@ ArgumentAttrs ClangImporter::Implementation::inferDefaultArgument(
26092609
if (isFirstParameter && camel_case::getFirstWord(baseNameStr) == "set")
26102610
return DefaultArgumentKind::None;
26112611

2612+
if (auto elaboratedTy = type->getAs<clang::ElaboratedType>())
2613+
type = elaboratedTy->desugar();
2614+
26122615
// Some nullable parameters default to 'nil'.
26132616
if (clangOptionality == OTK_Optional) {
26142617
// Nullable trailing closure parameters default to 'nil'.
@@ -2661,6 +2664,8 @@ ArgumentAttrs ClangImporter::Implementation::inferDefaultArgument(
26612664
return argumentAttrs;
26622665
if (camel_case::sameWordIgnoreFirstCase(word, "action"))
26632666
return argumentAttrs;
2667+
if (camel_case::sameWordIgnoreFirstCase(word, "event"))
2668+
return argumentAttrs;
26642669
if (camel_case::sameWordIgnoreFirstCase(word, "events") &&
26652670
next != camelCaseWords.rend() &&
26662671
camel_case::sameWordIgnoreFirstCase(*next, "control"))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#define __CF_OPTIONS_ATTRIBUTES __attribute__((flag_enum,enum_extensibility(open)))
2+
#if (__cplusplus)
3+
#define CF_OPTIONS(_type, _name) __attribute__((availability(swift,unavailable))) _type _name; enum __CF_OPTIONS_ATTRIBUTES : _name
4+
#else
5+
#define CF_OPTIONS(_type, _name) enum __CF_OPTIONS_ATTRIBUTES _name : _type _name; enum _name : _type
6+
#endif

test/Interop/Cxx/objc-correctness/Inputs/NSOptionsMangling.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
#define __CF_OPTIONS_ATTRIBUTES __attribute__((flag_enum,enum_extensibility(open)))
2-
#if (__cplusplus)
3-
#define CF_OPTIONS(_type, _name) __attribute__((availability(swift,unavailable))) _type _name; enum __CF_OPTIONS_ATTRIBUTES : _name
4-
#else
5-
#define CF_OPTIONS(_type, _name) enum __CF_OPTIONS_ATTRIBUTES _name : _type _name; enum _name : _type
6-
#endif
1+
#include "CFOptions.h"
72

83
typedef CF_OPTIONS(unsigned, UIControlState) { UIControlStateNormal = 0 };
94

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "CFOptions.h"
2+
3+
typedef CF_OPTIONS(int, NSStreamEvent) {
4+
NSStreamEventNone = 0,
5+
NSStreamEventOpenCompleted = 1UL << 0,
6+
NSStreamEventHasBytesAvailable = 1UL << 1,
7+
NSStreamEventHasSpaceAvailable = 1UL << 2,
8+
NSStreamEventErrorOccurred = 1UL << 3,
9+
NSStreamEventEndEncountered = 1UL << 4
10+
};
11+
12+
@protocol NSObject
13+
@end
14+
15+
__attribute__((objc_root_class))
16+
@interface NSObject <NSObject>
17+
@end
18+
19+
@interface NSStream : NSObject
20+
@end
21+
22+
@protocol NSStreamDelegate <NSObject>
23+
@optional
24+
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;
25+
@end

test/Interop/Cxx/objc-correctness/Inputs/module.modulemap

+5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ module NSNofiticationBridging {
1919
requires cplusplus
2020
}
2121

22+
module NSStreamDelegate {
23+
header "NSStreamDelegate.h"
24+
requires objc
25+
}
26+
2227
module OSObject {
2328
header "os-object.h"
2429
requires objc
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %target-typecheck-verify-swift -verify-ignore-unknown -I %S/Inputs -enable-objc-interop -enable-experimental-cxx-interop
2+
// REQUIRES: objc_interop
3+
4+
import NSStreamDelegate
5+
6+
func foo<T: NSStreamDelegate>(_ delegate: T, stream: NSStream) {
7+
delegate.stream!(stream, handle: NSStreamEvent.openCompleted)
8+
}

0 commit comments

Comments
 (0)