in Sources/MockoloFramework/Templates/NominalTemplate.swift [20:106]
func applyNominalTemplate(name: String,
accessLevel: String,
attribute: String,
arguments: GenerationArguments,
initParamCandidates: [VariableModel],
declaredInits: [MethodModel],
entities: [(String, Model)]) -> String {
processCombineAliases(entities: entities)
let acl = accessLevel.isEmpty ? "" : accessLevel + " "
let (aliasItems,
typeparameters,
whereClauses,
renderedModelNames) = processAssociatedTypes(in: entities, acl: acl)
let renderedEntities = entities
.compactMap { (uniqueId: String, model: Model) -> String? in
if model is TypealiasRenderableModel && renderedModelNames.contains(model.name) {
// this case will be handlded by typealiasWhitelist look up later
return nil
}
if model.modelType == .variable, model.name == String.hasBlankInit {
return nil
}
if model.modelType == .method, let model = model as? MethodModel, model.isInitializer, !model.processed {
return nil
}
return model.render(
context: .init(
overloadingResolvedName: uniqueId,
enclosingType: type,
annotatedTypeKind: declKindOfMockAnnotatedBaseType,
requiresSendable: requiresSendable
),
arguments: arguments
)
}
.joined(separator: "\n")
let extraInits = extraInitsIfNeeded(
initParamCandidates: initParamCandidates,
declaredInits: declaredInits,
acl: acl,
declKindOfMockAnnotatedBaseType: declKindOfMockAnnotatedBaseType,
context: .init(
enclosingType: type,
annotatedTypeKind: declKindOfMockAnnotatedBaseType,
requiresSendable: requiresSendable
),
arguments: arguments
)
var body = ""
if !extraInits.isEmpty {
body += "\(extraInits)\n"
}
if !aliasItems.isEmpty {
body += "\(aliasItems)\n"
}
if !renderedEntities.isEmpty {
body += "\(renderedEntities)"
}
var uncheckedSendableStr = ""
if requiresSendable {
uncheckedSendableStr = ", @unchecked Sendable"
}
let finalStr = arguments.mockFinal || requiresSendable ? String.final.withSpace : ""
let template = """
\(attribute)
\(acl)\(finalStr)\(declKind.rawValue) \(name)\(typeparameters): \(inheritedTypeName)\(uncheckedSendableStr) \(whereClauses){
\(body)
}
"""
if namespaces.isEmpty {
return template
} else {
return """
extension \(namespaces.joined(separator: ".")) {
\(template.addingIndent(1))
}
"""
}
}