From b4208703dba7889b794389a4ca0dda2f728a1e5f Mon Sep 17 00:00:00 2001 From: Kyle Date: Sat, 6 Sep 2025 22:27:48 +0800 Subject: [PATCH] Mics fix for EmptyView and TupleView - Fix TupleView._makeViewList to use makeList.inputs instead of original inputs parameter in concat calls - Update EmptyView._viewListCount to respect .isNonEmptyParent option - Add unit tests for EmptyView._viewListCount --- Sources/OpenSwiftUICore/View/EmptyView.swift | 2 +- Sources/OpenSwiftUICore/View/TupleView.swift | 23 ++++++++++--------- .../View/EmptyViewTests.swift | 20 ++++++++++++++++ 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 Tests/OpenSwiftUICoreTests/View/EmptyViewTests.swift diff --git a/Sources/OpenSwiftUICore/View/EmptyView.swift b/Sources/OpenSwiftUICore/View/EmptyView.swift index e0a6190b0..68914d9b9 100644 --- a/Sources/OpenSwiftUICore/View/EmptyView.swift +++ b/Sources/OpenSwiftUICore/View/EmptyView.swift @@ -42,6 +42,6 @@ public struct EmptyView: PrimitiveView { @available(OpenSwiftUI_v2_0, *) nonisolated public static func _viewListCount(inputs: _ViewListCountInputs) -> Int? { - 0 + inputs.options.contains(.isNonEmptyParent) ? 1 : 0 } } diff --git a/Sources/OpenSwiftUICore/View/TupleView.swift b/Sources/OpenSwiftUICore/View/TupleView.swift index 660d3b2c3..ed3c54385 100644 --- a/Sources/OpenSwiftUICore/View/TupleView.swift +++ b/Sources/OpenSwiftUICore/View/TupleView.swift @@ -2,13 +2,14 @@ // TupleView.swift // OpenSwiftUICore // +// Audited for 6.5.4 // Status: Complete // ID: 79611CB2B7848ECB3D9EC1F26B13F28F (SwiftUI) // ID: DE681AB5F1A334FA14ECABDE70CB1955 (SwiftUICore) import OpenAttributeGraphShims -// MARK: - TupleView [6.4.41] +// MARK: - TupleView /// A View created from a swift tuple of View values. @available(OpenSwiftUI_v1_0, *) @@ -45,21 +46,21 @@ public struct TupleView: PrimitiveView, View { var makeList = MakeList( view: view, inputs: inputs, - index: 0, - offset: 0, - wrapChildren: inputs.options.contains(.tupleViewCreatesUnaryElements), - outputs: [] + wrapChildren: inputs.options.contains(.tupleViewCreatesUnaryElements) ) if inputs.options.contains(.tupleViewCreatesUnaryElements), makeList.inputs.options.contains(.tupleViewCreatesUnaryElements) { makeList.inputs.options.subtract([.requiresSections, .tupleViewCreatesUnaryElements]) } + guard !contentTypes.isEmpty else { + return _ViewListOutputs.concat([], inputs: makeList.inputs) + } for (index, conformance) in contentTypes { makeList.index = index makeList.offset = tupleType.elementOffset(at: index) conformance.visitType(visitor: &makeList) } - return _ViewListOutputs.concat(makeList.outputs, inputs: inputs) + return _ViewListOutputs.concat(makeList.outputs, inputs: makeList.inputs) } @available(OpenSwiftUI_v2_0, *) @@ -70,7 +71,7 @@ public struct TupleView: PrimitiveView, View { if inputs.options.contains(.tupleViewCreatesUnaryElements) { return contentTypes.count } else { - var countViews = CountViews(inputs: inputs, result: 0) + var countViews = CountViews(inputs: inputs) for contentType in contentTypes { contentType.1.visitType(visitor: &countViews) } @@ -94,10 +95,10 @@ public struct TupleView: PrimitiveView, View { private struct MakeList: ViewTypeVisitor { var view: _GraphValue> var inputs: _ViewListInputs - var index: Int - var offset: Int + var index: Int = .zero + var offset: Int = .zero let wrapChildren: Bool - var outputs: [_ViewListOutputs] + var outputs: [_ViewListOutputs] = [] mutating func visit(type: V.Type) where V : View { inputs.base.pushStableIndex(index) @@ -114,7 +115,7 @@ public struct TupleView: PrimitiveView, View { private struct CountViews: ViewTypeVisitor { var inputs: _ViewListCountInputs - var result: Int? + var result: Int? = .zero mutating func visit(type: V.Type) where V : View { guard let oldResult = result, diff --git a/Tests/OpenSwiftUICoreTests/View/EmptyViewTests.swift b/Tests/OpenSwiftUICoreTests/View/EmptyViewTests.swift new file mode 100644 index 000000000..b6e621fdf --- /dev/null +++ b/Tests/OpenSwiftUICoreTests/View/EmptyViewTests.swift @@ -0,0 +1,20 @@ +// +// EmptyViewTests.swift +// OpenSwiftUICoreTests + +@_spi(ForOpenSwiftUIOnly) +import OpenSwiftUICore +import Testing + +struct EmptyViewTests { + @Test("Test EmptyView._viewListCount with various options") + func viewListCount() { + let base = _ViewListCountInputs(.init(.invalid)) + var inputs = base + inputs.options = [] + #expect(EmptyView._viewListCount(inputs: inputs) == 0) + + inputs.options = [.isNonEmptyParent] + #expect(EmptyView._viewListCount(inputs: inputs) == 1) + } +}