mirror of
https://github.com/apple/swift.git
synced 2026-06-20 15:42:51 +02:00
8713c13bef
For a given function, we might end up emitting it's definition as object code, serialized SIL, or both. The @export, @inlinable, and @inline(always) attributes provide control of this behavior at the declaration level. Centralize the query function that will look for each of these attributes and map down to a specific "code generation model", whose 3 options follow the naming from SE-0497: interface, inlinable, and implementation. Use this one computation to back the queries for "always emit into client", "never emit into client", and "inlinable" so we can't get inconsistent results from places that are doing one-off checks for these attributes.
167 lines
9.1 KiB
Swift
167 lines
9.1 KiB
Swift
// REQUIRES: swift_swift_parser
|
|
|
|
/// Test loading and external library through `-load-plugin-library`
|
|
/// TODO: switch this test case to use `-external-plugin-path`.
|
|
|
|
// RUN: %empty-directory(%t)
|
|
// RUN: %empty-directory(%t/plugins)
|
|
// RUN: split-file %s %t
|
|
//
|
|
//== Build the plugin library
|
|
// RUN: %host-build-swift \
|
|
// RUN: -swift-version 5 \
|
|
// RUN: -emit-library \
|
|
// RUN: -o %t/plugins/%target-library-name(MacroDefinition) \
|
|
// RUN: -module-name=MacroDefinition \
|
|
// RUN: %S/../Macros/Inputs/syntax_macro_definitions.swift \
|
|
// RUN: -g -no-toolchain-stdlib-rpath
|
|
|
|
/// No macro plugin when macro not used.
|
|
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-serialized -module-name MyApp -module-cache-path %t/clang-module-cache -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: %t/nomacro.swift -o %t/deps1.json -swift-version 5 -cache-compile-job -cas-path %t/cas -external-plugin-path %t/plugins#%swift-plugin-server
|
|
// RUN: %{python} %S/Inputs/SwiftDepsExtractor.py %t/deps1.json MyApp casFSRootID > %t/no_macro_fs.casid
|
|
// RUN: %cache-tool -cas-path %t/cas -cache-tool-action print-include-tree-list @%t/no_macro_fs.casid | %FileCheck %s --check-prefix=NO-MACRO
|
|
// NO-MACRO-NOT: MacroDefinition
|
|
|
|
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-serialized -module-name MyApp -module-cache-path %t/clang-module-cache -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: %t/macro.swift -o %t/deps.json -swift-version 5 -cache-compile-job -cas-path %t/cas -external-plugin-path %t/plugins#%swift-plugin-server
|
|
|
|
// RUN: %{python} %S/Inputs/SwiftDepsExtractor.py %t/deps.json MyApp casFSRootID > %t/fs.casid
|
|
// RUN: %cache-tool -cas-path %t/cas -cache-tool-action print-include-tree-list @%t/fs.casid | %FileCheck %s --check-prefix=FS
|
|
|
|
// FS: MacroDefinition
|
|
|
|
// RUN: %{python} %S/../../utils/swift-build-modules.py --cas %t/cas %swift_frontend_plain %t/deps.json -o %t/MyApp.cmd
|
|
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -typecheck -verify -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -swift-version 5 -module-name MyApp \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: %t/macro.swift @%t/MyApp.cmd
|
|
|
|
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-serialized -module-name MyApp -module-cache-path %t/clang-module-cache -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: %t/macro.swift -o %t/deps2.json -swift-version 5 -cache-compile-job -cas-path %t/cas -external-plugin-path %t/plugins#%swift-plugin-server \
|
|
// RUN: -scanner-prefix-map-paths %t /^test -scanner-prefix-map-paths %swift-bin-dir /^bin -resolved-plugin-verification
|
|
|
|
// RUN: %{python} %S/Inputs/SwiftDepsExtractor.py %t/deps2.json MyApp casFSRootID > %t/fs.casid
|
|
// RUN: %cache-tool -cas-path %t/cas -cache-tool-action print-include-tree-list @%t/fs.casid | %FileCheck %s --check-prefix=FS-REMAP -DLIB=%target-library-name(MacroDefinition)
|
|
|
|
/// CASFS is remapped.
|
|
// FS-REMAP: /^test{{/|\\}}plugins{{/|\\}}[[LIB]]
|
|
|
|
// RUN: %{python} %S/../../utils/swift-build-modules.py --cas %t/cas %swift_frontend_plain %t/deps2.json -o %t/MyApp2.cmd
|
|
|
|
/// Command-line is remapped.
|
|
// RUN: %FileCheck %s --check-prefix=CMD-REMAP --input-file=%t/MyApp2.cmd -DLIB=%target-library-name(MacroDefinition)
|
|
|
|
// CMD-REMAP: -resolved-plugin-verification
|
|
// CMD-REMAP-NEXT: -load-resolved-plugin
|
|
// CMD-REMAP-NEXT: /^test{{/|\\}}plugins{{/|\\}}[[LIB]]#/^bin{{/|\\}}swift-plugin-server{{(.exe)?}}#MacroDefinition
|
|
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -emit-module -o %t/Macro.swiftmodule -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -emit-module-interface-path %t/Macro.swiftinterface \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job \
|
|
// RUN: /^test/macro.swift @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir 2>&1 | %FileCheck %s --check-prefix=REMARK
|
|
// REMAKR: remark: cache miss
|
|
// REMARK: remark: loaded macro implementation module 'MacroDefinition' from compiler plugin server
|
|
|
|
/// Encoded PLUGIN_SEARCH_OPTION is remapped.
|
|
// RUN: %llvm-bcanalyzer -dump %t/Macro.swiftmodule | %FileCheck %s --check-prefix=MOD -DLIB=%target-library-name(MacroDefinition)
|
|
|
|
// MOD: <PLUGIN_SEARCH_OPTION abbrevid={{[0-9-]+}} op0=4/> blob data = '/^test{{/|\\}}plugins{{/|\\}}[[LIB]]#/^bin{{/|\\}}swift-plugin-server{{(.exe)?}}#MacroDefinition'
|
|
|
|
/// Cache hit has no macro-loading remarks because no macro is actually loaded and the path might not be correct due to different mapping.
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -emit-module -o %t/Macro.swiftmodule -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -emit-module-interface-path %t/Macro.swiftinterface \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job \
|
|
// RUN: /^test/macro.swift @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir 2>&1 | %FileCheck %s --check-prefix=NO-REMARK
|
|
// NO-REMARK: remark: replay output file
|
|
// NO-REMARK-NOT: remark: loaded macro implementation module 'MacroDefinition' from compiler plugin server
|
|
|
|
/// Update timestamp, the build should still work.
|
|
// RUN: touch %t/plugins/%target-library-name(MacroDefinition)
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -emit-module -o %t/Macro.swiftmodule -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -emit-module-interface-path %t/Macro.swiftinterface \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job -cache-disable-replay \
|
|
// RUN: /^test/macro.swift @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir
|
|
|
|
/// Typecheck swift interface with macro plugin.
|
|
// RUN: %cache-tool -cas-path %t/cas -cache-tool-action print-output-keys -- \
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -emit-module -o %t/Macro.swiftmodule -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -emit-module-interface-path %t/Macro.swiftinterface \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job -cache-disable-replay \
|
|
// RUN: /^test/macro.swift @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir > %t/keys.json
|
|
// RUN: %{python} %S/Inputs/ExtractOutputKey.py %t/keys.json /^test/macro.swift > %t/key
|
|
|
|
// RUN: %target-swift-frontend-plain \
|
|
// RUN: -typecheck-module-from-interface %t/Macro.swiftinterface \
|
|
// RUN: -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job -cache-disable-replay \
|
|
// RUN: @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir \
|
|
// RUN: -input-file-key @%t/key
|
|
|
|
/// Change the dylib content, this will fail the build.
|
|
// RUN: echo " " >> %t/plugins/%target-library-name(MacroDefinition)
|
|
// RUN: not %target-swift-frontend-plain \
|
|
// RUN: -emit-module -o %t/Macro.swiftmodule -cache-compile-job -cas-path %t/cas \
|
|
// RUN: -emit-module-interface-path %t/Macro.swiftinterface \
|
|
// RUN: -swift-version 5 -O \
|
|
// RUN: -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import \
|
|
// RUN: -module-name MyApp -Rmacro-loading -Rcache-compile-job -cache-disable-replay \
|
|
// RUN: /^test/macro.swift @%t/MyApp2.cmd -cache-replay-prefix-map /^test %t -cache-replay-prefix-map /^bin %swift-bin-dir 2>&1 | %FileCheck %s --check-prefix=FAILED
|
|
// FAILED: plugin has changed since dependency scanning
|
|
|
|
//--- nomacro.swift
|
|
func test() {}
|
|
|
|
//--- macro.swift
|
|
@attached(extension, conformances: P, names: named(requirement))
|
|
public macro DelegatedConformance() = #externalMacro(module: "MacroDefinition", type: "DelegatedConformanceViaExtensionMacro")
|
|
|
|
public protocol P {
|
|
static func requirement()
|
|
}
|
|
|
|
struct Wrapped: P {
|
|
static func requirement() {
|
|
print("Wrapped.requirement")
|
|
}
|
|
}
|
|
|
|
@DelegatedConformance
|
|
struct Generic<Element> {}
|
|
|
|
// CHECK: {"expandMacroResult":{"diagnostics":[],"expandedSource":"extension Generic: P where Element: P {\n static func requirement() {\n Element.requirement()\n }\n}"}}
|
|
|
|
func requiresP(_ value: (some P).Type) {
|
|
value.requirement()
|
|
}
|
|
|
|
requiresP(Generic<Wrapped>.self)
|
|
|
|
struct Outer {
|
|
@DelegatedConformance
|
|
struct Nested<Element> {}
|
|
}
|
|
|
|
// CHECK: {"expandMacroResult":{"diagnostics":[],"expandedSource":"extension Outer.Nested: P where Element: P {\n static func requirement() {\n Element.requirement()\n }\n}"}}
|
|
|
|
requiresP(Outer.Nested<Wrapped>.self)
|