mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
ModuleInterface: Only print API-level property wrappers in swiftinterfaces.
When a function parameter has attached property wrappers (SE-0293) those property wrappers are either considered "implementation" or "API" level. Property wrappers that are implementation-level don't affect how the function is called and therefore shouldn't be included in swiftinterfaces unless the function's body is also printed. Resolves rdar://156711817.
This commit is contained in:
@@ -9,34 +9,46 @@
|
||||
|
||||
@propertyWrapper
|
||||
public struct Wrapper<T> {
|
||||
public var value: T
|
||||
public var wrappedValue: T
|
||||
|
||||
public var wrappedValue: T {
|
||||
get { value }
|
||||
set { value = newValue }
|
||||
public init(wrappedValue: T) {
|
||||
self.wrappedValue = wrappedValue
|
||||
}
|
||||
}
|
||||
|
||||
@propertyWrapper
|
||||
public struct WrapperWithInitialValue<T> {
|
||||
private var value: T
|
||||
|
||||
public var wrappedValue: T {
|
||||
get { value }
|
||||
set { value = newValue }
|
||||
}
|
||||
public var wrappedValue: T
|
||||
|
||||
public init(initialValue: T) {
|
||||
self.value = initialValue
|
||||
self.wrappedValue = initialValue
|
||||
}
|
||||
|
||||
public init(alternate value: T) {
|
||||
self.value = value
|
||||
self.wrappedValue = value
|
||||
}
|
||||
|
||||
public var projectedValue: Wrapper<T> {
|
||||
get { Wrapper(value: value) }
|
||||
set { value = newValue.value }
|
||||
get { Wrapper(wrappedValue: wrappedValue) }
|
||||
set { wrappedValue = newValue.wrappedValue }
|
||||
}
|
||||
}
|
||||
|
||||
@propertyWrapper
|
||||
public struct ProjectedValueWrapper<T> {
|
||||
public var wrappedValue: T
|
||||
|
||||
public init(wrappedValue: T) {
|
||||
self.wrappedValue = wrappedValue
|
||||
}
|
||||
|
||||
public init(projectedValue: Wrapper<T>) {
|
||||
self.wrappedValue = projectedValue.wrappedValue
|
||||
}
|
||||
|
||||
public var projectedValue: Wrapper<T> {
|
||||
get { Wrapper(wrappedValue: wrappedValue) }
|
||||
set { wrappedValue = newValue.wrappedValue }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,4 +76,22 @@ public struct HasWrappers {
|
||||
// CHECK-NEXT: _modify
|
||||
// CHECK-NEXT: }
|
||||
@WrapperWithInitialValue(alternate: false) public var z
|
||||
|
||||
// CHECK: public func hasParameterWithImplementationWrapper(x: Swift.Int)
|
||||
public func hasParameterWithImplementationWrapper(@Wrapper x: Int) { }
|
||||
|
||||
// CHECK: public func hasParameterWithImplementationWrapperComposed(x: Swift.Int)
|
||||
public func hasParameterWithImplementationWrapperComposed(@Wrapper @ProjectedValueWrapper x: Int) { }
|
||||
|
||||
// CHECK: @inlinable public func hasParameterWithImplementationWrapperInlinable(@TestResilient.Wrapper x: Swift.Int)
|
||||
@inlinable public func hasParameterWithImplementationWrapperInlinable(@Wrapper x: Int) { }
|
||||
|
||||
// CHECK: @_alwaysEmitIntoClient public func hasParameterWithImplementationWrapperAEIC(@TestResilient.Wrapper x: Swift.Int)
|
||||
@_alwaysEmitIntoClient public func hasParameterWithImplementationWrapperAEIC(@Wrapper x: Int) { }
|
||||
|
||||
// CHECK: public func hasParameterWithAPIWrapper(@TestResilient.ProjectedValueWrapper x: Swift.Int)
|
||||
public func hasParameterWithAPIWrapper(@ProjectedValueWrapper x: Int) { }
|
||||
|
||||
// CHECK: public func hasParameterWithAPIWrapperComposed(@TestResilient.ProjectedValueWrapper @TestResilient.Wrapper x: Swift.Int)
|
||||
public func hasParameterWithAPIWrapperComposed(@ProjectedValueWrapper @Wrapper x: Int) { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user