mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This commit defines the ‘Any’ keyword, implements parsing for composing types with an infix ‘&’, and provides a fixit to convert ‘protocol<>’ - Updated tests & stdlib for new composition syntax - Provide errors when compositions used in inheritance. Any is treated as a contextual keyword. The name ‘Any’ is used emit the empty composition type. We have to stop user declaring top level types spelled ‘Any’ too.
140 lines
2.4 KiB
Swift
140 lines
2.4 KiB
Swift
public struct Empty {}
|
|
|
|
public struct TwoInts {
|
|
public var x, y : Int
|
|
public init(x: Int, y: Int) {
|
|
self.x = x
|
|
self.y = y
|
|
}
|
|
}
|
|
|
|
public struct ComputedProperty {
|
|
public var value : Int {
|
|
get {
|
|
var result = 0
|
|
return result
|
|
}
|
|
}
|
|
}
|
|
|
|
public struct StaticProperties {
|
|
public static var foo: Int = 0
|
|
public static let bar: Int = 0
|
|
public static var baz: Int {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// Generics
|
|
public struct Pair<A, B> {
|
|
public var first : A
|
|
public var second : B
|
|
|
|
public init(a : A, b : B) {
|
|
first = a
|
|
second = b
|
|
}
|
|
}
|
|
|
|
public typealias VoidPairTuple = ((), ())
|
|
|
|
public struct GenericCtor<U> {
|
|
public init<T>(_ t : T) {}
|
|
|
|
public func doSomething<T>(_ t: T) {}
|
|
}
|
|
|
|
// Protocols
|
|
public protocol Resettable {
|
|
mutating
|
|
func reset()
|
|
}
|
|
|
|
public struct ResettableIntWrapper : Resettable {
|
|
public var value : Int
|
|
public mutating
|
|
func reset() {
|
|
var zero = 0
|
|
value = zero
|
|
}
|
|
public init(value: Int) { self.value = value }
|
|
}
|
|
|
|
public protocol Computable {
|
|
mutating
|
|
func compute()
|
|
}
|
|
|
|
public typealias Cacheable = Resettable & Computable
|
|
|
|
public protocol SpecialResettable : Resettable, Computable {}
|
|
|
|
public protocol HasAssociatedType {
|
|
associatedtype ComputableType : Computable
|
|
}
|
|
|
|
public struct ComputableWrapper<T : Computable> : HasAssociatedType {
|
|
public typealias ComputableType = T
|
|
public init() {}
|
|
}
|
|
|
|
public protocol AnotherAssociated {
|
|
associatedtype ResettableType : Resettable
|
|
}
|
|
|
|
public struct ResettableWrapper<T : Resettable> : AnotherAssociated {
|
|
public typealias ResettableType = T
|
|
public init() {}
|
|
}
|
|
|
|
public func cacheViaWrappers<
|
|
T : HasAssociatedType, U : AnotherAssociated
|
|
where T.ComputableType == U.ResettableType
|
|
>(_ computable : T, _ resettable : U) {}
|
|
|
|
|
|
// Subscripts
|
|
public struct ReadonlySimpleSubscript {
|
|
public subscript(x : Int) -> Bool {
|
|
return true
|
|
}
|
|
public init() {}
|
|
}
|
|
|
|
public struct ComplexSubscript {
|
|
public subscript(x : Int, y : Bool) -> Int {
|
|
set(newValue) {
|
|
// do nothing!
|
|
}
|
|
get {
|
|
return 0
|
|
}
|
|
}
|
|
public init() {}
|
|
}
|
|
|
|
|
|
// Extensions
|
|
public extension Empty {
|
|
public func doAbsolutelyNothing() {}
|
|
}
|
|
|
|
public struct UnComputable {}
|
|
extension UnComputable : Computable {
|
|
public init(x : Int) {}
|
|
public func compute() {}
|
|
public static func canCompute() -> Bool {
|
|
return true
|
|
}
|
|
}
|
|
|
|
public extension Pair {
|
|
public func swap() -> (B, A) {
|
|
return (second, first)
|
|
}
|
|
}
|
|
|
|
public struct Burger {
|
|
public let pattyCount: Int
|
|
}
|