Skip to content

Commit c38215d

Browse files
committed
Look inside #if directives in extensions in the modifier generator
1 parent 8595a2b commit c38215d

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed

Sources/LiveViewNative/Stylesheets/ResolvableTypes/Foundation.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import Foundation
99
import LiveViewNativeStylesheet
1010
import LiveViewNativeCore
11+
import CoreText
1112

1213
extension Calendar {
1314
@ASTDecodable("Calendar")
@@ -238,6 +239,24 @@ public extension AttributedString.Resolvable {
238239
}
239240
}
240241

242+
@available(iOS 26.0, macOS 26.0, tvOS 26.0, watchOS 26.0, *)
243+
extension AttributedString.LineHeight {
244+
@ASTDecodable("LineHeight")
245+
public enum Resolvable: StylesheetResolvable, @preconcurrency Decodable {
246+
case __constant(AttributedString.LineHeight)
247+
}
248+
}
249+
250+
@available(iOS 26.0, macOS 26.0, tvOS 26.0, watchOS 26.0, *)
251+
public extension AttributedString.LineHeight.Resolvable {
252+
@MainActor func resolve<R: RootRegistry>(on element: ElementNode, in context: LiveContext<R>) -> AttributedString.LineHeight {
253+
switch self {
254+
case let .__constant(value):
255+
return value
256+
}
257+
}
258+
}
259+
241260
public struct StylesheetResolvableLocalizedError: @preconcurrency Decodable, StylesheetResolvable, LocalizedError, @preconcurrency AttributeDecodable {
242261
public let errorDescription: String?
243262

Sources/ModifierGenerator/ModifierGenerator.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import SwiftParser
66

77
@main
88
struct ModifierGenerator: ParsableCommand {
9+
// @Argument(transform: { URL(filePath: $0) })
10+
// private var input: URL
11+
//
912
/// The path used as the output file.
1013
@Argument(transform: { URL(filePath: $0) })
1114
private var output: URL

Sources/ModifierGenerator/StyleDefinitionGenerator/StyleDefinitionGenerator.swift

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,39 @@ public final class StyleDefinitionGenerator: SyntaxVisitor {
181181

182182
let extensionAvailability = node.attributes.filter(\.isAvailability)
183183

184+
print(node.memberBlock.members.compactMap({ $0.decl.syntaxNodeType }))
185+
184186
for modifier in node.memberBlock.members
185-
.compactMap({ $0.decl.as(FunctionDeclSyntax.self) })
186-
.filter(\.isValidModifier)
187-
.map({ $0.normalizedParameterTypes() })
188-
.filter(\.isPublic)
189-
.filter({ !denylist.contains($0.name.text) })
187+
.reduce(into: [FunctionDeclSyntax](), { functionDecls, member in
188+
if let functionDecl = member.decl.as(FunctionDeclSyntax.self),
189+
functionDecl.isValidModifier,
190+
functionDecl.isPublic,
191+
!denylist.contains(functionDecl.name.text)
192+
{
193+
functionDecls.append(functionDecl.normalizedParameterTypes())
194+
} else if let ifConfig = member.decl.as(IfConfigDeclSyntax.self) {
195+
// extract clauses from #if blocks, for example:
196+
// #if compiler(>= 5.3) && $NoncopyableTypes
197+
// func modifier(...) -> some SwiftUICore.View
198+
// #endif
199+
for clause in ifConfig.clauses {
200+
switch clause.elements {
201+
case let .decls(decls):
202+
for decl in decls {
203+
if let functionDecl = decl.decl.as(FunctionDeclSyntax.self),
204+
functionDecl.isValidModifier,
205+
functionDecl.isPublic,
206+
!denylist.contains(functionDecl.name.text)
207+
{
208+
functionDecls.append(functionDecl.normalizedParameterTypes())
209+
}
210+
}
211+
default:
212+
break
213+
}
214+
}
215+
}
216+
})
190217
{
191218
// special case for `toolbar` to exclude `ViewReference` clauses.
192219
if modifier.name.text == "toolbar" {

0 commit comments

Comments
 (0)