From 492551d8bbf4c118b366a577b21ed02c4c0ecb56 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Thu, 24 Apr 2025 11:04:50 +0100 Subject: [PATCH] Following up on closures property wrappers cleanup This change fixes an issue with the use of property wrappers for closures in WebAPIKit, which caused unnecessary increases in binary code size for products utilizing this library. Use of property wrappers is removed and simple direct getter and setter accessors are used for properties of closure types instead. --- .../WebIDL+SwiftRepresentation.swift | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/Sources/WebIDLToSwift/WebIDL+SwiftRepresentation.swift b/Sources/WebIDLToSwift/WebIDL+SwiftRepresentation.swift index 07ec10ed..9b7e499f 100644 --- a/Sources/WebIDLToSwift/WebIDL+SwiftRepresentation.swift +++ b/Sources/WebIDLToSwift/WebIDL+SwiftRepresentation.swift @@ -36,47 +36,27 @@ extension IDLAttribute: SwiftRepresentable { } if ModuleState.override { assert(!ModuleState.static) - // can't do property wrappers on override declarations - return """ - @usableFromInline let \(wrapperName): \(idlType.propertyWrapper(readonly: readonly))<\(idlType)> - @inlinable override public var \(name): \(idlType) { - get { \(wrapperName).wrappedValue } - \(readonly ? "" : "set { \(wrapperName).wrappedValue = newValue }") - } - """ - } else if ModuleState.constructor == nil || ModuleState.static { - // can't do property wrappers on extensions - let propertyWrapper = idlType.propertyWrapper(readonly: readonly) - if [SwiftSource.readOnlyAttribute, .readWriteAttribute].contains(propertyWrapper) { - let setter: SwiftSource = """ - nonmutating set { jsObject[\(ModuleState.source(for: name))] = _toJSValue(newValue) } - """ - return """ - @inlinable public\(raw: ModuleState.static ? " static" : "") var \(name): \(idlType) { - get { jsObject[\(ModuleState.source(for: name))]\(idlType.fromJSValue) } - \(readonly ? "" : setter) - } - """ + return "" + } else { + let stringKey = ModuleState.source(for: name) + let getter: SwiftSource + let setter: SwiftSource + + if let closure = idlType.closurePattern { + getter = "get { \(closure.getter(name: stringKey)) }" + setter = "set { \(closure.setter(name: stringKey)) }" } else { - let setter: SwiftSource = """ - nonmutating set { \( - idlType.propertyWrapper(readonly: readonly))[\(ModuleState.source(for: name) - ), in: jsObject] = newValue } - """ + getter = "get { jsObject[\(stringKey)]\(idlType.fromJSValue) }" + setter = "set { jsObject[\(stringKey)] = _toJSValue(newValue) }" + } - return """ + return """ @inlinable public\(raw: ModuleState.static ? " static" : "") var \(name): \(idlType) { - get { \(idlType.propertyWrapper(readonly: readonly))[\(ModuleState.source(for: name)), in: jsObject] } + \(getter) \(readonly ? "" : setter) } """ - } - } else { - return """ - @\(idlType.propertyWrapper(readonly: readonly)) - public var \(name): \(idlType) - """ } }