Skip to content

Commit 3034c2c

Browse files
committed
Updates for compatibility with Swift 6.2 and Xcode 26
1 parent f17b76b commit 3034c2c

File tree

11 files changed

+95
-34
lines changed

11 files changed

+95
-34
lines changed

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version: 6.0
1+
// swift-tools-version: 6.2
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription
@@ -29,7 +29,7 @@ let package = Package(
2929

3030
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"),
3131

32-
.package(url: "https://github.com/swiftlang/swift-syntax.git", from: "600.0.1"),
32+
.package(url: "https://github.com/swiftlang/swift-syntax.git", from: "601.0.1"),
3333
],
3434
targets: [
3535
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//
2+
// AttributedTextFormattingDefinition.swift
3+
// LiveViewNative
4+
//
5+
// Created by Carson Katri on 6/10/25.
6+
//

Sources/LiveViewNative/Stylesheets/ResolvableTypes/SwiftUI/NamedCoordinateSpace.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,14 @@ public extension NamedCoordinateSpace.Resolvable {
4646
}
4747
}
4848
}
49+
50+
enum StylesheetResolvableCoordinateSpaceProtocol: StylesheetResolvable, AttributeDecodable, @preconcurrency Decodable {
51+
case local
52+
53+
@MainActor func resolve<R: RootRegistry>(on element: ElementNode, in context: LiveContext<R>) -> CoordinateSpace {
54+
switch self {
55+
case .local:
56+
return .local
57+
}
58+
}
59+
}

Sources/LiveViewNative/Stylesheets/ResolvableTypes/SwiftUI/Styles/ShapeStyle.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,3 +621,21 @@ extension ShadowStyle {
621621
}
622622
}
623623
}
624+
625+
@available(iOS 26.0, *)
626+
extension Color.ResolvedHDR {
627+
public enum Resolvable: StylesheetResolvable, @preconcurrency Decodable {
628+
case __constant(SwiftUI.Color.ResolvedHDR)
629+
630+
public init(from decoder: any Decoder) throws {
631+
fatalError()
632+
}
633+
634+
public func resolve<R>(on element: ElementNode, in context: LiveContext<R>) -> Color.ResolvedHDR where R : RootRegistry {
635+
switch self {
636+
case let .__constant(resolvedHDR):
637+
return resolvedHDR
638+
}
639+
}
640+
}
641+
}

Sources/LiveViewNative/Views/Toolbars/ToolbarItem.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import LiveViewNativeCore
6666
struct ToolbarItem<Root: RootRegistry>: ToolbarContent {
6767
/// The position of this item in the toolbar.
6868
@_documentation(visibility: public)
69-
private var placement: ToolbarItemPlacement = .automatic
69+
private var placement: _ToolbarItemPlacement = .automatic
7070

7171
init(element: ElementNode) {
7272
self._liveElement = .init(element: element)
@@ -83,7 +83,7 @@ struct ToolbarItem<Root: RootRegistry>: ToolbarContent {
8383
@_documentation(visibility: public)
8484
@LiveElement
8585
struct CustomizableToolbarItem<Root: RootRegistry>: CustomizableToolbarContent {
86-
var placement: ToolbarItemPlacement = .automatic
86+
var placement: _ToolbarItemPlacement = .automatic
8787

8888
/// The unique ID for this customizable item.
8989
@_documentation(visibility: public)
@@ -131,7 +131,7 @@ struct CustomizableToolbarItem<Root: RootRegistry>: CustomizableToolbarContent {
131131

132132
/// The positioning of a toolbar item.
133133
@_documentation(visibility: public)
134-
enum ToolbarItemPlacement: String, AttributeDecodable {
134+
enum _ToolbarItemPlacement: String, AttributeDecodable {
135135
@_documentation(visibility: public)
136136
case automatic
137137
@_documentation(visibility: public)

Sources/LiveViewNative/Views/Toolbars/ToolbarItemGroup.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import SwiftUI
3232
struct ToolbarItemGroup<Root: RootRegistry>: ToolbarContent {
3333
/// The position of this group in the toolbar.
3434
@_documentation(visibility: public)
35-
private var placement: ToolbarItemPlacement = .automatic
35+
private var placement: _ToolbarItemPlacement = .automatic
3636

3737
init(element: ElementNode) {
3838
self._liveElement = .init(element: element)

Sources/ModifierGenerator/denylist.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,8 @@ let denylist = [
5151

5252
"touchBar",
5353

54-
"pageCommand"
54+
"pageCommand",
55+
56+
"attributedTextFormattingDefinition",
57+
"navigationSubtitle"
5558
]

Sources/ModifierGenerator/typeDenylist.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ let typeDenylist = [
33
"GraphicsContext",
44
"Foundation.AttributeScopes.SwiftUIAttributes",
55
"Edge.Set",
6+
"TextSelection.Indices",
7+
"AttributedTextSelection"
68
]

Sources/SwiftSyntaxExtensions/NormalizableDeclSyntax.swift

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ public extension NormalizableDeclSyntax {
6969
if let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
7070
switch requirement.requirement {
7171
case let .sameTypeRequirement(sameType):
72-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
72+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
73+
case let .type(rightType) = sameType.rightType
7374
else { return nil }
74-
return sameType.rightType
75+
return rightType
7576
case let .conformanceRequirement(conformance):
7677
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
7778
else { return nil }
@@ -99,9 +100,10 @@ public extension NormalizableDeclSyntax {
99100
if let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
100101
switch requirement.requirement {
101102
case let .sameTypeRequirement(sameType):
102-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
103+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
104+
case let .type(rightType) = sameType.rightType
103105
else { return nil }
104-
return sameType.rightType
106+
return rightType
105107
case let .conformanceRequirement(conformance):
106108
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
107109
else { return nil }
@@ -128,9 +130,10 @@ public extension NormalizableDeclSyntax {
128130
if let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
129131
switch requirement.requirement {
130132
case let .sameTypeRequirement(sameType):
131-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
133+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
134+
case let .type(rightType) = sameType.rightType
132135
else { return nil }
133-
return sameType.rightType
136+
return rightType
134137
case let .conformanceRequirement(conformance):
135138
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
136139
else { return nil }
@@ -158,9 +161,10 @@ public extension NormalizableDeclSyntax {
158161
if let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
159162
switch requirement.requirement {
160163
case let .sameTypeRequirement(sameType):
161-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
164+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
165+
case let .type(rightType) = sameType.rightType
162166
else { return nil }
163-
return sameType.rightType
167+
return rightType
164168
case let .conformanceRequirement(conformance):
165169
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
166170
else { return nil }
@@ -268,9 +272,10 @@ public extension NormalizableDeclSyntax {
268272
if let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
269273
switch requirement.requirement {
270274
case let .sameTypeRequirement(sameType):
271-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
275+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
276+
case let .type(rightType) = sameType.rightType
272277
else { return nil }
273-
return sameType.rightType
278+
return rightType
274279
case let .conformanceRequirement(conformance):
275280
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
276281
else { return nil }
@@ -304,9 +309,10 @@ public extension NormalizableDeclSyntax {
304309
let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
305310
switch requirement.requirement {
306311
case let .sameTypeRequirement(sameType):
307-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
312+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
313+
case let .type(rightType) = sameType.rightType
308314
else { return nil }
309-
return sameType.rightType
315+
return rightType
310316
case let .conformanceRequirement(conformance):
311317
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
312318
else { return nil }
@@ -340,9 +346,10 @@ public extension NormalizableDeclSyntax {
340346
let genericType = genericWhereClause?.requirements.lazy.compactMap({ requirement -> TypeSyntax? in
341347
switch requirement.requirement {
342348
case let .sameTypeRequirement(sameType):
343-
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
349+
guard sameType.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text,
350+
case let .type(rightType) = sameType.rightType
344351
else { return nil }
345-
return sameType.rightType
352+
return rightType
346353
case let .conformanceRequirement(conformance):
347354
guard conformance.leftType.as(IdentifierTypeSyntax.self)?.name.text == identifierType.name.text
348355
else { return nil }
@@ -392,7 +399,7 @@ public extension NormalizableDeclSyntax {
392399
} else if let memberType = parameter.type.as(MemberTypeSyntax.self),
393400
memberType.baseType.as(IdentifierTypeSyntax.self)?.name.text == "Swift",
394401
memberType.name.text == "Set",
395-
let elementType = memberType.genericArgumentClause?.arguments.first?.argument
402+
case let .type(elementType) = memberType.genericArgumentClause?.arguments.first?.argument
396403
{ // Swift.Set<T> -> AttributeReference<StylesheetResolvableSet<T.Resolvable>>
397404
return parameter
398405
.with(\.type, TypeSyntax(IdentifierTypeSyntax(name: .identifier("StylesheetResolvableSet"), genericArgumentClause: GenericArgumentClauseSyntax {
@@ -570,10 +577,10 @@ public extension TypeSyntax {
570577
} else if let memberType = self.as(MemberTypeSyntax.self),
571578
memberType.baseType.as(IdentifierTypeSyntax.self)?.name.text == "Swift",
572579
memberType.name.text == "Set",
573-
let elementType = memberType.genericArgumentClause?.arguments.first?.argument
580+
case let .type(elementType) = memberType.genericArgumentClause?.arguments.first?.argument
574581
{ // Swift.Set<T> -> StylesheetResolvableSet<T.Resolvable>
575582
return TypeSyntax(IdentifierTypeSyntax(name: .identifier("StylesheetResolvableSet"), genericArgumentClause: GenericArgumentClauseSyntax {
576-
GenericArgumentSyntax(argument: MemberTypeSyntax(baseType: elementType, name: .identifier("Resolvable")))
583+
GenericArgumentSyntax(argument: .type(TypeSyntax(MemberTypeSyntax(baseType: elementType, name: .identifier("Resolvable")))))
577584
}))
578585
} else if let memberType = self.as(MemberTypeSyntax.self),
579586
memberType.baseType.as(IdentifierTypeSyntax.self)?.name.text == "SwiftUICore",

Sources/SwiftSyntaxExtensions/Types.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,18 @@ public extension TypeSyntaxProtocol {
4545

4646
// generic arguments must be valid (A<B, C>)
4747
if let identifierType = self.as(IdentifierTypeSyntax.self),
48-
!(identifierType.genericArgumentClause?.arguments.allSatisfy(\.argument.isValidModifierType) ?? true)
48+
!(identifierType.genericArgumentClause?.arguments.allSatisfy({
49+
guard case .type(let type) = $0.argument else { return false }
50+
return type.isValidModifierType
51+
}) ?? true)
4952
{
5053
return false
5154
}
5255
if let memberType = self.as(MemberTypeSyntax.self),
53-
!(memberType.genericArgumentClause?.arguments.allSatisfy(\.argument.isValidModifierType) ?? true)
56+
!(memberType.genericArgumentClause?.arguments.allSatisfy({
57+
guard case .type(let type) = $0.argument else { return false }
58+
return type.isValidModifierType
59+
}) ?? true)
5460
{
5561
return false
5662
}
@@ -205,7 +211,10 @@ public extension TypeSyntaxProtocol {
205211
case "Bool", "Duration", "Float", "Float16", "Int", "Int128", "Int16", "Int32", "Int64", "Int8", "LocalTestingActorID", "Never", "ObservationRegistrar", "SIMD16", "SIMD2", "SIMD3", "SIMD32", "SIMD4", "SIMD64", "SIMD8", "SIMDMask", "String", "TaskPriority", "UInt", "UInt128", "UInt16", "UInt32", "UInt64", "UInt8":
206212
return true
207213
case "ClosedRange", "CollectionDifference", "ContiguousArray", "Optional", "PartialRangeFrom", "PartialRangeThrough", "PartialRangeUpTo", "Range", "Set", "Dictionary":
208-
return memberType.genericArgumentClause?.arguments.allSatisfy({ $0.argument.isPrimitiveDecodable }) ?? true
214+
return memberType.genericArgumentClause?.arguments.allSatisfy({
215+
guard case .type(let type) = $0.argument else { return false }
216+
return type.isPrimitiveDecodable
217+
}) ?? true
209218
default:
210219
return false
211220
}
@@ -225,7 +234,10 @@ public extension TypeSyntaxProtocol {
225234
case "Bool", "Duration", "Float", "Float16", "Int", "Int128", "Int16", "Int32", "Int64", "Int8", "LocalTestingActorID", "Never", "ObservationRegistrar", "SIMD16", "SIMD2", "SIMD3", "SIMD32", "SIMD4", "SIMD64", "SIMD8", "SIMDMask", "String", "TaskPriority", "UInt", "UInt128", "UInt16", "UInt32", "UInt64", "UInt8":
226235
return true
227236
case "ClosedRange", "CollectionDifference", "ContiguousArray", "Optional", "PartialRangeFrom", "PartialRangeThrough", "PartialRangeUpTo", "Range", "Set", "Dictionary":
228-
return identifierType.genericArgumentClause?.arguments.allSatisfy({ $0.argument.isPrimitiveDecodable }) ?? true
237+
return identifierType.genericArgumentClause?.arguments.allSatisfy({
238+
guard case .type(let type) = $0.argument else { return false }
239+
return type.isPrimitiveDecodable
240+
}) ?? true
229241
case "TimeInterval", "Date", "URL", "Data":
230242
return true
231243
default:

0 commit comments

Comments
 (0)