Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/AST/ASTPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,13 @@ PrintOptions PrintOptions::printSwiftInterfaceFile(ModuleDecl *ModuleToPrint,
}
}

// Skip @c @implementation functions along with the attribute.
if (auto AFD = dyn_cast<AbstractFunctionDecl>(D)) {
if (options.excludeAttrKind(DeclAttrKind::ObjCImplementation) &&
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess DeclAttrKind::ObjCImplementation represents @implementation right? This code makes more sense when you realize that but it feels like ObjCImplementation and isObjCImplementation() should maybe be renamed now that they are not Obj-C specific. Is that planned?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that's the @implementation attribute. This wasn't exactly in the plans but I'll see what I can do along with this feature becoming official.

AFD->isObjCImplementation() && AFD->getCDeclKind())
return false;
}

// Skip extensions that extend things we wouldn't print.
if (auto *ED = dyn_cast<ExtensionDecl>(D)) {
if (!shouldPrint(ED->getExtendedNominal(), options))
Expand Down
57 changes: 57 additions & 0 deletions test/ModuleInterface/cdecl-swiftinterface.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// RUN: %empty-directory(%t)
// RUN: split-file %s %t --leading-lines

// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) \
// RUN: -emit-module %t/Lib.swift -o %t -I %t \
// RUN: -swift-version 6 -enable-library-evolution \
// RUN: -emit-module-interface-path %t/Lib.swiftinterface \
// RUN: -enable-experimental-feature CDecl \
// RUN: -enable-experimental-feature CImplementation

// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %t \
// RUN: -typecheck-module-from-interface %t/Lib.swiftinterface

// RUN: %FileCheck %s --input-file %t/Lib.swiftinterface

// REQUIRES: objc_interop
// REQUIRES: swift_feature_CDecl
// REQUIRES: swift_feature_CImplementation

//--- module.modulemap
module Lib {
header "Lib.h"
}

//--- Lib.h
extern void cImplFunc();
extern void objcImplFunc();

//--- Lib.swift
@_exported import Lib
import Foundation

/// Don't print the implementation functions.
// CHECK-NOT: @implementation
// CHECK-NOT: ImplFunc

@c @implementation
public func cImplFunc() { }

@_cdecl("objcImplFunc") @implementation
public func objcImplFunc() { }

/// Print other @c functions.
@c
public func bareCDecl() {}
// CHECK: @c
// CHECK-NEXT: public func bareCDecl

@c(c_name)
public func namedCDecl() {}
// CHECK: @c(c_name)
// CHECK-NEXT: public func namedCDecl

@_cdecl("objc_name")
public func namedLegacyCDecl() {}
// CHECK: @_cdecl("objc_name")
// CHECK-NEXT: public func namedLegacyCDecl