1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
// RUN: %empty-directory(%t)
// RUN: %gyb %s -o %t/bridging-nsnumber-and-nsvalue.swift
// RUN: %target-swift-frontend -typecheck -verify %t/bridging-nsnumber-and-nsvalue.swift -swift-version 4
// REQUIRES: objc_interop
import Foundation
import CoreGraphics
%{
coercionTypes = {
'NSNumber': [
'Int',
'UInt',
'Int64',
'UInt64',
'Int32',
'UInt32',
'Int16',
'UInt16',
'Int8',
'UInt8',
'Float',
'Double',
'CGFloat',
],
'NSValue': [
'CGRect',
'CGPoint',
'CGSize',
],
}
}%
// For testing purposes, make everything Hashable. Don't do this at home
extension Equatable {
public static func ==(x: Self, y: Self) -> Bool {
fatalError("hella cray")
}
}
extension Hashable {
public func hash(into hasher: inout Hasher) {
fatalError("trill hiphy")
}
}
extension CGSize: @retroactive Hashable {}
extension CGPoint: @retroactive Hashable {}
extension CGRect: @retroactive Hashable {}
% for ObjectType, ValueTypes in coercionTypes.items():
func bridgeNSNumberBackToSpecificType(object: ${ObjectType},
optional: ${ObjectType}?,
array: [${ObjectType}],
dictKeys: [${ObjectType}: Any],
dictValues: [AnyHashable: ${ObjectType}],
dictBoth: [${ObjectType}: ${ObjectType}],
set: Set<${ObjectType}>) {
% for Type in ValueTypes:
_ = object as ${Type} // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = object is ${Type}
_ = object as? ${Type}
_ = object as! ${Type}
_ = optional as ${Type}? // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = optional is ${Type}?
_ = optional as? ${Type}?
_ = optional as! ${Type}?
_ = optional as ${Type} // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = optional is ${Type}
_ = optional as? ${Type}
_ = optional as! ${Type}
_ = array as [${Type}] // expected-error{{cannot convert value of type '[${ObjectType}]' to type '[${Type}]' in coercion}} expected-note {{arguments to generic parameter 'Element' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = array is [${Type}]
_ = array as? [${Type}]
_ = array as! [${Type}]
_ = dictKeys as [${Type}: Any] // expected-error{{cannot convert value of type '[${ObjectType} : Any]' to type '[${Type} : Any]' in coercion}} expected-note {{arguments to generic parameter 'Key' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = dictKeys is [${Type}: Any]
_ = dictKeys as? [${Type}: Any]
_ = dictKeys as! [${Type}: Any]
_ = dictKeys as [${Type}: AnyObject] // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = dictKeys is [${Type}: AnyObject]
_ = dictKeys as? [${Type}: AnyObject]
_ = dictKeys as! [${Type}: AnyObject]
_ = dictValues as [AnyHashable: ${Type}] // expected-error{{cannot convert value of type '[AnyHashable : ${ObjectType}]' to type '[AnyHashable : ${Type}]' in coercion}} expected-note {{arguments to generic parameter 'Value' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = dictValues is [AnyHashable: ${Type}]
_ = dictValues as? [AnyHashable: ${Type}]
_ = dictValues as! [AnyHashable: ${Type}]
_ = dictValues as [NSObject: ${Type}] // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = dictValues is [NSObject: ${Type}]
_ = dictValues as? [NSObject: ${Type}]
_ = dictValues as! [NSObject: ${Type}]
_ = dictBoth as [${ObjectType}: ${Type}] // expected-error{{cannot convert value of type '[${ObjectType} : ${ObjectType}]' to type '[${ObjectType} : ${Type}]' in coercion}} expected-note {{arguments to generic parameter 'Value' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = dictBoth is [${ObjectType}: ${Type}]
_ = dictBoth as? [${ObjectType}: ${Type}]
_ = dictBoth as! [${ObjectType}: ${Type}]
_ = dictBoth as [${Type}: ${ObjectType}] // expected-error{{cannot convert value of type '[${ObjectType} : ${ObjectType}]' to type '[${Type} : ${ObjectType}]' in coercion}} expected-note {{arguments to generic parameter 'Key' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = dictBoth is [${Type}: ${ObjectType}]
_ = dictBoth as? [${Type}: ${ObjectType}]
_ = dictBoth as! [${Type}: ${ObjectType}]
_ = dictBoth as [${Type}: ${Type}] // expected-error{{is not convertible to}} expected-note {{use 'as!'}}
_ = dictBoth is [${Type}: ${Type}]
_ = dictBoth as? [${Type}: ${Type}]
_ = dictBoth as! [${Type}: ${Type}]
_ = set as Set<${Type}> // expected-error{{cannot convert value of type 'Set<${ObjectType}>' to type 'Set<${Type}>' in coercion}} expected-note {{arguments to generic parameter 'Element' ('${ObjectType}' and '${Type}') are expected to be equal}}
_ = set is Set<${Type}>
_ = set as? Set<${Type}>
_ = set as! Set<${Type}>
% end
_ = object is String // expected-warning{{always fails}}
_ = object as? String // expected-warning{{always fails}}
_ = object as! String // expected-warning{{always fails}}
}
% end
|