diff --git a/Sources/MockoloFramework/Models/ParamModel.swift b/Sources/MockoloFramework/Models/ParamModel.swift index a1ca813d..c4ba047d 100644 --- a/Sources/MockoloFramework/Models/ParamModel.swift +++ b/Sources/MockoloFramework/Models/ParamModel.swift @@ -79,7 +79,7 @@ final class ParamModel: Model { if self.inInit, self.needVarDecl { let type: `Type` if eraseType { - type = Type(.any) + type = Type(.anyType) } else { type = self.type } diff --git a/Sources/MockoloFramework/Models/TypeAliasModel.swift b/Sources/MockoloFramework/Models/TypeAliasModel.swift index 30711f0e..013d7cea 100644 --- a/Sources/MockoloFramework/Models/TypeAliasModel.swift +++ b/Sources/MockoloFramework/Models/TypeAliasModel.swift @@ -49,7 +49,7 @@ final class TypeAliasModel: Model { if let val = overrideTypes?[self.name] { self.type = Type(val) } else { - self.type = typeName.isEmpty ? Type(String.any) : Type(typeName) + self.type = typeName.isEmpty ? Type(String.anyType) : Type(typeName) } } diff --git a/Sources/MockoloFramework/Utils/InheritanceResolver.swift b/Sources/MockoloFramework/Utils/InheritanceResolver.swift index 48461c8e..128f2531 100644 --- a/Sources/MockoloFramework/Utils/InheritanceResolver.swift +++ b/Sources/MockoloFramework/Utils/InheritanceResolver.swift @@ -56,7 +56,7 @@ func lookupEntities(key: String, if declType == .protocolType { // TODO: remove this once parent protocol (current decl = classtype) handling is resolved. // If the protocol inherits other protocols, look up their entities as well. for parent in current.entityNode.inheritedTypes { - if parent != .class, parent != .any, parent != .anyObject { + if parent != .class, parent != .anyType, parent != .anyObject { let (parentModels, parentProcessedModels, parentAttributes, parentPaths, parentPathToContents) = lookupEntities(key: parent, declType: declType, protocolMap: protocolMap, inheritanceMap: inheritanceMap) models.append(contentsOf: parentModels) processedModels.append(contentsOf: parentProcessedModels) diff --git a/Sources/MockoloFramework/Utils/StringExtensions.swift b/Sources/MockoloFramework/Utils/StringExtensions.swift index e0f0a890..fb6ffafb 100644 --- a/Sources/MockoloFramework/Utils/StringExtensions.swift +++ b/Sources/MockoloFramework/Utils/StringExtensions.swift @@ -44,7 +44,8 @@ extension String { static let mockType = "protocol" static let unknownVal = "Unknown" static let prefix = "prefix" - static let any = "Any" + static let anyType = "Any" + static let any = "any" static let some = "some" static let anyObject = "AnyObject" static let fatalError = "fatalError" diff --git a/Sources/MockoloFramework/Utils/TypeParser.swift b/Sources/MockoloFramework/Utils/TypeParser.swift index 7de83537..83b893a1 100644 --- a/Sources/MockoloFramework/Utils/TypeParser.swift +++ b/Sources/MockoloFramework/Utils/TypeParser.swift @@ -89,7 +89,7 @@ public final class `Type` { } // Use force unwrapped for the underlying type so it doesn't always have to be set in the init (need to allow blank init). - if hasClosure { + if hasClosure || hasExistentialAny { ret = "(\(ret))!" } else { if isOptional { @@ -129,6 +129,10 @@ public final class `Type` { return typeName.range(of: String.closureArrow) != nil } + var hasExistentialAny: Bool { + return typeName.hasPrefix(.any) + } + var isEscaping: Bool { return typeName.hasPrefix(String.escaping) } @@ -525,16 +529,16 @@ public final class `Type` { if !typeParams.filter({ returnComps.contains($0)}).isEmpty { returnAsStr = returnType.typeName if returnType.isOptional { - displayableReturnType = .any + "?" + displayableReturnType = .anyType + "?" returnAsStr.removeLast() asSuffix = "?" } else if returnType.isIUO { - displayableReturnType = .any + "!" + displayableReturnType = .anyType + "!" returnAsStr.removeLast() } else if returnType.isSelf { returnAsStr = String.`Self` } else { - displayableReturnType = .any + displayableReturnType = .anyType } if !returnAsStr.isEmpty { @@ -598,7 +602,7 @@ public final class `Type` { let left = ret[ret.startIndex.. { get } + var baz: any P & Q { get } + var qux: (any P) -> any P { get } +} +""" + +let existentialAnyMock = +""" +class ExistentialAnyMock: ExistentialAny { + init() { } + init(foo: P, bar: any R, baz: any P & Q, qux: @escaping (any P) -> any P) { + self._foo = foo + self._bar = bar + self._baz = baz + self._qux = qux + } + + + private(set) var fooSetCallCount = 0 + private var _foo: P! { didSet { fooSetCallCount += 1 } } + var foo: P { + get { return _foo } + set { _foo = newValue } + } + + private(set) var barSetCallCount = 0 + private var _bar: (any R)! { didSet { barSetCallCount += 1 } } + var bar: any R { + get { return _bar } + set { _bar = newValue } + } + + private(set) var bazSetCallCount = 0 + private var _baz: (any P & Q)! { didSet { bazSetCallCount += 1 } } + var baz: any P & Q { + get { return _baz } + set { _baz = newValue } + } + + private(set) var quxSetCallCount = 0 + private var _qux: ((any P) -> any P)! { didSet { quxSetCallCount += 1 } } + var qux: (any P) -> any P { + get { return _qux } + set { _qux = newValue } + } +} +"""