Skip to content

Commit

Permalink
Update VariadicView
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyle-Ye committed Aug 28, 2024
1 parent 0f91969 commit ff704e4
Show file tree
Hide file tree
Showing 12 changed files with 230 additions and 61 deletions.
4 changes: 2 additions & 2 deletions Sources/OpenSwiftUI/Core/View/ConditionalContent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ extension _ConditionalContent: View, PrimitiveView where TrueContent: View, Fals

public static func _makeView(view: _GraphValue<Self>, inputs: _ViewInputs) -> _ViewOutputs {
if _SemanticFeature_v2.isEnable {
return makeImplicitRoot(view: view, inputs: inputs)
makeImplicitRoot(view: view, inputs: inputs)
} else {
return AnyView._makeView(
AnyView._makeView(
view: _GraphValue(ChildView(content: view.value)),
inputs: inputs
)
Expand Down
49 changes: 49 additions & 0 deletions Sources/OpenSwiftUI/Core/View/VariadicView/VariadicView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/// A type of structured content that is passed as an argument to a
/// `Root`'s result builder, creating a `Tree` that conditionally conforms
/// to protocols like `View`.
///
/// For example, `View`s can be passed to a `Layout` result builder
/// creating a `View`:
///
/// HStack {
/// Image(name: "envelope")
/// Text("Your time away request has been approved")
/// Spacer()
/// Text(timestamp, format: .dateTime).layoutPriority(1)
/// }
///
public enum _VariadicView {
public typealias Root = _VariadicView_Root
public typealias ViewRoot = _VariadicView_ViewRoot
public typealias Children = _VariadicView_Children
// public typealias UnaryViewRoot = _VariadicView_UnaryViewRoot
// public typealias MultiViewRoot = _VariadicView_MultiViewRoot

@frozen
public struct Tree<Root: _VariadicView_Root, Content> {
public var root: Root
public var content: Content
@inlinable
init(root: Root, content: Content) {
self.root = root
self.content = content
}

@inlinable public init(_ root: Root, @ViewBuilder content: () -> Content) {
self.root = root
self.content = content()
}
}
}

extension _VariadicView_ViewRoot {
func bodyError() -> Never {
fatalError("body() should not be called on \(Self.self)")
}
}

extension _VariadicView_ViewRoot where Body == Never {
public func body(children: _VariadicView.Children) -> Never {
bodyError()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// TODO

/// An ad hoc collection of the children of a variadic view.
public struct _VariadicView_Children {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// VariadicView_ImplicitRoot.swift
// OpenSwiftUI
//
// Audited for RELEASE_2021
// Status: Complete

protocol _VariadicView_AnyImplicitRoot {
func visitType<Visitor: _VariadicView_ImplicitRootVisitor>(visitor: inout Visitor)
}

protocol _VariadicView_ImplicitRootVisitor {
func visit<Root: _VariadicView_ImplicitRoot>(type: Root.Type)
}

protocol _VariadicView_ImplicitRoot: _VariadicView_AnyImplicitRoot, _VariadicView_ViewRoot {
static var implicitRoot: Self { get }
}

extension _VariadicView_ImplicitRoot {
func visitType<Visitor: _VariadicView_ImplicitRootVisitor>(visitor: inout Visitor) {
visitor.visit(type: Self.self)
}
}
26 changes: 26 additions & 0 deletions Sources/OpenSwiftUI/Core/View/VariadicView/VariadicView_Root.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// VariadicView_ImplicitRoot.swift
// OpenSwiftUI
//
// Audited for RELEASE_2021
// Status: Complete

/// A type that creates a `Tree`, managing content subtrees passed to a result builder.
///
/// - SeeAlso: _VariadicView.Root.
public protocol _VariadicView_Root {
static var _viewListOptions: Int { get }
}

extension _VariadicView_Root {
public static var _viewListOptions: Int {
0
}

public static func _viewListCount(
inputs _: _ViewListCountInputs,
body _: (_ViewListCountInputs) -> Int?
) -> Int? {
nil
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
//
// VariadicView_ImplicitRoot.swift
// OpenSwiftUI
//
// Audited for RELEASE_2021
// Status: WIP

internal import OpenGraphShims

/// A type of root that creates a `View` when its result builder is invoked with
/// `View`.
/// - SeeAlso: _VariadicView.ViewRoot.
/// - Note: Requirements mirror `View`'s.
public protocol _VariadicView_ViewRoot: _VariadicView_Root {
associatedtype Body: View

static func _makeView(
root: _GraphValue<Self>,
inputs: _ViewInputs,
body: (_Graph, _ViewInputs) -> _ViewListOutputs
) -> _ViewOutputs

static func _makeViewList(
root: _GraphValue<Self>,
inputs: _ViewListInputs,
body: @escaping (_Graph, _ViewListInputs) -> _ViewListOutputs
) -> _ViewListOutputs

static func _viewListCount(
inputs: _ViewListCountInputs,
body: (_ViewListCountInputs) -> Int?
) -> Int?

@ViewBuilder
func body(children: _VariadicView.Children) -> Body
}

extension _VariadicView_ViewRoot {
public static func _makeView(
root: _GraphValue<Self>,
inputs: _ViewInputs,
body: (_Graph, _ViewInputs) -> _ViewListOutputs
) -> _ViewOutputs {
fatalError("TODO")
}

public static func _makeViewList(
root: _GraphValue<Self>,
inputs: _ViewListInputs,
body: @escaping (_Graph, _ViewListInputs) -> _ViewListOutputs
) -> _ViewListOutputs {
fatalError("TODO")
}

public static func _viewListCount(inputs: _ViewListCountInputs) -> Int? {
Body._viewListCount(inputs: inputs)
}
}


// MARK: - ViewRootBody

private struct ViewRootBody<Root> {
@Attribute var root: Root
@Attribute var list: ViewList
let contentSubgraph: OGSubgraph
}

extension _ViewInputs {
private struct ImplicitRootType: ViewInput {
static let defaultValue: _VariadicView_AnyImplicitRoot.Type = _VStackLayout.self
}
}

extension View {
static func makeImplicitRoot(view: _GraphValue<Self>, inputs: _ViewInputs) -> _ViewOutputs {
// TODO
return .init()
}
}

// TODO: ViewModifier
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

/// Input values to `View._viewListCount()`.
public struct _ViewListCountInputs {
var customInputs : PropertyList
var options : _ViewListInputs.Options
var baseOptions : _GraphInputs.Options
var customInputs: PropertyList
var options: _ViewListInputs.Options
var baseOptions: _GraphInputs.Options

subscript<Input: GraphInput>(_ type: Input.Type) -> Input.Value {
get { customInputs[type] }
Expand Down
6 changes: 0 additions & 6 deletions Sources/OpenSwiftUI/Core/View/ViewRoot.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,3 @@
// Status: WIP
// ID: 00F12C0E37A19C593ECA0DBD3BE26541

extension View {
static func makeImplicitRoot(view: _GraphValue<Self>, inputs: _ViewInputs) -> _ViewOutputs {
// TODO
return .init()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Foundation

@frozen
public struct _HStackLayout {
public var alignment: VerticalAlignment
public var spacing: CGFloat?

@inlinable
public init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil) {
self.alignment = alignment
self.spacing = spacing
}

public typealias AnimatableData = EmptyAnimatableData
public typealias Body = Swift.Never
}

@frozen
public struct _VStackLayout {
public var alignment: HorizontalAlignment
public var spacing: CGFloat?

@inlinable
public init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil) {
self.alignment = alignment
self.spacing = spacing
}

public typealias AnimatableData = EmptyAnimatableData
public typealias Body = Swift.Never
}

extension _HStackLayout: _VariadicView_ImplicitRoot {
static var implicitRoot: _HStackLayout { _HStackLayout() }
}
extension _VStackLayout: _VariadicView_ImplicitRoot {
static var implicitRoot: _VStackLayout { _VStackLayout() }
}

This file was deleted.

34 changes: 0 additions & 34 deletions Sources/OpenSwiftUI/View/View/_VariadicView.swift

This file was deleted.

0 comments on commit ff704e4

Please sign in to comment.