mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Some macro-generated declarations are not being printed in the Obj-C/C++ generated header. Members introduced by attached `member` macros on a type appear to be fine, but those introduced by a attached `peer` or freestanding `declaration` macros don't show up. This change updates the header writer to call `getAllMembers` throughout instead of `getMembers`, which makes sure that everything gets collected. Likewise, we update the top-level logic from `getTopLevelDecls` to `getTopLevelDeclsWithAuxiliaryDecls` to pick up freestanding decls introduced at file scope. Fixes https://github.com/swiftlang/swift/issues/68170.
65 lines
2.5 KiB
Swift
65 lines
2.5 KiB
Swift
// REQUIRES: swift_swift_parser, objc_interop
|
|
|
|
// RUN: %empty-directory(%t)
|
|
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/objc_cxx_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
|
// RUN: %target-build-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -o %t/main -module-name MacroUser -swift-version 5
|
|
// RUN: %target-codesign %t/main
|
|
|
|
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk) -typecheck -swift-version 5 -parse-as-library -enable-objc-interop -emit-objc-header-path %t/MacroUser.h -load-plugin-library %t/%target-library-name(MacroDefinition) %s -module-name MacroUser
|
|
// RUN: %FileCheck --check-prefix CHECK %s < %t/MacroUser.h
|
|
|
|
@attached(member, names: prefixed(member_))
|
|
public macro ObjCMemberFunc() = #externalMacro(module: "MacroDefinition", type: "ObjCMemberFuncMacro")
|
|
|
|
@attached(peer, names: prefixed(peer_))
|
|
public macro ObjCPeerFunc() = #externalMacro(module: "MacroDefinition", type: "ObjCPeerFuncMacro")
|
|
|
|
@freestanding(declaration, names: named(member_freestanding))
|
|
public macro ObjCFreestandingFunc() = #externalMacro(module: "MacroDefinition", type: "ObjCFreestandingFuncMacro")
|
|
|
|
@freestanding(declaration, names: named(MacroExpandedObjCClass))
|
|
public macro ObjCFreestandingClass() = #externalMacro(module: "MacroDefinition", type: "ObjCFreestandingClassMacro")
|
|
|
|
@attached(extension, conformances: MyObjCProtocol, names: named(objcRequirement))
|
|
public macro ObjCExtension() = #externalMacro(module: "MacroDefinition", type: "ObjCExtensionMacro")
|
|
|
|
@objc public protocol MyObjCProtocol {
|
|
func objcRequirement()
|
|
}
|
|
|
|
// ---
|
|
|
|
import Foundation
|
|
|
|
// CHECK: SWIFT_CLASS("_TtC9MacroUser1A")
|
|
// CHECK-NEXT: @interface A : NSObject
|
|
@ObjCMemberFunc
|
|
public class A: NSObject {
|
|
@ObjCPeerFunc
|
|
@objc public func a() {}
|
|
// CHECK-DAG: - (void)a;
|
|
// CHECK-DAG: - (void)member_A;
|
|
// CHECK-DAG: - (void)peer_a;
|
|
|
|
#ObjCFreestandingFunc
|
|
// CHECK-DAG: - (void)member_freestanding;
|
|
}
|
|
// CHECK-DAG: @end
|
|
|
|
|
|
// CHECK: SWIFT_CLASS("_TtC9MacroUser1B")
|
|
// CHECK-NEXT: @interface B : NSObject
|
|
|
|
// CHECK: @interface B (SWIFT_EXTENSION(MacroUser)) <MyObjCProtocol>
|
|
// CHECK-NEXT: - (void)objcRequirement;
|
|
// CHECK-NEXT: @end
|
|
@ObjCExtension
|
|
public class B: NSObject {}
|
|
|
|
|
|
// CHECK: SWIFT_CLASS("_TtC9MacroUser22MacroExpandedObjCClass")
|
|
// CHECK-NEXT: @interface MacroExpandedObjCClass : NSObject
|
|
// CHECK-DAG: - (void)member;
|
|
// CHECK-DAG: @end
|
|
#ObjCFreestandingClass
|