@@ -71,59 +71,90 @@ extension IDLDictionary.Member {
71
71
}
72
72
}
73
73
74
- extension MergedDictionary : SwiftRepresentable {
74
+ extension IDLDictionary . Member : SwiftRepresentable {
75
75
var swiftRepresentation : SwiftSource {
76
- """
77
- public class \( name) : BridgedDictionary {
78
- \( swiftInit)
79
- \( swiftMembers. joined ( separator: " \n \n " ) )
76
+ if ModuleState . override {
77
+ assert ( !ModuleState. static)
78
+ return " "
79
+ } else {
80
+ let stringKey = ModuleState . source ( for: name)
81
+ let getter : SwiftSource
82
+ let setter : SwiftSource
83
+
84
+ if let closure = idlType. closurePattern {
85
+ getter = " get { \( closure. getter ( name: stringKey) ) } "
86
+ setter = " set { \( closure. setter ( name: stringKey) ) } "
87
+ } else {
88
+ getter = " get { jsObject[ \( stringKey) ] \( idlType. fromJSValue) } "
89
+ setter = " set { jsObject[ \( stringKey) ] = _toJSValue(newValue) } "
90
+ }
91
+
92
+ return """
93
+ @inlinable public \( raw: ModuleState . static ? " static " : " " ) var \( name) : \( idlType) {
94
+ \( getter)
95
+ \( setter)
96
+ }
97
+ """
80
98
}
81
- """
82
99
}
100
+ }
83
101
84
- private func membersWithPropertyWrapper( _ members: [ IDLDictionary . Member ] ) -> [ ( IDLDictionary . Member , SwiftSource ) ] {
85
- members. map {
86
- ( $0, $0. idlType. propertyWrapper ( readonly: false ) )
87
- }
102
+ extension MergedDictionary : SwiftRepresentable {
103
+ var swiftRepresentation : SwiftSource {
104
+ let inheritanceClause : SwiftSource =
105
+ if self . inheritance. isEmpty {
106
+ " : JSDictionaryCompatible "
107
+ } else {
108
+ " : \( self . inheritance. joined ( separator: " , " ) ) "
109
+ }
110
+
111
+ return """
112
+ open class \( name) \( inheritanceClause) {
113
+ \( self . inheritance. isEmpty ? " public let jsObject: JSObject " : " " )
114
+
115
+ \( swiftInit)
116
+
117
+ \( lines: self . members. map ( \. swiftRepresentation) )
118
+ }
119
+ """
88
120
}
89
121
90
- private var swiftInit : SwiftSource {
91
- let params : [ SwiftSource ] = members. map {
92
- " \( $0. name) : \( $0. idlType. isFunction ? " @escaping " : " " ) \( $0. idlType) "
122
+ private var convenienceInit : SwiftSource {
123
+ let inheritedMembers : [ IDLDictionary . Member ] = self . inheritance. reduce ( into: [ ] ) {
124
+ // FIXME: if dictionary is not found in the current module, it's coming from a dependency,
125
+ // but for now we have to skip it, since `ModuleState` doesn't seem to handle dependencies.
126
+ return $0. append ( contentsOf: ModuleState . dictionaries [ $1] ? . members ?? [ ] )
127
+ }
128
+
129
+ let params : [ SwiftSource ] = ( inheritedMembers + members) . map {
130
+ let escaping = if let closurePattern = $0. idlType. closurePattern {
131
+ closurePattern. nullable || $0. isOptional ? " " : " @escaping "
132
+ } else { " " }
133
+ return " \( $0. name) : \( escaping) \( $0. idlType) \( $0. isOptional ? " ? = nil " : " " ) "
93
134
}
135
+
94
136
return """
95
137
public convenience init( \( sequence: params) ) {
96
138
let object = JSObject.global[ \( ModuleState . source ( for: " Object " ) ) ].function!.new()
97
- \( lines: membersWithPropertyWrapper ( members) . map { member, wrapper in
98
- if member. idlType. isFunction {
99
- return """
100
- \( wrapper) [ \( ModuleState . source ( for: member. name) ) , in: object] = \( member. name)
101
- """
102
- } else {
139
+ \( lines: ( inheritedMembers + members) . map { member in
103
140
return """
104
141
object[ \( ModuleState . source ( for: member. name) ) ] = _toJSValue( \( member. name) )
105
142
"""
106
- }
107
143
} )
108
- self.init(unsafelyWrapping: object)
109
- }
110
144
111
- public required init(unsafelyWrapping object: JSObject) {
112
- \( lines: membersWithPropertyWrapper ( members) . map { member, wrapper in
113
- " _ \( raw: member. name) = \( wrapper) (jsObject: object, name: \( ModuleState . source ( for: member. name) ) ) "
114
- } )
115
- super.init(unsafelyWrapping: object)
145
+ self.init(unsafelyWrapping: object)
116
146
}
117
147
"""
118
148
}
119
149
120
- private var swiftMembers : [ SwiftSource ] {
121
- self . membersWithPropertyWrapper ( members) . map { member, wrapper in
122
- """
123
- @ \( wrapper)
124
- public var \( member. name) : \( member. idlType) \( member. optionalSuffix)
150
+ private var swiftInit : SwiftSource {
151
+ return """
152
+ \( self . convenienceInit)
153
+
154
+ public required init(unsafelyWrapping object: JSObject) {
155
+ \( self . inheritance. isEmpty ? " self.jsObject = object " : " super.init(unsafelyWrapping: object) " )
156
+ }
125
157
"""
126
- }
127
158
}
128
159
}
129
160
@@ -765,8 +796,8 @@ extension IDLTypedef: SwiftRepresentable {
765
796
unionType. friendlyName = name
766
797
return " "
767
798
}
768
- }
769
- return " public typealias \( name) = \( idlType ) "
799
+ } else if let type = Self . typeNameMap [ name ] { aliasedType = type } else { aliasedType = " \( idlType ) " }
800
+ return " public typealias \( name) = \( aliasedType ) "
770
801
}
771
802
}
772
803
0 commit comments