Skip to content

Commit 3f405bf

Browse files
authored
Refactor AnyView init fromValue implementation (#73)
* Refactor AnyView init fromValue implementation * Optimize test case
1 parent 2b39e17 commit 3f405bf

File tree

9 files changed

+30
-59
lines changed

9 files changed

+30
-59
lines changed

Sources/COpenSwiftUI/ProtocolDescriptor.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,3 @@ const void *$s11OpenSwiftUI12ViewModifierMp;
2323
const void *_OpenSwiftUI_viewModifierProtocolDescriptor(void) {
2424
return &$s11OpenSwiftUI12ViewModifierMp;
2525
}
26-
27-
void _OpenSwiftUI_callVisitViewType1(void *visitor_value,
28-
const void *view_type,
29-
const void *view_pwt) {
30-
_OpenSwiftUI_callVisitViewType2(visitor_value, view_type, view_type, view_pwt);
31-
}
32-
33-
OPENSWIFTUI_EXPORT
34-
void _OpenSwiftUI_callVisitViewType2(void *visitor_value,
35-
const void *view_type,
36-
const void *view_type2,
37-
const void *view_pwt) {
38-
_OpenSwiftUI_callVisitViewType(visitor_value, view_type, view_type2, view_pwt);
39-
}

Sources/COpenSwiftUI/include/ProtocolDescriptor.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,6 @@ const void *_OpenSwiftUI_viewProtocolDescriptor(void);
1818
OPENSWIFTUI_EXPORT
1919
const void *_OpenSwiftUI_viewModifierProtocolDescriptor(void);
2020

21-
OPENSWIFTUI_EXPORT
22-
void _OpenSwiftUI_callVisitViewType1(void *visitor_value,
23-
const void *view_type,
24-
const void *view_pwt);
25-
26-
OPENSWIFTUI_EXPORT
27-
void _OpenSwiftUI_callVisitViewType2(void *visitor_value,
28-
const void *view_type,
29-
const void *view_type2,
30-
const void *view_pwt);
31-
3221
OPENSWIFTUI_ASSUME_NONNULL_END
3322

3423
#endif /* ProtocolDescriptor_h */

Sources/OpenSwiftUI/Core/Runtime/ProtocolDescriptor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ struct TupleTypeDescription<PD: ProtocolDescriptor> {
4242
contentTypes = tupleType.indices.compactMap { index in
4343
let type = tupleType.type(at: index)
4444
guard let comformance = TypeConformance<PD>(type) else {
45-
print("Ignoring invalid type, type \(type) at index \(index)")
45+
print("Ignoring invalid type at index \(index), type \(type)")
4646
return nil
4747
}
4848
return (index, comformance)

Sources/OpenSwiftUI/View/View/AnyView.swift

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,13 @@ public struct AnyView: PrimitiveView {
3434
guard let conformace = TypeConformance<ViewDescriptor>(type(of: value)) else {
3535
return nil
3636
}
37-
// FIXME: pass a structure like the following to _OpenSwiftUI_callVisitViewType1 and remove _OpenSwiftUI_callVisitViewType
38-
// x0 = pointer
39-
// x1 = View.self
40-
// x2 = PWT V: View.self
41-
// pointer+0x0 -> pointer+0x18
42-
// pointer+0x8 -> Visitor.self
43-
// pointer+0x10 -> PWT Visitor: ViewTypeVisitor
44-
// pointer+0x18~0x37 -> visitor.value
45-
// pointer+0x38 -> visitor.view
46-
var visitor: any ViewTypeVisitor = Visitor(value: value)
47-
withUnsafeMutablePointer(to: &visitor) { value in
48-
_OpenSwiftUI_callVisitViewType1(value, conformace.metadata, conformace.conformance)
37+
// Audited for RELEASE_2023
38+
var visitor = Visitor(value: value)
39+
withUnsafePointer(to: conformace) { pointer in
40+
let type = UnsafeRawPointer(pointer).assumingMemoryBound(to: (any View.Type).self)
41+
visitor.visit(type: type.pointee)
4942
}
50-
self = (visitor as! Visitor).view!
43+
self = visitor.view!
5144
}
5245

5346
init<V: View>(_ view: V, id: UniqueID?) {
@@ -243,12 +236,3 @@ private struct AnyViewChildList<V: View> {
243236
@Attribute var view: AnyView
244237
var id: UniqueID?
245238
}
246-
247-
@_silgen_name("_OpenSwiftUI_callVisitViewType1")
248-
func visitViewType(_ visitor: UnsafeMutablePointer<any ViewTypeVisitor>, type: UnsafeRawPointer, pwt: UnsafeRawPointer)
249-
250-
// Called by _OpenSwiftUI_callVisitViewType2 as a temporary workaround implementation
251-
@_silgen_name("_OpenSwiftUI_callVisitViewType")
252-
func visit<V: View>(_ visitor: UnsafeMutablePointer<any ViewTypeVisitor>, type: V.Type) {
253-
visitor.pointee.visit(type: V.self)
254-
}

Tests/OpenSwiftUITests/View/Graphic/AngleTests.swift renamed to Tests/OpenSwiftUICompatibilityTests/View/Graphic/AngleTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// Created by Kyle on 2023/12/17.
66
//
77

8-
import OpenSwiftUI
98
import Testing
109

1110
struct AngleTests {

Tests/OpenSwiftUITests/View/Graphic/AxisTests.swift renamed to Tests/OpenSwiftUICompatibilityTests/View/Graphic/AxisTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
// Created by Kyle on 2023/12/17.
66
//
77

8-
import OpenSwiftUI
98
import Testing
109

1110
struct AxisTests {

Tests/OpenSwiftUITests/View/Control/Slider/SliderTests.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
//
22
// SliderTests.swift
3-
//
4-
//
5-
// Created by Kyle on 2023/12/16.
6-
//
3+
// OpenSwiftUITests
74

8-
import Testing
95
@testable import OpenSwiftUI
6+
import Testing
107

118
struct SliderTests {
129
@Test

Tests/OpenSwiftUITests/View/Core/InterfaceIdiomTests.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
//
22
// InterfaceIdiomTests.swift
3-
//
4-
//
5-
// Created by Kyle on 2023/8/30.
6-
//
3+
// OpenSwiftUITests
74

85
@testable import OpenSwiftUI
96
import Testing
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// AnyViewTests.swift
3+
// OpenSwiftUITests
4+
5+
@testable import OpenSwiftUI
6+
import Testing
7+
8+
struct AnyViewTests {
9+
@Test
10+
func testInitFromValue() throws {
11+
let empty = EmptyView()
12+
let any = try #require(AnyView(_fromValue: empty))
13+
#expect(any.storage.id == nil)
14+
let _: EmptyView = any.storage.child()
15+
16+
let any1 = AnyView(any)
17+
let any2 = try #require(AnyView(_fromValue: any))
18+
#expect(any1.storage === any2.storage)
19+
}
20+
}

0 commit comments

Comments
 (0)