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
72 changes: 31 additions & 41 deletions Sources/OpenSwiftUICore/Data/Preference/PreferenceBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ package final class PreferenceBridge {
private var bridgedPreferences: [BridgedPreference] = []

struct BridgedPreference {
var key: AnyPreferenceKey.Type
var key: any PreferenceKey.Type
var combiner: AnyWeakAttribute
}

Expand Down Expand Up @@ -55,20 +55,20 @@ package final class PreferenceBridge {
package func wrapOutputs(_ outputs: inout PreferencesOutputs, inputs: _ViewInputs) {
bridgedViewInputs = inputs.customInputs
for key in inputs.preferences.keys {
if key == _AnyPreferenceKey<HostPreferencesKey>.self {
if key == HostPreferencesKey.self {
let combiner = Attribute(
HostPreferencesCombiner(
keys: inputs.preferences.hostKeys,
values: Attribute(identifier: outputs[anyKey: _AnyPreferenceKey<HostPreferencesKey>.self] ?? .nil)
values: outputs[HostPreferencesKey.self]
)
)
outputs[anyKey: key] = combiner.identifier
outputs[HostPreferencesKey.self] = combiner
_hostPreferenceKeys = WeakAttribute(inputs.preferences.hostKeys)
_hostPreferencesCombiner = WeakAttribute(combiner)
} else {
struct MakeCombiner: PreferenceKeyVisitor {
var result: AnyAttribute?

mutating func visit<K>(key: K.Type) where K : PreferenceKey {
let combiner = PreferenceCombiner<K>(attributes: [])
result = Attribute(combiner).identifier
Expand Down Expand Up @@ -111,53 +111,43 @@ package final class PreferenceBridge {
}
}

package func addValue(_ src: AnyAttribute, for key: any AnyPreferenceKey.Type) {
struct AddValue: PreferenceKeyVisitor {
var combiner: AnyAttribute
var value: AnyAttribute
func visit<Key: PreferenceKey>(key _: Key.Type) {
combiner.mutateBody(
as: PreferenceCombiner<Key>.self,
invalidating: true
) { combiner in
combiner.attributes.append(WeakAttribute(base: AnyWeakAttribute(value)))
}
}
}
package func addValue(_ src: AnyAttribute, for key: any PreferenceKey.Type) {
guard let viewGraph,
let bridgedPreference = bridgedPreferences.first(where: { $0.key == key }),
let combiner = bridgedPreference.combiner.attribute
else { return }
var visitor = AddValue(combiner: combiner, value: src)
key.visitKey(&visitor)
func project<K>(_ key: K.Type) where K: PreferenceKey {
combiner.mutateBody(
as: PreferenceCombiner<K>.self,
invalidating: true
) { combiner in
combiner.attributes.append(WeakAttribute(base: AnyWeakAttribute(src)))
}
}
project(key)
viewGraph.graphInvalidation(from: src)
}

package func removeValue(_ src: AnyAttribute, for key: any AnyPreferenceKey.Type, isInvalidating: Bool = false) {
struct RemoveValue: PreferenceKeyVisitor {
var combiner: AnyAttribute
var value: AnyAttribute
var changed = false
mutating func visit<Key: PreferenceKey>(key _: Key.Type) {
combiner.mutateBody(
as: PreferenceCombiner<Key>.self,
invalidating: true
) { combiner in
guard let index = combiner.attributes.firstIndex(where: { $0.attribute?.identifier == value }) else {
return
}
combiner.attributes.remove(at: index)
changed = true
}
}
}
package func removeValue(_ src: AnyAttribute, for key: any PreferenceKey.Type, isInvalidating: Bool = false) {
guard let viewGraph,
let bridgedPreference = bridgedPreferences.first(where: { $0.key == key }),
let combiner = bridgedPreference.combiner.attribute
else { return }
var visitor = RemoveValue(combiner: combiner, value: src)
key.visitKey(&visitor)
if visitor.changed {
var changed = false
func project<K>(_ key: K.Type) where K: PreferenceKey {
combiner.mutateBody(
as: PreferenceCombiner<K>.self,
invalidating: true
) { combiner in
guard let index = combiner.attributes.firstIndex(where: { $0.attribute?.identifier == src }) else {
return
}
combiner.attributes.remove(at: index)
changed = true
}
}
project(key)
if changed {
viewGraph.graphInvalidation(from: isInvalidating ? nil : src)
}
}
Expand Down
48 changes: 11 additions & 37 deletions Sources/OpenSwiftUICore/Data/Preference/PreferenceKey.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,10 @@ extension PreferenceKey {
return name
}
}
}

// MARK: - AnyPreferenceKey

package protocol AnyPreferenceKey {
static var valueType: any Any.Type { get }
static func visitKey<V>(_ v: inout V) where V: PreferenceKeyVisitor
package static func visitKey<Visitor>(_ visitor: inout Visitor) where Visitor: PreferenceKeyVisitor {
visitor.visit(key: Self.self)
}
}

// MARK: - PreferenceKeyVisitor
Expand All @@ -88,57 +85,34 @@ package protocol PreferenceKeyVisitor {
mutating func visit<K>(key: K.Type) where K: PreferenceKey
}

// MARK: - _AnyPreferenceKey

package struct _AnyPreferenceKey<K>: AnyPreferenceKey where K: PreferenceKey{
package static var valueType: any Any.Type { K.self }

package static func visitKey<V>(_ v: inout V) where V : PreferenceKeyVisitor {
v.visit(key: K.self)
}
}

// MARK: - PreferenceKeys
// MARK: - PreferenceKeys [6.5.4]

package struct PreferenceKeys: Equatable, RandomAccessCollection, MutableCollection {
var keys: [any AnyPreferenceKey.Type] = []
var keys: [any PreferenceKey.Type] = []

@inlinable
package init() {}

@inlinable
package var isEmpty: Bool { keys.isEmpty }

@inlinable
package func contains(_ key: any AnyPreferenceKey.Type) -> Bool {
package func contains(_ key: any PreferenceKey.Type) -> Bool {
keys.contains { $0 == key }
}

@inlinable
package func contains<K>(_ key: K.Type) -> Bool where K: PreferenceKey {
contains(_AnyPreferenceKey<K>.self)
}

package mutating func add(_ key: any AnyPreferenceKey.Type) {
package mutating func add(_ key: any PreferenceKey.Type) {
guard !contains(key) else {
return
}
keys.append(key)
}

package mutating func add<K>(_ key: K.Type) where K: PreferenceKey {
add(_AnyPreferenceKey<K>.self)
}

package mutating func remove(_ key: AnyPreferenceKey.Type) {

package mutating func remove(_ key: any PreferenceKey.Type) {
guard let index = keys.firstIndex(where: { $0 == key }) else { return }
keys.remove(at: index)
}

package mutating func remove<K>(_ key: K.Type) where K: PreferenceKey {
remove(_AnyPreferenceKey<K>.self)
}

package static func == (lhs: PreferenceKeys, rhs: PreferenceKeys) -> Bool {
guard lhs.keys.count == rhs.keys.count else {
return false
Expand All @@ -158,7 +132,7 @@ package struct PreferenceKeys: Equatable, RandomAccessCollection, MutableCollect
package var endIndex: Int { keys.endIndex }

@inlinable
package subscript(position: Int) -> AnyPreferenceKey.Type {
package subscript(position: Int) -> any PreferenceKey.Type {
get { keys[position] }
set { keys[position] = newValue }
}
Expand Down
41 changes: 21 additions & 20 deletions Sources/OpenSwiftUICore/Data/Preference/PreferencesOutputs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
// PreferencesOutputs.swift
// OpenSwiftUICore
//
// Audited for iOS 18.0
// Status: Complete
// ID: 639FD567E11A491423DEEA5A95A52B4C (SwiftUICore)

package import OpenGraphShims

// MARK: - PreferencesOutputs [6.5.4]

package struct PreferencesOutputs {
private var preferences: [KeyValue]
package var debugProperties: _ViewDebug.Properties
Expand All @@ -17,13 +19,19 @@ package struct PreferencesOutputs {
debugProperties = []
}

subscript(anyKey key: AnyPreferenceKey.Type) -> AnyAttribute? {
get { preferences.first { $0.key == key }?.value }
set {
if key == _AnyPreferenceKey<DisplayList.Key>.self {
if !debugProperties.contains(.displayList) {
debugProperties.formUnion(.displayList)
subscript(anyKey key: any PreferenceKey.Type) -> AnyAttribute? {
get {
for preference in preferences {
guard preference.key == key else {
continue
}
return preference.value
}
return nil
}
set {
if key == DisplayList.Key.self {
debugProperties.insert(.displayList)
}
if let index = preferences.firstIndex(where: { $0.key == key }) {
if let newValue {
Expand All @@ -41,19 +49,19 @@ package struct PreferencesOutputs {

subscript<K>(key: K.Type) -> Attribute<K.Value>? where K: PreferenceKey {
get {
let value = self[anyKey: _AnyPreferenceKey<K>.self]
let value = self[anyKey: key]
return value.map { Attribute(identifier: $0) }
}
set {
self[anyKey: _AnyPreferenceKey<K>.self] = newValue.map { $0.identifier }
self[anyKey: key] = newValue.map { $0.identifier }
}
}

package mutating func appendPreference<K>(key: K.Type, value: Attribute<K.Value>) where K: PreferenceKey{
preferences.append(KeyValue(key: _AnyPreferenceKey<K>.self, value: value.identifier))
preferences.append(KeyValue(key: key, value: value.identifier))
}

package func forEachPreference(_ body: (any AnyPreferenceKey.Type, AnyAttribute) -> Void) {
package func forEachPreference(_ body: (any PreferenceKey.Type, AnyAttribute) -> Void) {
preferences.forEach { body($0.key, $0.value) }
}

Expand All @@ -72,22 +80,15 @@ package struct PreferencesOutputs {
}

package func detachIndirectOutputs() {
struct ResetPreference: PreferenceKeyVisitor {
var destination: AnyAttribute
func visit<K>(key: K.Type) where K: PreferenceKey {
destination.source = .nil
}
}
for keyValue in preferences {
var visitor = ResetPreference(destination: keyValue.value)
keyValue.key.visitKey(&visitor)
keyValue.value.source = .nil
}
}
}

extension PreferencesOutputs {
private struct KeyValue {
var key: any AnyPreferenceKey.Type
var key: any PreferenceKey.Type
var value: AnyAttribute
}
}
4 changes: 2 additions & 2 deletions Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ public struct _GestureOutputs<Value> {
preconditionFailure("TODO")
}

package subscript(anyKey key: any AnyPreferenceKey.Type) -> AnyAttribute? {
package subscript(anyKey key: any PreferenceKey.Type) -> AnyAttribute? {
get { preconditionFailure("TODO") }
set { preconditionFailure("TODO") }
}
Expand All @@ -283,7 +283,7 @@ public struct _GestureOutputs<Value> {
preconditionFailure("TODO")
}

package func forEachPreference(_ body: (any AnyPreferenceKey.Type, AnyAttribute) -> Void) {
package func forEachPreference(_ body: (any PreferenceKey.Type, AnyAttribute) -> Void) {
preconditionFailure("TODO")
}
}
Expand Down
57 changes: 0 additions & 57 deletions Sources/OpenSwiftUICore/Util/Data/VersionSeedTracker.swift

This file was deleted.

2 changes: 1 addition & 1 deletion Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ package final class ViewGraph: GraphHost {
set { setPreferenceBridge(to: newValue) }
}

var bridgedPreferences: [(AnyPreferenceKey.Type, AnyAttribute)] = []
var bridgedPreferences: [(any PreferenceKey.Type, AnyAttribute)] = []

package static var current: ViewGraph { GraphHost.currentHost as! ViewGraph }

Expand Down
4 changes: 2 additions & 2 deletions Sources/OpenSwiftUICore/View/Input/ViewOutputs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public struct _ViewOutputs {
_layoutComputer = OptionalAttribute()
}

package subscript(anyKey key: any AnyPreferenceKey.Type) -> AnyAttribute? {
package subscript(anyKey key: any PreferenceKey.Type) -> AnyAttribute? {
get { preferences[anyKey: key] }
set { preferences[anyKey: key] = newValue }
}
Expand All @@ -42,7 +42,7 @@ public struct _ViewOutputs {
preferences.appendPreference(key: key, value: value)
}

package func forEachPreference(_ body: (any AnyPreferenceKey.Type, AnyAttribute) -> Void) {
package func forEachPreference(_ body: (any PreferenceKey.Type, AnyAttribute) -> Void) {
preferences.forEachPreference(body)
}
}
Expand Down