mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
153 lines
6.4 KiB
Swift
153 lines
6.4 KiB
Swift
// RUN: %empty-directory(%t)
|
|
|
|
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-source-import -emit-module -emit-module-doc -o %t %s -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
|
|
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -parse-as-library %t/enums.swiftmodule -typecheck -verify -emit-objc-header-path %t/enums.h -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
|
|
// RUN: %FileCheck %s -input-file %t/enums.h
|
|
// RUN: %FileCheck -check-prefix=NEGATIVE %s < %t/enums.h
|
|
// RUN: %check-in-clang %t/enums.h
|
|
// RUN: %check-in-clang -fno-modules -Qunused-arguments %t/enums.h -include ctypes.h -include CoreFoundation.h
|
|
|
|
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-source-import -emit-module -o /dev/null -emit-module-doc-path /dev/null -module-name enums %s -emit-objc-header-path %t/enums.WMO.h -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
|
|
// RUN: %FileCheck %s -input-file %t/enums.WMO.h
|
|
// RUN: %FileCheck -check-prefix=NEGATIVE %s -input-file %t/enums.WMO.h
|
|
// RUN: %check-in-clang %t/enums.WMO.h
|
|
// RUN: %check-in-clang -fno-modules -Qunused-arguments %t/enums.WMO.h -include ctypes.h -include CoreFoundation.h
|
|
|
|
// Ensure that providing the output header path via the supplementary output
|
|
// file map also works.
|
|
|
|
// RUN: echo "{\"%s\": {\"objc-header\": \"%t/enums-supplemental.h\"}}" > %t-output-file-map.json
|
|
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -parse-as-library %s -enable-source-import -typecheck -verify -supplementary-output-file-map %t-output-file-map.json -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
|
|
// RUN: %FileCheck -check-prefix CHECK-SUPPLEMENTAL %s -input-file %t/enums-supplemental.h
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
|
|
// NEGATIVE-NOT: NSMalformedEnumMissingTypedef :
|
|
// NEGATIVE-NOT: enum EnumNamed
|
|
// CHECK-LABEL: typedef SWIFT_ENUM_FWD_DECL(NSInteger, FooComments)
|
|
// CHECK-LABEL: typedef SWIFT_ENUM_FWD_DECL(int16_t, NegativeValues)
|
|
// CHECK-LABEL: typedef SWIFT_ENUM_FWD_DECL(NSInteger, ObjcEnumNamed)
|
|
|
|
// CHECK-SUPPLEMENTAL: typedef SWIFT_ENUM_FWD_DECL(int16_t, NegativeValues)
|
|
// CHECK-SUPPLEMENTAL: typedef SWIFT_ENUM_FWD_DECL(NSInteger, ObjcEnumNamed)
|
|
|
|
// CHECK-LABEL: @interface AnEnumMethod
|
|
// CHECK-NEXT: - (enum NegativeValues)takeAndReturnEnum:(enum FooComments)foo SWIFT_WARN_UNUSED_RESULT;
|
|
// CHECK-NEXT: - (void)acceptPlainEnum:(enum NSMalformedEnumMissingTypedef)_;
|
|
// CHECK-NEXT: - (enum ObjcEnumNamed)takeAndReturnRenamedEnum:(enum ObjcEnumNamed)foo SWIFT_WARN_UNUSED_RESULT;
|
|
// CHECK-NEXT: - (void)acceptTopLevelImportedWithA:(enum TopLevelRaw)a b:(TopLevelEnum)b c:(TopLevelOptions)c d:(TopLevelTypedef)d e:(TopLevelAnon)e;
|
|
// CHECK-NEXT: - (void)acceptMemberImportedWithA:(enum MemberRaw)a b:(enum MemberEnum)b c:(MemberOptions)c d:(enum MemberTypedef)d e:(MemberAnon)e ee:(MemberAnon2)ee;
|
|
// CHECK: @end
|
|
@objc class AnEnumMethod {
|
|
@objc func takeAndReturnEnum(_ foo: FooComments) -> NegativeValues {
|
|
return .Zung
|
|
}
|
|
@objc func acceptPlainEnum(_: NSMalformedEnumMissingTypedef) {}
|
|
@objc func takeAndReturnRenamedEnum(_ foo: EnumNamed) -> EnumNamed {
|
|
return .A
|
|
}
|
|
|
|
@objc func acceptTopLevelImported(a: TopLevelRaw, b: TopLevelEnum, c: TopLevelOptions, d: TopLevelTypedef, e: TopLevelAnon) {}
|
|
@objc func acceptMemberImported(a: Wrapper.Raw, b: Wrapper.Enum, c: Wrapper.Options, d: Wrapper.Typedef, e: Wrapper.Anon, ee: Wrapper.Anon2) {}
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM_NAMED(NSInteger, ObjcEnumNamed, "EnumNamed", closed) {
|
|
// CHECK-NEXT: ObjcEnumNamedA = 0,
|
|
// CHECK-NEXT: ObjcEnumNamedB = 1,
|
|
// CHECK-NEXT: ObjcEnumNamedC = 2,
|
|
// CHECK-NEXT: ObjcEnumNamedD = 3,
|
|
// CHECK-NEXT: ObjcEnumNamedHelloDolly = 4,
|
|
// CHECK-NEXT: };
|
|
|
|
@objc(ObjcEnumNamed) enum EnumNamed: Int {
|
|
case A, B, C, d, helloDolly
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM(NSInteger, EnumWithNamedConstants, closed) {
|
|
// CHECK-NEXT: kEnumA SWIFT_COMPILE_NAME("A") = 0,
|
|
// CHECK-NEXT: kEnumB SWIFT_COMPILE_NAME("B") = 1,
|
|
// CHECK-NEXT: kEnumC SWIFT_COMPILE_NAME("C") = 2,
|
|
// CHECK-NEXT: };
|
|
|
|
@objc enum EnumWithNamedConstants: Int {
|
|
@objc(kEnumA) case A
|
|
@objc(kEnumB) case B
|
|
@objc(kEnumC) case C
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM(unsigned int, ExplicitValues, closed) {
|
|
// CHECK-NEXT: ExplicitValuesZim = 0,
|
|
// CHECK-NEXT: ExplicitValuesZang = 219,
|
|
// CHECK-NEXT: ExplicitValuesZung = 220,
|
|
// CHECK-NEXT: };
|
|
// NEGATIVE-NOT: ExplicitValuesDomain
|
|
|
|
@objc enum ExplicitValues: CUnsignedInt {
|
|
case Zim, Zang = 219, Zung
|
|
|
|
func methodNotExportedToObjC() {}
|
|
}
|
|
|
|
// CHECK: /// Foo: A feer, a female feer.
|
|
// CHECK-NEXT: typedef SWIFT_ENUM(NSInteger, FooComments, closed) {
|
|
// CHECK: /// Zim: A zeer, a female zeer.
|
|
// CHECK-NEXT: FooCommentsZim = 0,
|
|
// CHECK-NEXT: FooCommentsZang = 1,
|
|
// CHECK-NEXT: FooCommentsZung = 2,
|
|
// CHECK-NEXT: };
|
|
|
|
/// Foo: A feer, a female feer.
|
|
@objc public enum FooComments: Int {
|
|
/// Zim: A zeer, a female zeer.
|
|
case Zim
|
|
case Zang, Zung
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM(int16_t, NegativeValues, closed) {
|
|
// CHECK-NEXT: Zang = -219,
|
|
// CHECK-NEXT: Zung = -218,
|
|
// CHECK-NEXT: };
|
|
@objc enum NegativeValues: Int16 {
|
|
case Zang = -219, Zung
|
|
|
|
func methodNotExportedToObjC() {}
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM(NSInteger, SomeError, closed) {
|
|
// CHECK-NEXT: SomeErrorBadness = 9001,
|
|
// CHECK-NEXT: SomeErrorWorseness = 9002,
|
|
// CHECK-NEXT: };
|
|
// CHECK-NEXT: static NSString * _Nonnull const SomeErrorDomain = @"enums.SomeError";
|
|
@objc enum SomeError: Int, Error {
|
|
case Badness = 9001
|
|
case Worseness
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM(NSInteger, SomeOtherError, closed) {
|
|
// CHECK-NEXT: SomeOtherErrorDomain = 0,
|
|
// CHECK-NEXT: };
|
|
// NEGATIVE-NOT: NSString * _Nonnull const SomeOtherErrorDomain
|
|
@objc enum SomeOtherError: Int, Error {
|
|
case Domain // collision!
|
|
}
|
|
|
|
// CHECK-LABEL: typedef SWIFT_ENUM_NAMED(NSInteger, ObjcErrorType, "SomeRenamedErrorType", closed) {
|
|
// CHECK-NEXT: ObjcErrorTypeBadStuff = 0,
|
|
// CHECK-NEXT: };
|
|
// CHECK-NEXT: static NSString * _Nonnull const ObjcErrorTypeDomain = @"enums.SomeRenamedErrorType";
|
|
@objc(ObjcErrorType) enum SomeRenamedErrorType: Int, Error {
|
|
case BadStuff
|
|
}
|
|
|
|
// CHECK-NOT: enum {{[A-Z]+}}
|
|
// CHECK-LABEL: @interface ZEnumMethod
|
|
// CHECK-NEXT: - (enum NegativeValues)takeAndReturnEnum:(enum FooComments)foo SWIFT_WARN_UNUSED_RESULT;
|
|
// CHECK: @end
|
|
@objc class ZEnumMethod {
|
|
@objc func takeAndReturnEnum(_ foo: FooComments) -> NegativeValues {
|
|
return .Zung
|
|
}
|
|
}
|