From 85cd9052663adaf64595532f6668d6d682013e2d Mon Sep 17 00:00:00 2001 From: Zixu Wang Date: Mon, 17 Nov 2025 15:47:03 -0800 Subject: [PATCH] [APIGen] Mark symbols from non-API level library as private All symbols are private (as in the API descriptor) if the library level is more restricted than `LibraryLevel::API`. Resolves rdar://164901718 --- lib/IRGen/TBDGen.cpp | 5 + test/APIJSON/apigen.swift | 4 +- test/APIJSON/availability.swift | 2 +- test/APIJSON/extension.swift | 4 +- test/APIJSON/library-level.swift | 250 ++++++++++++++++++++++++++++++ test/APIJSON/non-objc-class.swift | 4 +- test/APIJSON/objc-implement.swift | 2 +- test/APIJSON/spi.swift | 4 +- test/APIJSON/struct.swift | 4 +- 9 files changed, 267 insertions(+), 12 deletions(-) create mode 100644 test/APIJSON/library-level.swift diff --git a/lib/IRGen/TBDGen.cpp b/lib/IRGen/TBDGen.cpp index c3ac1cf0a1734..dccc807c598e2 100644 --- a/lib/IRGen/TBDGen.cpp +++ b/lib/IRGen/TBDGen.cpp @@ -705,6 +705,11 @@ class APIGenRecorder final : public APIRecorder { bool isSPI(const Decl *decl) { assert(decl); + // If the module's library level is more restricted than API, all symbols + // should be SPIs. + if (module->getLibraryLevel() < swift::LibraryLevel::API) + return true; + if (auto value = dyn_cast(decl)) { auto accessScope = value->getFormalAccessScope(/*useDC=*/nullptr, diff --git a/test/APIJSON/apigen.swift b/test/APIJSON/apigen.swift index ca86632b35c00..f2b0478ca73bf 100644 --- a/test/APIJSON/apigen.swift +++ b/test/APIJSON/apigen.swift @@ -1,8 +1,8 @@ // REQUIRES: objc_interop, OS=macosx // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -package-name MyModule -swift-version 5 -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -package-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -package-name MyModule -swift-version 5 -library-level api +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -package-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s import Foundation diff --git a/test/APIJSON/availability.swift b/test/APIJSON/availability.swift index 57124cae8d6b3..bea4bbcb5e733 100644 --- a/test/APIJSON/availability.swift +++ b/test/APIJSON/availability.swift @@ -1,7 +1,7 @@ // REQUIRES: objc_interop, OS=macosx // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -target arm64-apple-macos12 +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -target arm64-apple-macos12 -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s @available(iOS 13.0, *) diff --git a/test/APIJSON/extension.swift b/test/APIJSON/extension.swift index 5af1e3bde66e0..11057128e5146 100644 --- a/test/APIJSON/extension.swift +++ b/test/APIJSON/extension.swift @@ -1,8 +1,8 @@ // REQUIRES: objc_interop, OS=macosx // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -library-level api +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s import Foundation diff --git a/test/APIJSON/library-level.swift b/test/APIJSON/library-level.swift new file mode 100644 index 0000000000000..f54088fe2166c --- /dev/null +++ b/test/APIJSON/library-level.swift @@ -0,0 +1,250 @@ +// REQUIRES: objc_interop, OS=macosx +// RUN: %empty-directory(%t) +// RUN: %empty-directory(%t/ModuleCache) + +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/none.json -target arm64-apple-macos26 +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -target arm64-apple-macos26 -library-level api +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/spi.json -target arm64-apple-macos26 -library-level spi +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/ipi.json -target arm64-apple-macos26 -library-level ipi +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/other.json -target arm64-apple-macos26 -library-level other +// RUN: %validate-json %t/api.json | %FileCheck %s --check-prefixes CHECK,API +// RUN: %validate-json %t/none.json | %FileCheck %s --check-prefixes CHECK,NON-API +// RUN: %validate-json %t/spi.json | %FileCheck %s --check-prefixes CHECK,NON-API +// RUN: %validate-json %t/ipi.json | %FileCheck %s --check-prefixes CHECK,NON-API +// RUN: %validate-json %t/other.json | %FileCheck %s --check-prefixes CHECK,NON-API + +import Foundation + +@_spi(Experimental) public func newUnprovenFunc() {} +@_spi(Experimental) public class MyClass : NSObject { + @objc public func spiMethod() {} +} + +public class MyClass2 : NSObject { + @_spi(Experimental) @objc public func spiMethod() {} + + @_spi_available(macOS 10.10, tvOS 14.0, *) + @available(iOS 8.0, *) + @objc public func spiAvailableMethod() {} +} + +@_spi_available(macOS 10.10, tvOS 14.0, *) +@available(iOS 8.0, *) +public func spiAvailableFunc() {} + +// CHECK: { +// CHECK-NEXT: "target": "arm64-apple-macos26", +// CHECK-NEXT: "globals": [ +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassC9spiMethodyyFTj", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassC9spiMethodyyFTq", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCACycfC", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCACycfc", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCMa", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCMn", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCMo", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCMu", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCN", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A5ClassCfD", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTj", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported", +// CHECK-NEXT: "introduced": "10.10", +// CHECK-NEXT: "SPIAvailable": true +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C18spiAvailableMethodyyFTq", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported", +// CHECK-NEXT: "introduced": "10.10", +// CHECK-NEXT: "SPIAvailable": true +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C9spiMethodyyFTj", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2C9spiMethodyyFTq", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CACycfC", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CACycfc", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CMa", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CMn", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CMo", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CMu", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CN", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule0A6Class2CfD", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule15newUnprovenFuncyyF", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_$s8MyModule16spiAvailableFuncyyF", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported", +// CHECK-NEXT: "introduced": "10.10", +// CHECK-NEXT: "SPIAvailable": true +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "interfaces": [ +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_TtC8MyModule7MyClass", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported", +// CHECK-NEXT: "super": "NSObject", +// CHECK-NEXT: "instanceMethods": [ +// CHECK-NEXT: { +// CHECK-NEXT: "name": "spiMethod", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "init", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "classMethods": [] +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "_TtC8MyModule8MyClass2", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "linkage": "exported", +// CHECK-NEXT: "super": "NSObject", +// CHECK-NEXT: "instanceMethods": [ +// CHECK-NEXT: { +// CHECK-NEXT: "name": "spiMethod", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "spiAvailableMethod", +// CHECK-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift", +// CHECK-NEXT: "introduced": "10.10", +// CHECK-NEXT: "SPIAvailable": true +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "name": "init", +// API-NEXT: "access": "public", +// NON-API-NEXT: "access": "private", +// CHECK-NEXT: "file": "SOURCE_DIR/test/APIJSON/library-level.swift" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "classMethods": [] +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "categories": [], +// CHECK-NEXT: "version": "1.0" +// CHECK-NEXT: } diff --git a/test/APIJSON/non-objc-class.swift b/test/APIJSON/non-objc-class.swift index 6f659bfad151f..826ad0ad20b4a 100644 --- a/test/APIJSON/non-objc-class.swift +++ b/test/APIJSON/non-objc-class.swift @@ -1,8 +1,8 @@ // REQUIRES: objc_interop, OS=macosx // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -library-level api +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s import Foundation diff --git a/test/APIJSON/objc-implement.swift b/test/APIJSON/objc-implement.swift index 9913c81bd696f..2e258a91c4e27 100644 --- a/test/APIJSON/objc-implement.swift +++ b/test/APIJSON/objc-implement.swift @@ -2,7 +2,7 @@ // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) // RUN: split-file %s %t -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %t/objc-implement.swift -typecheck -parse-as-library -emit-module-interface-path %t/ObjcImplement.swiftinterface -enable-library-evolution -module-name ObjcImplement -import-underlying-module -swift-version 5 -emit-api-descriptor-path %t/api.json +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %t/objc-implement.swift -typecheck -parse-as-library -emit-module-interface-path %t/ObjcImplement.swiftinterface -enable-library-evolution -module-name ObjcImplement -import-underlying-module -swift-version 5 -emit-api-descriptor-path %t/api.json -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s //--- objc-implement.swift diff --git a/test/APIJSON/spi.swift b/test/APIJSON/spi.swift index fd8b6c0af7f08..06be0e650cfa5 100644 --- a/test/APIJSON/spi.swift +++ b/test/APIJSON/spi.swift @@ -2,8 +2,8 @@ // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -target arm64-apple-macos26 +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -library-level api +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) %s -parse-as-library -emit-module -emit-module-path %t/MyModule.swiftmodule -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -target arm64-apple-macos26 -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s import Foundation diff --git a/test/APIJSON/struct.swift b/test/APIJSON/struct.swift index 6314059e36449..7745471a621f5 100644 --- a/test/APIJSON/struct.swift +++ b/test/APIJSON/struct.swift @@ -1,8 +1,8 @@ // REQUIRES: objc_interop, OS=macosx // RUN: %empty-directory(%t) // RUN: %empty-directory(%t/ModuleCache) -// RUN: %target-swift-frontend %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -// RUN: %target-swift-frontend %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json +// RUN: %target-swift-frontend %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -library-level api +// RUN: %target-swift-frontend %s -typecheck -parse-as-library -emit-module-interface-path %t/MyModule.swiftinterface -enable-library-evolution -module-name MyModule -swift-version 5 -emit-api-descriptor-path %t/api.json -library-level api // RUN: %validate-json %t/api.json | %FileCheck %s // Struct has no objc data.