init()

in Sources/MockoloFramework/Utils/SwiftType.swift [551:686]


    init(typeSyntax: TypeSyntax) {
        switch typeSyntax.as(TypeSyntaxEnum.self) {
        case .arrayType(let syntax):
            // [T]
            let elementType = SwiftType(typeSyntax: syntax.element)
            self.kind = .nominal(.init(name: .arrayTypeSugarName, genericParameterTypes: [elementType]))

        case .inlineArrayType(let syntax):
            // [N of T] - InlineArray type sugar (SE-0453, Swift 6.2+)
            // This case was added for swift-syntax 602 compatibility.
            // Full support (default value generation, etc.) is not implemented.
            // The type is preserved verbatim; users must provide their own default values.
            self.kind = .nominal(.init(name: syntax.trimmedDescription))

        case .dictionaryType(let syntax):
            // [T: U]
            let keyType = SwiftType(typeSyntax: syntax.key)
            let valueType = SwiftType(typeSyntax: syntax.value)
            self.kind = .nominal(.init(name: .dictionaryTypeSugarName, genericParameterTypes: [keyType, valueType]))

        case .tupleType(let syntax):
            // (T, u: U)
            let elements = syntax.elements.map {
                SwiftType.Tuple.Element(
                    label: $0.firstName?.text, // Tuple element cannot have two labels
                    type: SwiftType(typeSyntax: $0.type)
                )
            }
            self.kind = .tuple(.init(elements: elements))

        case .functionType(let syntax):
            // (T) -> U
            self.kind = .closure(.init(
                isAsync: syntax.effectSpecifiers?.asyncSpecifier != nil,
                throwing: ThrowingKind(syntax.effectSpecifiers?.throwsClause),
                arguments: syntax.parameters.map {
                    .init(
                        firstName: $0.firstName?.text,
                        secondName: $0.secondName?.text,
                        type: .init(typeSyntax: $0.type)
                    )
                },
                returning: SwiftType(typeSyntax: syntax.returnClause.type)
            ))

        case .optionalType(let syntax):
            // T?
            let base = SwiftType(typeSyntax: syntax.wrappedType)
            self = base.optionalWrapped()

        case .implicitlyUnwrappedOptionalType(let syntax):
            // T!
            let base = SwiftType(typeSyntax: syntax.wrappedType)
            self = base.optionalWrapped()
            self.isIUO = true

        case .identifierType(let syntax):
            // T<U>
            let name = syntax.name.trimmedDescription
            let generics = syntax.genericArgumentClause?.arguments.compactMap {
                $0.argument.as(TypeSyntax.self).flatMap {
                    SwiftType(typeSyntax: $0)
                }
            }
            self.kind = .nominal(.init(name: name, genericParameterTypes: generics ?? []))

        case .someOrAnyType(let syntax):
            // some P, any P
            self = SwiftType(typeSyntax: syntax.constraint)
            self.someOrAny = switch syntax.someOrAnySpecifier.tokenKind {
            case .keyword(.some): .some
            case .keyword(.any): .any
            default: nil
            }

        case .metatypeType(let syntax):
            // T.Type, P.Protocol
            let base = SwiftType(typeSyntax: syntax.baseType)
            self.kind = .nominal(.init(
                namespace: base,
                name: syntax.metatypeSpecifier.text
            ))

        case .memberType(let syntax):
            // T.U
            let name = syntax.name.trimmedDescription
            let generics = syntax.genericArgumentClause?.arguments.compactMap {
                $0.argument.as(TypeSyntax.self).flatMap {
                    SwiftType(typeSyntax: $0)
                }
            }
            self.kind = .nominal(.init(
                namespace: SwiftType(typeSyntax: syntax.baseType),
                name: name,
                genericParameterTypes: generics ?? []
            ))

        case .attributedType(let syntax):
            // inout T, sending T, @escaping T
            self = SwiftType(typeSyntax: syntax.baseType)
            self.attributes += syntax.specifiers.map(\.trimmedDescription)
            self.attributes += syntax.attributes.map(\.trimmedDescription)

        case .compositionType(let syntax):
            // P & Q
            let elements = syntax.elements.map { SwiftType(typeSyntax: $0.type) }
            self.kind = .composition(.init(elements: elements))

        case .namedOpaqueReturnType(let syntax):
            // <U>A
            // unsupported
            self.kind = .nominal(.init(name: syntax.trimmedDescription))

        case .packElementType(let syntax):
            // each T
            self = SwiftType(typeSyntax: syntax.pack)
            self.attributes.append("each")

        case .packExpansionType(let syntax):
            // repeat T
            self = SwiftType(typeSyntax: syntax.repetitionPattern)
            self.attributes.insert("repeat", at: 0)

        case .suppressedType(let syntax):
            // unsupported
            self = .init(typeSyntax: syntax.type)

        case .classRestrictionType(let syntax):
            // unsupported
            self.kind = .nominal(.init(name: syntax.trimmedDescription))

        case .missingType(let syntax):
            // unsupported
            self.kind = .nominal(.init(name: syntax.trimmedDescription))
        }
    }