@@ -126,18 +126,18 @@ class ExportSwift {
126
126
guard let jsAttribute = node. attributes. firstJSAttribute else {
127
127
return nil
128
128
}
129
-
129
+
130
130
let name = node. name. text
131
131
let namespace = extractNamespace ( from: jsAttribute)
132
-
132
+
133
133
if namespace != nil , case . classBody = state {
134
134
diagnose (
135
135
node: jsAttribute,
136
136
message: " Namespace is only needed in top-level declaration " ,
137
137
hint: " Remove the namespace from @JS attribute or move this function to top-level "
138
138
)
139
139
}
140
-
140
+
141
141
var parameters : [ Parameter ] = [ ]
142
142
for param in node. signature. parameterClause. parameters {
143
143
guard let type = self . parent. lookupType ( for: param. type) else {
@@ -204,15 +204,21 @@ class ExportSwift {
204
204
}
205
205
return Effects ( isAsync: isAsync, isThrows: isThrows)
206
206
}
207
-
207
+
208
208
private func extractNamespace(
209
209
from jsAttribute: AttributeSyntax
210
210
) -> [ String ] ? {
211
- guard let arguments = jsAttribute. arguments? . as ( LabeledExprListSyntax . self) ,
212
- let firstArg = arguments. first? . expression. as ( StringLiteralExprSyntax . self) ,
213
- let namespaceString = firstArg. segments. first? . as ( StringSegmentSyntax . self) ? . content. text else {
214
- return nil
211
+ guard let arguments = jsAttribute. arguments? . as ( LabeledExprListSyntax . self) else {
212
+ return nil
215
213
}
214
+
215
+ guard let namespaceArg = arguments. first ( where: { $0. label? . text == " namespace " } ) ,
216
+ let stringLiteral = namespaceArg. expression. as ( StringLiteralExprSyntax . self) ,
217
+ let namespaceString = stringLiteral. segments. first? . as ( StringSegmentSyntax . self) ? . content. text
218
+ else {
219
+ return nil
220
+ }
221
+
216
222
return namespaceString. split ( separator: " . " ) . map ( String . init)
217
223
}
218
224
@@ -222,17 +228,17 @@ class ExportSwift {
222
228
diagnose ( node: node, message: " @JS init must be inside a @JS class " )
223
229
return . skipChildren
224
230
}
225
-
231
+
226
232
if let jsAttribute = node. attributes. firstJSAttribute,
227
- let namespace = extractNamespace ( from: jsAttribute) ,
228
- namespace != nil {
233
+ extractNamespace ( from: jsAttribute) != nil
234
+ {
229
235
diagnose (
230
236
node: jsAttribute,
231
237
message: " Namespace is not supported for initializer declarations " ,
232
238
hint: " Remove the namespace from @JS attribute "
233
239
)
234
240
}
235
-
241
+
236
242
var parameters : [ Parameter ] = [ ]
237
243
for param in node. signature. parameterClause. parameters {
238
244
guard let type = self . parent. lookupType ( for: param. type) else {
@@ -259,7 +265,7 @@ class ExportSwift {
259
265
260
266
override func visit( _ node: ClassDeclSyntax ) -> SyntaxVisitorContinueKind {
261
267
let name = node. name. text
262
-
268
+
263
269
stateStack. push ( state: . classBody( name: name) )
264
270
265
271
guard let jsAttribute = node. attributes. firstJSAttribute else { return . skipChildren }
@@ -675,7 +681,7 @@ extension AttributeListSyntax {
675
681
fileprivate func hasJSAttribute( ) -> Bool {
676
682
firstJSAttribute != nil
677
683
}
678
-
684
+
679
685
fileprivate var firstJSAttribute : AttributeSyntax ? {
680
686
first ( where: {
681
687
$0. as ( AttributeSyntax . self) ? . attributeName. trimmedDescription == " JS "
0 commit comments