func applyVariableTemplate()

in Sources/MockoloFramework/Templates/VariableTemplate.swift [20:132]


    func applyVariableTemplate(name: String,
                               type: SwiftType,
                               encloser: String,
                               isStatic: Bool,
                               customModifiers: [String: Modifier]?,
                               allowSetCallCount: Bool,
                               shouldOverride: Bool,
                               accessLevel: String,
                               context: RenderContext,
                               arguments: GenerationArguments) -> String {
        let underlyingSetCallCount = "\(name)\(String.setCallCountSuffix)"
        let underlyingVarDefaultVal = type.defaultVal()
        var underlyingType = type.typeName
        if underlyingVarDefaultVal == nil {
            underlyingType = type.underlyingType
        }

        let propertyWrapper = propertyWrapper != nil ? "\(propertyWrapper!) " : ""

        let overrideStr = shouldOverride ? "\(String.override) " : ""
        var acl = accessLevel
        if !acl.isEmpty {
            acl = acl + " "
        }

        var assignVal = ""
        if !shouldOverride, let val = underlyingVarDefaultVal {
            assignVal = " = \(val)"
        }

        let privateSetSpace = allowSetCallCount ? "" :  "\(String.privateSet) "

        let modifierTypeStr: String
        if let customModifiers = self.customModifiers,
           let customModifier: Modifier = customModifiers[name] {
            modifierTypeStr = customModifier.rawValue + " "
        } else {
            modifierTypeStr = ""
        }

        let staticSpace = isStatic ? "\(String.static) " : ""

        switch storageKind {
        case .stored(let needSetCount):
            let setCallCountVarDecl = needSetCount ? """
            \(1.tab)\(acl)\(staticSpace)\(privateSetSpace)var \(underlyingSetCallCount) = 0
            """ : ""

            var accessorBlockItems: [String] = []
            if needSetCount {
                let didSetBlock = """
                didSet { \(underlyingSetCallCount) += 1 }
                """
                accessorBlockItems.append(didSetBlock)
            }

            let accessorBlock: String
            switch accessorBlockItems.count {
            case 0: accessorBlock = ""
            case 1: accessorBlock = " { \(accessorBlockItems[0]) }"
            default: accessorBlock = """
                 {
                \(accessorBlockItems.map { "\(2.tab)\($0)" }.joined(separator: "\n"))
                \(1.tab)}
                """
            }

            let template: String
            if underlyingVarDefaultVal == nil {
                template = """
                
                \(setCallCountVarDecl)
                \(1.tab)\(propertyWrapper)\(staticSpace)private var \(underlyingName): \(underlyingType)\(assignVal)\(accessorBlock)
                \(1.tab)\(acl)\(staticSpace)\(overrideStr)\(modifierTypeStr)var \(name): \(type.typeName) {
                \(2.tab)get { return \(underlyingName) }
                \(2.tab)set { \(underlyingName) = newValue }
                \(1.tab)}
                """
            } else {
                template = """
                
                \(setCallCountVarDecl)
                \(1.tab)\(propertyWrapper)\(acl)\(staticSpace)\(overrideStr)\(modifierTypeStr)var \(name): \(type.typeName)\(assignVal)\(accessorBlock)
                """
            }

            return template

        case .computed(let effects):
            let body = (ClosureModel(
                genericTypeParams: [],
                params: [],
                isAsync: effects.isAsync,
                throwing: effects.throwing,
                returnType: type
            ).render(context: .init(
                overloadingResolvedName: name, // var cannot overload. this is ok
                enclosingType: context.enclosingType,
                annotatedTypeKind: context.annotatedTypeKind
            ), arguments: arguments) ?? "")
                .addingIndent(1)

            return """

            \(1.tab)\(acl)\(staticSpace)var \(name)\(String.handlerSuffix): (() \(effects.applyTemplate())-> \(type.typeName))?
            \(1.tab)\(acl)\(staticSpace)\(overrideStr)\(modifierTypeStr)var \(name): \(type.typeName) {
            \(2.tab)get \(effects.applyTemplate()){
            \(body)
            \(2.tab)}
            \(1.tab)}
            """
        }
    }