-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathbridging-nsnumber-and-nsvalue.swift.gyb
120 lines (103 loc) · 3.6 KB
/
bridging-nsnumber-and-nsvalue.swift.gyb
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
// 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 var hashValue: Int { fatalError("trill hiphy") } }
extension CGSize: Hashable {}
extension CGPoint: Hashable {}
extension CGRect: 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{{use 'as!'}}
_ = object is ${Type}
_ = object as? ${Type}
_ = object as! ${Type}
_ = optional as ${Type}? // expected-error{{use 'as!'}}
_ = optional is ${Type}?
_ = optional as? ${Type}?
_ = optional as! ${Type}?
_ = optional as ${Type} // expected-error{{use 'as!'}}
_ = optional is ${Type}
_ = optional as? ${Type}
_ = optional as! ${Type}
_ = array as [${Type}] // expected-error{{use 'as!'}}
_ = array is [${Type}]
_ = array as? [${Type}]
_ = array as! [${Type}]
_ = dictKeys as [${Type}: Any] // expected-error{{use 'as!'}}
_ = dictKeys is [${Type}: Any]
_ = dictKeys as? [${Type}: Any]
_ = dictKeys as! [${Type}: Any]
_ = dictKeys as [${Type}: AnyObject] // expected-error{{use 'as!'}}
_ = dictKeys is [${Type}: AnyObject]
_ = dictKeys as? [${Type}: AnyObject]
_ = dictKeys as! [${Type}: AnyObject]
_ = dictValues as [AnyHashable: ${Type}] // expected-error{{use 'as!'}}
_ = dictValues is [AnyHashable: ${Type}]
_ = dictValues as? [AnyHashable: ${Type}]
_ = dictValues as! [AnyHashable: ${Type}]
_ = dictValues as [NSObject: ${Type}] // expected-error{{use 'as!'}}
_ = dictValues is [NSObject: ${Type}]
_ = dictValues as? [NSObject: ${Type}]
_ = dictValues as! [NSObject: ${Type}]
_ = dictBoth as [${ObjectType}: ${Type}] // expected-error{{use 'as!'}}
_ = dictBoth is [${ObjectType}: ${Type}]
_ = dictBoth as? [${ObjectType}: ${Type}]
_ = dictBoth as! [${ObjectType}: ${Type}]
_ = dictBoth as [${Type}: ${ObjectType}] // expected-error{{use 'as!'}}
_ = dictBoth is [${Type}: ${ObjectType}]
_ = dictBoth as? [${Type}: ${ObjectType}]
_ = dictBoth as! [${Type}: ${ObjectType}]
_ = dictBoth as [${Type}: ${Type}] // expected-error{{use 'as!'}}
_ = dictBoth is [${Type}: ${Type}]
_ = dictBoth as? [${Type}: ${Type}]
_ = dictBoth as! [${Type}: ${Type}]
_ = set as Set<${Type}> // expected-error{{use 'as!'}}
_ = 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