mirror of
https://github.com/krzysztofzablocki/Sourcery.git
synced 2026-04-07 19:17:40 +00:00
7153768c65
* Preliminary associatedtype support
* Implemented associatedtype support with generic requirements
* Fixed failing test
* Squashed commit of the following:
commit 9d01e6f99a
Author: Ruslan A <r.alikhamov@gmail.com>
Date: Fri Jun 14 20:06:41 2024 +0400
Improved concurrency support in SwiftTemplate caching (#1344)
* Removed test code
* Removed comment
* Updated Linux classes
* update internal boilerplate code.
* Updated generated code
* Removed warnings
* Updated expected file
* Updated expected file
* Adjusted protocol type for Linux
* Removed protocol composition due to Swift compiler crash under Linux
147 lines
5.0 KiB
Swift
147 lines
5.0 KiB
Swift
//
|
|
// Protocol.swift
|
|
// Sourcery
|
|
//
|
|
// Created by Krzysztof Zablocki on 09/12/2016.
|
|
// Copyright © 2016 Pixle. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
#if !canImport(ObjectiveC)
|
|
|
|
/// :nodoc:
|
|
public typealias SourceryProtocol = Protocol
|
|
|
|
/// Describes Swift protocol
|
|
public final class Protocol: Type {
|
|
public override subscript(dynamicMember member: String) -> Any? {
|
|
switch member {
|
|
case "associatedTypes":
|
|
return associatedTypes
|
|
default:
|
|
return super[dynamicMember: member]
|
|
}
|
|
}
|
|
|
|
// sourcery: skipJSExport
|
|
public class var kind: String { return "protocol" }
|
|
|
|
/// Returns "protocol"
|
|
public override var kind: String { Self.kind }
|
|
|
|
/// list of all declared associated types with their names as keys
|
|
public var associatedTypes: [String: AssociatedType] {
|
|
didSet {
|
|
isGeneric = !associatedTypes.isEmpty || !genericRequirements.isEmpty
|
|
}
|
|
}
|
|
|
|
// sourcery: skipCoding
|
|
/// list of generic requirements
|
|
public override var genericRequirements: [GenericRequirement] {
|
|
didSet {
|
|
isGeneric = !associatedTypes.isEmpty || !genericRequirements.isEmpty
|
|
}
|
|
}
|
|
|
|
/// :nodoc:
|
|
public init(name: String = "",
|
|
parent: Type? = nil,
|
|
accessLevel: AccessLevel = .internal,
|
|
isExtension: Bool = false,
|
|
variables: [Variable] = [],
|
|
methods: [Method] = [],
|
|
subscripts: [Subscript] = [],
|
|
inheritedTypes: [String] = [],
|
|
containedTypes: [Type] = [],
|
|
typealiases: [Typealias] = [],
|
|
associatedTypes: [String: AssociatedType] = [:],
|
|
genericRequirements: [GenericRequirement] = [],
|
|
attributes: AttributeList = [:],
|
|
modifiers: [SourceryModifier] = [],
|
|
annotations: [String: NSObject] = [:],
|
|
documentation: [String] = [],
|
|
implements: [String: Type] = [:],
|
|
kind: String = Protocol.kind) {
|
|
self.associatedTypes = associatedTypes
|
|
super.init(
|
|
name: name,
|
|
parent: parent,
|
|
accessLevel: accessLevel,
|
|
isExtension: isExtension,
|
|
variables: variables,
|
|
methods: methods,
|
|
subscripts: subscripts,
|
|
inheritedTypes: inheritedTypes,
|
|
containedTypes: containedTypes,
|
|
typealiases: typealiases,
|
|
genericRequirements: genericRequirements,
|
|
attributes: attributes,
|
|
modifiers: modifiers,
|
|
annotations: annotations,
|
|
documentation: documentation,
|
|
isGeneric: !associatedTypes.isEmpty || !genericRequirements.isEmpty,
|
|
implements: implements,
|
|
kind: kind
|
|
)
|
|
}
|
|
|
|
/// :nodoc:
|
|
// sourcery: skipJSExport
|
|
override public var description: String {
|
|
var string = super.description
|
|
string.append(", ")
|
|
string.append("kind = \(String(describing: self.kind)), ")
|
|
string.append("associatedTypes = \(String(describing: self.associatedTypes)), ")
|
|
return string
|
|
}
|
|
|
|
override public func diffAgainst(_ object: Any?) -> DiffableResult {
|
|
let results = DiffableResult()
|
|
guard let castObject = object as? Protocol else {
|
|
results.append("Incorrect type <expected: Protocol, received: \(Swift.type(of: object))>")
|
|
return results
|
|
}
|
|
results.append(contentsOf: DiffableResult(identifier: "associatedTypes").trackDifference(actual: self.associatedTypes, expected: castObject.associatedTypes))
|
|
results.append(contentsOf: super.diffAgainst(castObject))
|
|
return results
|
|
}
|
|
|
|
/// :nodoc:
|
|
// sourcery: skipJSExport
|
|
public override var hash: Int {
|
|
var hasher = Hasher()
|
|
hasher.combine(self.associatedTypes)
|
|
hasher.combine(super.hash)
|
|
return hasher.finalize()
|
|
}
|
|
|
|
/// :nodoc:
|
|
public override func isEqual(_ object: Any?) -> Bool {
|
|
guard let rhs = object as? Protocol else { return false }
|
|
if self.associatedTypes != rhs.associatedTypes { return false }
|
|
return super.isEqual(rhs)
|
|
}
|
|
|
|
// sourcery:inline:Protocol.AutoCoding
|
|
|
|
/// :nodoc:
|
|
required public init?(coder aDecoder: NSCoder) {
|
|
guard let associatedTypes: [String: AssociatedType] = aDecoder.decode(forKey: "associatedTypes") else {
|
|
withVaList(["associatedTypes"]) { arguments in
|
|
NSException.raise(NSExceptionName.parseErrorException, format: "Key '%@' not found.", arguments: arguments)
|
|
}
|
|
fatalError()
|
|
}; self.associatedTypes = associatedTypes
|
|
super.init(coder: aDecoder)
|
|
}
|
|
|
|
/// :nodoc:
|
|
override public func encode(with aCoder: NSCoder) {
|
|
super.encode(with: aCoder)
|
|
aCoder.encode(self.associatedTypes, forKey: "associatedTypes")
|
|
}
|
|
// sourcery:end
|
|
}
|
|
#endif |