@@ -689,47 +689,50 @@ public class ExportSwift {
689689 if let primitive = BridgeType ( swiftType: type. trimmedDescription) {
690690 return primitive
691691 }
692- guard let identifier = type. as ( IdentifierTypeSyntax . self) else {
693- return nil
694- }
695692
696- guard let typeDecl = typeDeclResolver. lookupType ( for : identifier ) else {
693+ guard let typeDecl = typeDeclResolver. resolve ( type ) else {
697694 return nil
698695 }
696+
699697 if let enumDecl = typeDecl. as ( EnumDeclSyntax . self) {
700- let enumName = enumDecl. name. text
701- if let existingEnum = exportedEnums. first ( where: { $0. name == enumName } ) {
702- switch existingEnum. enumType {
703- case . simple:
704- return . caseEnum( existingEnum. swiftCallName)
705- case . rawValue:
706- let rawType = SwiftEnumRawType . from ( existingEnum. rawType!) !
707- return . rawValueEnum( existingEnum. swiftCallName, rawType)
708- case . associatedValue:
709- return . associatedValueEnum( existingEnum. swiftCallName)
710- case . namespace:
711- return . namespaceEnum( existingEnum. swiftCallName)
712- }
713- }
714698 let swiftCallName = ExportSwift . computeSwiftCallName ( for: enumDecl, itemName: enumDecl. name. text)
715699 let rawTypeString = enumDecl. inheritanceClause? . inheritedTypes. first { inheritedType in
716700 let typeName = inheritedType. type. trimmedDescription
717701 return Constants . supportedRawTypes. contains ( typeName)
718702 } ? . type. trimmedDescription
719703
720- if let rawTypeString = rawTypeString,
721- let rawType = SwiftEnumRawType . from ( rawTypeString)
722- {
704+ if let rawTypeString, let rawType = SwiftEnumRawType . from ( rawTypeString) {
723705 return . rawValueEnum( swiftCallName, rawType)
724706 } else {
725- return . caseEnum( swiftCallName)
707+ let hasAnyCases = enumDecl. memberBlock. members. contains { member in
708+ member. decl. is ( EnumCaseDeclSyntax . self)
709+ }
710+ if !hasAnyCases {
711+ return . namespaceEnum( swiftCallName)
712+ }
713+ let hasAssociatedValues =
714+ enumDecl. memberBlock. members. contains { member in
715+ guard let caseDecl = member. decl. as ( EnumCaseDeclSyntax . self) else { return false }
716+ return caseDecl. elements. contains { element in
717+ if let params = element. parameterClause? . parameters {
718+ return !params. isEmpty
719+ }
720+ return false
721+ }
722+ }
723+ if hasAssociatedValues {
724+ return . associatedValueEnum( swiftCallName)
725+ } else {
726+ return . caseEnum( swiftCallName)
727+ }
726728 }
727729 }
728730
729731 guard typeDecl. is ( ClassDeclSyntax . self) || typeDecl. is ( ActorDeclSyntax . self) else {
730732 return nil
731733 }
732- return . swiftHeapObject( typeDecl. name. text)
734+ let swiftCallName = ExportSwift . computeSwiftCallName ( for: typeDecl, itemName: typeDecl. name. text)
735+ return . swiftHeapObject( swiftCallName)
733736 }
734737
735738 static let prelude : DeclSyntax = """
0 commit comments