@@ -243,50 +243,20 @@ public class ExportSwift {
243243 return . null
244244 }
245245
246- if let stringLiteral = expr. as ( StringLiteralExprSyntax . self) ,
247- let segment = stringLiteral. segments. first? . as ( StringSegmentSyntax . self) ,
248- type. matches ( against: . string)
249- {
250- return . string( segment. content. text)
251- }
252- 253- if let boolLiteral = expr. as ( BooleanLiteralExprSyntax . self) ,
254- type. matches ( against: . bool)
255- {
256- return . bool( boolLiteral. literal. text == " true " )
257- }
258- 259- if let intLiteral = expr. as ( IntegerLiteralExprSyntax . self) ,
260- let intValue = Int ( intLiteral. literal. text) ,
261- type. matches ( against: . int)
262- {
263- return . int( intValue)
264- }
265- 266- if let floatLiteral = expr. as ( FloatLiteralExprSyntax . self) {
267- if type. matches ( against: . float) ,
268- let floatValue = Float ( floatLiteral. literal. text)
269- {
270- return . float( floatValue)
271- }
272- if type. matches ( against: . double) ,
273- let doubleValue = Double ( floatLiteral. literal. text)
274- {
275- return . double( doubleValue)
276- }
277- }
278- 279246 if let memberExpr = expr. as ( MemberAccessExprSyntax . self) ,
280247 let enumValue = extractEnumCaseValue ( from: memberExpr, type: type)
281248 {
282249 return enumValue
283250 }
284251
285- // Constructor calls (e.g., Greeter(name: "John"))
286252 if let funcCall = expr. as ( FunctionCallExprSyntax . self) {
287253 return extractConstructorDefaultValue ( from: funcCall, type: type)
288254 }
289255
256+ if let literalValue = extractLiteralValue ( from: expr, type: type) {
257+ return literalValue
258+ }
259+ 290260 diagnose (
291261 node: expr,
292262 message: " Unsupported default parameter value expression " ,
@@ -300,7 +270,6 @@ public class ExportSwift {
300270 from funcCall: FunctionCallExprSyntax ,
301271 type: BridgeType
302272 ) -> DefaultValue ? {
303- // Extract class name
304273 guard let calledExpr = funcCall. calledExpression. as ( DeclReferenceExprSyntax . self) else {
305274 diagnose (
306275 node: funcCall,
@@ -311,8 +280,6 @@ public class ExportSwift {
311280 }
312281
313282 let className = calledExpr. baseName. text
314- 315- // Verify type matches
316283 let expectedClassName : String ?
317284 switch type {
318285 case . swiftHeapObject( let name) :
@@ -337,17 +304,13 @@ public class ExportSwift {
337304 return nil
338305 }
339306
340- // Handle parameterless constructor
341307 if funcCall. arguments. isEmpty {
342308 return . object( className)
343309 }
344310
345- // Extract arguments for constructor with parameters
346311 var constructorArgs : [ DefaultValue ] = [ ]
347312 for argument in funcCall. arguments {
348- // Recursively extract the argument's default value
349- // For now, only support literals in constructor arguments
350- guard let argValue = extractConstructorArgumentValue ( from: argument. expression) else {
313+ guard let argValue = extractLiteralValue ( from: argument. expression) else {
351314 diagnose (
352315 node: argument. expression,
353316 message: " Constructor argument must be a literal value " ,
@@ -362,42 +325,64 @@ public class ExportSwift {
362325 return . objectWithArguments( className, constructorArgs)
363326 }
364327
365- /// Extracts a literal value from an expression for use in constructor arguments
366- private func extractConstructorArgumentValue( from expr: ExprSyntax ) -> DefaultValue ? {
367- // String literals
328+ /// Extracts a literal value from an expression with optional type checking
329+ private func extractLiteralValue( from expr: ExprSyntax , type: BridgeType ? = nil ) -> DefaultValue ? {
330+ if expr. is ( NilLiteralExprSyntax . self) {
331+ return . null
332+ }
333+ 368334 if let stringLiteral = expr. as ( StringLiteralExprSyntax . self) ,
369335 let segment = stringLiteral. segments. first? . as ( StringSegmentSyntax . self)
370336 {
371- return . string( segment. content. text)
337+ let value = DefaultValue . string ( segment. content. text)
338+ if let type = type, !type. isCompatibleWith ( . string) {
339+ return nil
340+ }
341+ return value
372342 }
373343
374- // Boolean literals
375344 if let boolLiteral = expr. as ( BooleanLiteralExprSyntax . self) {
376- return . bool( boolLiteral. literal. text == " true " )
345+ let value = DefaultValue . bool ( boolLiteral. literal. text == " true " )
346+ if let type = type, !type. isCompatibleWith ( . bool) {
347+ return nil
348+ }
349+ return value
350+ }
351+ 352+ var numericExpr = expr
353+ var isNegative = false
354+ if let prefixExpr = expr. as ( PrefixOperatorExprSyntax . self) ,
355+ prefixExpr. operator. text == " - "
356+ {
357+ numericExpr = prefixExpr. expression
358+ isNegative = true
377359 }
378360
379- // Integer literals
380- if let intLiteral = expr. as ( IntegerLiteralExprSyntax . self) ,
361+ if let intLiteral = numericExpr. as ( IntegerLiteralExprSyntax . self) ,
381362 let intValue = Int ( intLiteral. literal. text)
382363 {
383- return . int( intValue)
364+ let value = DefaultValue . int ( isNegative ? - intValue : intValue)
365+ if let type = type, !type. isCompatibleWith ( . int) {
366+ return nil
367+ }
368+ return value
384369 }
385370
386- // Float literals
387- if let floatLiteral = expr. as ( FloatLiteralExprSyntax . self) {
371+ if let floatLiteral = numericExpr. as ( FloatLiteralExprSyntax . self) {
388372 if let floatValue = Float ( floatLiteral. literal. text) {
389- return . float( floatValue)
373+ let value = DefaultValue . float ( isNegative ? - floatValue : floatValue)
374+ if type == nil || type? . isCompatibleWith ( . float) == true {
375+ return value
376+ }
390377 }
391378 if let doubleValue = Double ( floatLiteral. literal. text) {
392- return . double( doubleValue)
379+ let value = DefaultValue . double ( isNegative ? - doubleValue : doubleValue)
380+ if type == nil || type? . isCompatibleWith ( . double) == true {
381+ return value
382+ }
393383 }
394384 }
395385
396- // nil literal
397- if expr. is ( NilLiteralExprSyntax . self) {
398- return . null
399- }
400- 401386 return nil
402387 }
403388
@@ -885,7 +870,7 @@ public class ExportSwift {
885870 swiftCallName: swiftCallName,
886871 explicitAccessControl: explicitAccessControl,
887872 cases: [ ] , // Will be populated in visit(EnumCaseDeclSyntax)
888- rawType: rawType,
873+ rawType: SwiftEnumRawType ( rawType) ,
889874 namespace: effectiveNamespace,
890875 emitStyle: emitStyle,
891876 staticMethods: [ ] ,
@@ -923,9 +908,7 @@ public class ExportSwift {
923908
924909 if case . tsEnum = emitStyle {
925910 // Check for Bool raw type limitation
926- if let raw = exportedEnum. rawType,
927- let rawEnum = SwiftEnumRawType . from ( raw) , rawEnum == . bool
928- {
911+ if exportedEnum. rawType == . bool {
929912 diagnose (
930913 node: jsAttribute,
931914 message: " TypeScript enum style is not supported for Bool raw-value enums " ,
@@ -1180,7 +1163,7 @@ public class ExportSwift {
11801163 return Constants . supportedRawTypes. contains ( typeName)
11811164 } ? . type. trimmedDescription
11821165
1183- if let rawTypeString , let rawType = SwiftEnumRawType . from ( rawTypeString) {
1166+ if let rawType = SwiftEnumRawType ( rawTypeString) {
11841167 return . rawValueEnum( swiftCallName, rawType)
11851168 } else {
11861169 let hasAnyCases = enumDecl. memberBlock. members. contains { member in
@@ -2160,12 +2143,13 @@ extension WithModifiersSyntax {
21602143}
21612144
21622145fileprivate extension BridgeType {
2163- func matches( against expected: BridgeType ) -> Bool {
2164- switch ( self , expected) {
2146+ /// Returns true if a value of `expectedType` can be assigned to this type.
2147+ func isCompatibleWith( _ expectedType: BridgeType ) -> Bool {
2148+ switch ( self , expectedType) {
21652149 case let ( lhs, rhs) where lhs == rhs:
21662150 return true
2167- case ( . optional( let wrapped) , expected ) :
2168- return wrapped == expected
2151+ case ( . optional( let wrapped) , expectedType ) :
2152+ return wrapped == expectedType
21692153 default :
21702154 return false
21712155 }
0 commit comments