diff --git a/lib/IDE/ModuleInterfacePrinting.cpp b/lib/IDE/ModuleInterfacePrinting.cpp index 53671c7b65fba..44be95293d367 100644 --- a/lib/IDE/ModuleInterfacePrinting.cpp +++ b/lib/IDE/ModuleInterfacePrinting.cpp @@ -145,17 +145,6 @@ static bool printModuleInterfaceDecl(Decl *D, Printer.callAvoidPrintDeclPost(D); return false; } - if (auto Ext = dyn_cast(D)) { - // Clang extensions (categories) are always printed in source order. - // Swift extensions are printed with their associated type unless it's - // a cross-module extension. - if (!extensionHasClangNode(Ext)) { - auto ExtendedNominal = Ext->getExtendedNominal(); - if (!ExtendedNominal || - Ext->getModuleContext() == ExtendedNominal->getModuleContext()) - return false; - } - } // It'd be nice to avoid cloning the options here, but that would require // SynthesizedExtensionAnalyzer to promise to stay within the lifetime of @@ -677,6 +666,14 @@ void swift::ide::printModuleInterface( addToClangDecls(Ext, extensionGetClangNode(Ext)); continue; } + + // Swift extensions are printed with their associated type unless it's + // a cross-module extension. + if (auto extendedTy = Ext->getExtendedNominal()) { + if (TargetMod->isSameModuleLookingThroughOverlays( + extendedTy->getModuleContext())) + continue; + } } if (!IsSubmodule) { diff --git a/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Headers/MyType.h b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Headers/MyType.h new file mode 100644 index 0000000000000..f0cb4ed5414cb --- /dev/null +++ b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Headers/MyType.h @@ -0,0 +1,2 @@ +@interface MyType +@end diff --git a/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/TestExt.swiftmodule/arm64-apple-macos.swiftinterface b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/TestExt.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 0000000000000..19df5def6d19b --- /dev/null +++ b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/TestExt.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,16 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 6.2 +// swift-module-flags: -target arm64-apple-macos10.13 -enable-library-evolution -swift-version 5 -module-name TestExt + +@_exported import TestExt + +extension MyType { + public struct MyInnerType { + public func test() {} + } +} + +extension Int { + public struct OtherInnerType { + } +} diff --git a/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/module.modulemap b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/module.modulemap new file mode 100644 index 0000000000000..a658c89eab105 --- /dev/null +++ b/test/SynthesizeInterfaceTool/Inputs/Frameworks/TestExt.framework/Modules/module.modulemap @@ -0,0 +1,4 @@ +framework module TestExt { + header "MyType.h" + export * +} \ No newline at end of file diff --git a/test/SynthesizeInterfaceTool/test-swift-extension-printing.swift b/test/SynthesizeInterfaceTool/test-swift-extension-printing.swift new file mode 100644 index 0000000000000..1c1f57b976373 --- /dev/null +++ b/test/SynthesizeInterfaceTool/test-swift-extension-printing.swift @@ -0,0 +1,20 @@ +// RUN: %target-swift-synthesize-interface -module-name TestExt -F %S/Inputs/Frameworks -o - | %FileCheck %s + +// REQUIRES: OS=macosx && CPU=arm64 + +// CHECK: open class MyType + +// CHECK: extension MyType { +// CHECK: public struct MyInnerType { +// CHECK: public func test() +// CHECK: } +// CHECK: } + +// CHECK-NOT: public struct MyInnerType + +// CHECK: extension Int { +// CHECK: public struct OtherInnerType { +// CHECK: } +// CHECK: } + +// CHECK-NOT: public struct MyInnerType