mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
109 lines
5.6 KiB
Swift
109 lines
5.6 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %gyb %s > %t/main.swift
|
|
|
|
// Other module is not resilient:
|
|
// RUN: %empty-directory(%t/types)
|
|
// RUN: %target-build-swift %S/Inputs/extension_types.swift -module-name ExtensionTypes -emit-module -emit-module-path %t/types/ExtensionTypes.swiftmodule
|
|
// This module is both not resilient:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -O
|
|
// ... and resilient:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -O
|
|
// The same, but with -enable-testing:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-testing
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-testing -O
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -enable-testing
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/not_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=all -I %t/types %t/main.swift -enable-library-evolution -enable-testing -O
|
|
|
|
// Other module is resilient:
|
|
// RUN: %empty-directory(%t/types)
|
|
// RUN: %target-build-swift %S/Inputs/extension_types.swift -module-name ExtensionTypes -emit-module -emit-module-path %t/types/ExtensionTypes.swiftmodule -enable-library-evolution
|
|
// This module is both not resilient:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -O
|
|
// ... and resilient:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -O
|
|
// The same but with -enable-testing:
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-testing
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_not.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-testing -O
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -enable-testing
|
|
// RUN: %target-swift-frontend -emit-ir -o%t/resilient_resilient.ll -parse-as-library -module-name test -validate-tbd-against-ir=missing -I %t/types %t/main.swift -enable-library-evolution -enable-testing -O
|
|
|
|
|
|
import ExtensionTypes
|
|
|
|
// This generates all combinations of a public/internal/private struct
|
|
// (plus a public one from another module) being extended to conform
|
|
// to a public/internal/private protocol (plus a public one from
|
|
// another module), both with and without inheritance/defaulting.
|
|
|
|
%{
|
|
local_decl_names = ["Public", "Internal", "Private"]
|
|
all_decl_names = ["Foreign"] + local_decl_names
|
|
decl_name_to_access = {
|
|
"Foreign": "public",
|
|
"Public": "public",
|
|
"Internal": "internal",
|
|
"Private": "fileprivate"
|
|
}
|
|
def conformanceBody(protocol):
|
|
return """
|
|
{access} func {name}Method() {{}}
|
|
{access} var {name}Get: Int {{ return 0 }}
|
|
{access} var {name}GetSet: Int {{
|
|
get {{ return 0 }}
|
|
set {{}}
|
|
}}
|
|
""".format(access = decl_name_to_access[protocol],
|
|
name = protocol.lower())
|
|
}%
|
|
|
|
% for name in local_decl_names:
|
|
% access = name.lower()
|
|
|
|
${access} protocol Extension${name} {
|
|
func ${access}Method()
|
|
var ${access}Get: Int { get }
|
|
var ${access}GetSet: Int { get set }
|
|
}
|
|
|
|
// Defaulted methods:
|
|
${access} protocol Extension${name}Inherit: ExtensionForeign {}
|
|
extension Extension${name}Inherit {
|
|
${conformanceBody(name)}
|
|
}
|
|
|
|
${access} struct ${name}Struct {}
|
|
${access} struct ${name}StructInherit {}
|
|
${access} struct ${name}StructInheritNoDefault {}
|
|
${access} struct ${name}StructOneExtension {}
|
|
% end
|
|
|
|
% for sname in all_decl_names:
|
|
% access = sname.lower()
|
|
|
|
% for pname in all_decl_names:
|
|
// e.g. extension PublicStruct: Private { ... }
|
|
extension ${sname}Struct: Extension${pname} {
|
|
${conformanceBody(pname)}
|
|
}
|
|
|
|
// e.g. extension PublicStructInherit: PrivateInherit {}
|
|
extension ${sname}StructInherit: Extension${pname}Inherit {}
|
|
|
|
// e.g. extension PublicStructInheritNoDefault: PrivateInherit { ... }
|
|
extension ${sname}StructInheritNoDefault: Extension${pname}Inherit {
|
|
${conformanceBody(pname)}
|
|
}
|
|
% end
|
|
|
|
// e.g. extension PublicStructOneExtension: ExtensionForeign, ExtensionPublic, ExtensionInternal, ExtensionPrivate { ... }
|
|
extension ${sname}StructOneExtension: ${", ".join("Extension" + p for p in all_decl_names)} {
|
|
% for pname in all_decl_names:
|
|
${conformanceBody(pname)}
|
|
% end
|
|
}
|
|
% end
|