File tree Expand file tree Collapse file tree 2 files changed +68
-0
lines changed Expand file tree Collapse file tree 2 files changed +68
-0
lines changed Original file line number Diff line number Diff line change @@ -234,6 +234,7 @@ extension PerceptionRegistrar: Hashable {
234
234
guard
235
235
mangledSymbol. isMangledViewBodyGetter,
236
236
let demangled = String ( Substring ( mangledSymbol) ) . demangled,
237
+ !demangled. isSuspendingClosure,
237
238
!demangled. isActionClosure
238
239
else {
239
240
continue
@@ -247,6 +248,24 @@ extension PerceptionRegistrar: Hashable {
247
248
}
248
249
249
250
extension String {
251
+ fileprivate var isSuspendingClosure : Bool {
252
+ let fragment = self . utf8. drop ( while: { $0 != . init( ascii: " ) " ) } ) . dropFirst ( )
253
+ return fragment. starts (
254
+ with: " suspend resume partial function for closure " . utf8
255
+ )
256
+ || fragment. starts (
257
+ with: " suspend resume partial function for implicit closure " . utf8
258
+ )
259
+ || fragment. starts (
260
+ with: " await resume partial function for partial apply forwarder for closure " . utf8
261
+ )
262
+ || fragment. starts (
263
+ with: " await resume partial function for partial apply forwarder for implicit closure " . utf8
264
+ )
265
+ || fragment. starts (
266
+ with: " await resume partial function for implicit closure " . utf8
267
+ )
268
+ }
250
269
fileprivate var isActionClosure : Bool {
251
270
var view = self [ ... ] . utf8
252
271
guard
Original file line number Diff line number Diff line change 450
450
self . render ( FeatureView ( ) )
451
451
}
452
452
453
+ func testAccessInOnAppearWithAsyncTask( ) async throws {
454
+ @MainActor
455
+ struct FeatureView : View {
456
+ let model = Model ( )
457
+ var body : some View {
458
+ Text ( " Hi " )
459
+ . onAppear {
460
+ Task { @MainActor in _ = model. count }
461
+ }
462
+ }
463
+ }
464
+ self . render ( FeatureView ( ) )
465
+ try await Task . sleep ( for: . milliseconds( 100 ) )
466
+ }
467
+
468
+ func testAccessInOnAppearWithAsyncTask_Implicit( ) async throws {
469
+ @MainActor
470
+ struct FeatureView : View {
471
+ let model = Model ( )
472
+ var body : some View {
473
+ Text ( " Hi " )
474
+ . onAppear {
475
+ Task ( operation: self . perform)
476
+ }
477
+ }
478
+ @Sendable
479
+ func perform( ) async {
480
+ _ = model. count
481
+ }
482
+ }
483
+ self . render ( FeatureView ( ) )
484
+ try await Task . sleep ( for: . milliseconds( 100 ) )
485
+ }
486
+
487
+ func testAccessInTask( ) async throws {
488
+ @MainActor
489
+ struct FeatureView : View {
490
+ let model = Model ( )
491
+ var body : some View {
492
+ Text ( " Hi " )
493
+ . task { @MainActor in
494
+ _ = model. count
495
+ }
496
+ }
497
+ }
498
+ self . render ( FeatureView ( ) )
499
+ try await Task . sleep ( for: . milliseconds( 100 ) )
500
+ }
501
+
453
502
private func render( _ view: some View ) {
454
503
let image = ImageRenderer ( content: view) . cgImage
455
504
_ = image
You can’t perform that action at this time.
0 commit comments