84
84
// CHECK-NEXT: "value": "\"Hello, World\""
85
85
// CHECK-NEXT: }
86
86
// CHECK-NEXT: ]
87
+ // CHECK-NEXT: },
88
+ // CHECK-NEXT: {
89
+ // CHECK-NEXT: "typeName": "ExtractLiterals.PropertyWrappers",
90
+ // CHECK-NEXT: "kind": "struct",
91
+ // CHECK-NEXT: "properties": [
92
+ // CHECK-NEXT: {
93
+ // CHECK-NEXT: "label": "_propertyWrapper1",
94
+ // CHECK-NEXT: "type": "ExtractLiterals.Buffered<Swift.String>",
95
+ // CHECK-NEXT: "isStatic": "false",
96
+ // CHECK-NEXT: "isComputed": "false",
97
+ // CHECK-NEXT: "valueKind": "Runtime"
98
+ // CHECK-NEXT: },
99
+ // CHECK-NEXT: {
100
+ // CHECK-NEXT: "label": "_propertyWrapper2",
101
+ // CHECK-NEXT: "type": "ExtractLiterals.Clamping<Swift.Int>",
102
+ // CHECK-NEXT: "isStatic": "false",
103
+ // CHECK-NEXT: "isComputed": "false",
104
+ // CHECK-NEXT: "valueKind": "Runtime"
105
+ // CHECK-NEXT: },
106
+ // CHECK-NEXT: {
107
+ // CHECK-NEXT: "label": "_propertyWrapper3",
108
+ // CHECK-NEXT: "type": "ExtractLiterals.Buffered<ExtractLiterals.Clamping<Swift.Int>>",
109
+ // CHECK-NEXT: "isStatic": "false",
110
+ // CHECK-NEXT: "isComputed": "false",
111
+ // CHECK-NEXT: "valueKind": "Runtime"
112
+ // CHECK-NEXT: },
113
+ // CHECK-NEXT: {
114
+ // CHECK-NEXT: "label": "propertyWrapper1",
115
+ // CHECK-NEXT: "type": "Swift.String",
116
+ // CHECK-NEXT: "isStatic": "false",
117
+ // CHECK-NEXT: "isComputed": "true",
118
+ // CHECK-NEXT: "valueKind": "RawLiteral",
119
+ // CHECK-NEXT: "value": "\"Hello\"",
120
+ // CHECK-NEXT: "attributes": [
121
+ // CHECK-NEXT: {
122
+ // CHECK-NEXT: "type": "ExtractLiterals.Buffered",
123
+ // CHECK-NEXT: "arguments": []
124
+ // CHECK-NEXT: }
125
+ // CHECK-NEXT: ]
126
+ // CHECK-NEXT: },
127
+ // CHECK-NEXT: {
128
+ // CHECK-NEXT: "label": "$propertyWrapper1",
129
+ // CHECK-NEXT: "type": "(Swift.String, Swift.String?)",
130
+ // CHECK-NEXT: "isStatic": "false",
131
+ // CHECK-NEXT: "isComputed": "true",
132
+ // CHECK-NEXT: "valueKind": "Runtime"
133
+ // CHECK-NEXT: },
134
+ // CHECK-NEXT: {
135
+ // CHECK-NEXT: "label": "propertyWrapper2",
136
+ // CHECK-NEXT: "type": "Swift.Int",
137
+ // CHECK-NEXT: "isStatic": "false",
138
+ // CHECK-NEXT: "isComputed": "true",
139
+ // CHECK-NEXT: "valueKind": "RawLiteral",
140
+ // CHECK-NEXT: "value": "128",
141
+ // CHECK-NEXT: "attributes": [
142
+ // CHECK-NEXT: {
143
+ // CHECK-NEXT: "type": "ExtractLiterals.Clamping",
144
+ // CHECK-NEXT: "arguments": [
145
+ // CHECK-NEXT: {
146
+ // CHECK-NEXT: "label": "min",
147
+ // CHECK-NEXT: "type": "Swift.Int",
148
+ // CHECK-NEXT: "valueKind": "RawLiteral",
149
+ // CHECK-NEXT: "value": "0"
150
+ // CHECK-NEXT: },
151
+ // CHECK-NEXT: {
152
+ // CHECK-NEXT: "label": "max",
153
+ // CHECK-NEXT: "type": "Swift.Int",
154
+ // CHECK-NEXT: "valueKind": "RawLiteral",
155
+ // CHECK-NEXT: "value": "255"
156
+ // CHECK-NEXT: }
157
+ // CHECK-NEXT: ]
158
+ // CHECK-NEXT: }
159
+ // CHECK-NEXT: ]
160
+ // CHECK-NEXT: },
161
+ // CHECK-NEXT: {
162
+ // CHECK-NEXT: "label": "propertyWrapper3",
163
+ // CHECK-NEXT: "type": "Swift.Int",
164
+ // CHECK-NEXT: "isStatic": "false",
165
+ // CHECK-NEXT: "isComputed": "true",
166
+ // CHECK-NEXT: "valueKind": "RawLiteral",
167
+ // CHECK-NEXT: "value": "128",
168
+ // CHECK-NEXT: "attributes": [
169
+ // CHECK-NEXT: {
170
+ // CHECK-NEXT: "type": "ExtractLiterals.Buffered",
171
+ // CHECK-NEXT: "arguments": []
172
+ // CHECK-NEXT: },
173
+ // CHECK-NEXT: {
174
+ // CHECK-NEXT: "type": "ExtractLiterals.Clamping",
175
+ // CHECK-NEXT: "arguments": [
176
+ // CHECK-NEXT: {
177
+ // CHECK-NEXT: "label": "min",
178
+ // CHECK-NEXT: "type": "Swift.Int",
179
+ // CHECK-NEXT: "valueKind": "RawLiteral",
180
+ // CHECK-NEXT: "value": "0"
181
+ // CHECK-NEXT: },
182
+ // CHECK-NEXT: {
183
+ // CHECK-NEXT: "label": "max",
184
+ // CHECK-NEXT: "type": "Swift.Int",
185
+ // CHECK-NEXT: "valueKind": "RawLiteral",
186
+ // CHECK-NEXT: "value": "255"
187
+ // CHECK-NEXT: }
188
+ // CHECK-NEXT: ]
189
+ // CHECK-NEXT: }
190
+ // CHECK-NEXT: ]
191
+ // CHECK-NEXT: },
192
+ // CHECK-NEXT: {
193
+ // CHECK-NEXT: "label": "$propertyWrapper3",
194
+ // CHECK-NEXT: "type": "(ExtractLiterals.Clamping<Swift.Int>, ExtractLiterals.Clamping<Swift.Int>?)",
195
+ // CHECK-NEXT: "isStatic": "false",
196
+ // CHECK-NEXT: "isComputed": "true",
197
+ // CHECK-NEXT: "valueKind": "Runtime"
198
+ // CHECK-NEXT: }
199
+ // CHECK-NEXT: ]
87
200
// CHECK-NEXT: }
88
201
// CHECK-NEXT:]
89
202
@@ -107,3 +220,60 @@ public struct Floats : MyProto {
107
220
public struct Strings : MyProto {
108
221
let string1 : String = " Hello, World "
109
222
}
223
+
224
+ public struct PropertyWrappers : MyProto {
225
+ @Buffered
226
+ var propertyWrapper1 : String = " Hello "
227
+
228
+ @Clamping ( min: 0 , max: 255 )
229
+ var propertyWrapper2 : Int = 128
230
+
231
+ @Buffered @Clamping ( min: 0 , max: 255 )
232
+ var propertyWrapper3 : Int = 128
233
+ }
234
+
235
+ @propertyWrapper
236
+ struct Clamping < V: Comparable > {
237
+ var value : V
238
+ let min : V
239
+ let max : V
240
+
241
+ init ( wrappedValue: V , min: V , max: V ) {
242
+ self . value = wrappedValue
243
+ self . min = min
244
+ self . max = max
245
+ }
246
+
247
+ var wrappedValue : V {
248
+ get { return self . value }
249
+ set {
250
+ if newValue < self . min {
251
+ self . value = self . min
252
+ } else if newValue > self . max {
253
+ self . value = self . max
254
+ } else {
255
+ self . value = newValue
256
+ }
257
+ }
258
+ }
259
+ }
260
+
261
+ @propertyWrapper
262
+ struct Buffered < V> {
263
+ var value : V
264
+ var lastValue : V ?
265
+
266
+ init ( wrappedValue: V ) {
267
+ self . value = wrappedValue
268
+ }
269
+
270
+ var wrappedValue : V {
271
+ get { return value }
272
+ set {
273
+ self . lastValue = self . value
274
+ self . value = newValue
275
+ }
276
+ }
277
+
278
+ var projectedValue : ( V , V ? ) { ( self . value, self . lastValue) }
279
+ }
0 commit comments