Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions Sources/OpenSwiftUI/View/Configuration/ViewAlias.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,36 @@ protocol ViewAlias: PrimitiveView {
init()
}

// Audited for 6.5.4

extension ViewAlias {
nonisolated public static func _makeView(view: _GraphValue<Self>, inputs: _ViewInputs) -> _ViewOutputs {
var inputs = inputs
guard let source = inputs.popLast(SourceInput<Self>.self) else {
return .init()
}
inputs.base.resetCurrentStyleableView()
return source.formula.makeView(view: view, source: source, inputs: inputs)
}

nonisolated public static func _makeViewList(view: _GraphValue<Self>, inputs: _ViewListInputs) -> _ViewListOutputs {
var inputs = inputs
guard let source = inputs.base.popLast(SourceInput<Self>.self) else {
return .emptyViewList(inputs: inputs)
}
inputs.base.resetCurrentStyleableView()
return source.formula.makeViewList(view: view, source: source, inputs: inputs)
}

nonisolated public static func _viewListCount(inputs: _ViewListCountInputs) -> Int? {
var inputs = inputs
guard let source = inputs.popLast(SourceInput<Self>.self) else {
return 0
}
return source.formula.viewListCount(source: source, inputs: inputs)
}
}

// MARK: - View + ViewAlias Extension

extension View {
Expand Down
80 changes: 80 additions & 0 deletions Tests/OpenSwiftUITests/View/Configuration/ViewAliasTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
//
// ViewAliasTests.swift
// OpenSwiftUITests

import Foundation
import Testing
@testable import OpenSwiftUI
@_spi(ForOpenSwiftUIOnly)
import OpenSwiftUICore
import OpenSwiftUITestsSupport

@MainActor
struct ViewAliasTests {
#if canImport(Darwin)
@Test
func optionalViewAliasDynamicProperty() async throws {
struct ContentView: View {
var confirmation: Confirmation?

@OptionalViewAlias
private var alias: ChildView.Alias?

var body: some View {
ChildView(confirmation: confirmation)
.viewAlias(ChildView.Alias.self) { Color.red }
.onAppear {
#expect(alias == nil)
confirmation?()
}
}
}

struct ChildView: View {
var confirmation: Confirmation?

struct Alias: ViewAlias {}

@OptionalViewAlias
private var alias: Alias?

var body: some View {
Alias()
.onAppear {
#expect(alias != nil)
confirmation?()
}
}
}
try await triggerLayoutWithWindow(expectedCount: 2) { confirmation in
PlatformHostingController(
rootView: ContentView(
confirmation: confirmation
)
)
}

// DisplayList expectation
let graph = ViewGraph(
rootViewType: ContentView.self,
requestedOutputs: [.displayList]
)
graph.instantiateOutputs()
graph.setRootView(ContentView())
graph.setProposedSize(CGSize(width: 100, height: 100))
let (displayList, _) = graph.displayList()
print(displayList.description)
let expectRegex = try! Regex(#"""
\(display-list
\(item #:identity \d+ #:version \d+
\(frame \([^)]+\)\)
\(effect
\(item #:identity \d+ #:version \d+
\(frame \([^)]+\)\)
\(content-seed \d+\)
\(color #[0-9A-F]{8}\)\)\)\)\)
"""#)
#expect(displayList.description.contains(expectRegex))
}
#endif
}
39 changes: 0 additions & 39 deletions Tests/OpenSwiftUITests/View/ViewAliasTests.swift

This file was deleted.