Skip to content

Commit 2011813

Browse files
committed
fix: automockable no optional properties and throw functions
1 parent c37cddc commit 2011813

File tree

8 files changed

+70
-18
lines changed

8 files changed

+70
-18
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
# [0.2.4] - 2024-11-14
9+
10+
### Fixed
11+
12+
- Add support to thrown functions
13+
- Fix support to no optional properties
14+
815
# [0.2.3] - 2024-11-06
916

1017
### Fixed

Sources/SageSwiftKitClient/main.swift

+2-9
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,7 @@ struct PlayingObject {
3737
}
3838

3939

40-
41-
protocol Foo {
42-
}
43-
44-
protocol FooA {
45-
}
46-
4740
@AutoMockable()
48-
protocol Bar: Foo, FooA {
49-
var foo: String { set get }
41+
public protocol DateSelectorViewModel {
42+
func make() throws -> String
5043
}

Sources/SageSwiftKitMacros/MockableMacros/AutoMockableBuilder.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ public enum AutoMockable: PeerMacro {
109109
accessLevel: accessLevel.tokenSyntax
110110
)
111111

112-
varConformance.build()
113112
varConformance.buildReturnVar()
113+
varConformance.build()
114114
}
115115

116116
// Implementation of each function

Sources/SageSwiftKitMacros/MockableMacros/Auxiliars/Builders/ClassMockForFunctionBuilder.swift

+16-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import SwiftSyntaxBuilder
1111
struct ClassMockForFunctionBuilder {
1212
let funcData: FunctionsMockData
1313

14-
var parametersName: String { "Parameters" }
14+
var parametersName: String { "ParametersMock" }
1515
var callsName: String { "calls" }
1616

1717
init(funcData: FunctionsMockData) {
@@ -51,6 +51,21 @@ struct ClassMockForFunctionBuilder {
5151
)
5252
}
5353

54+
if funcData.needThrows {
55+
VariableDeclSyntax(
56+
modifiers: .init(itemsBuilder: {
57+
.init(name: funcData.accessLevel)
58+
}),
59+
Keyword.var,
60+
name: "returnError",
61+
type: TypeAnnotationSyntax(
62+
type: OptionalTypeSyntax(
63+
wrappedType: IdentifierTypeSyntax(name: "Error")
64+
)
65+
)
66+
)
67+
}
68+
5469
InitializerDeclSyntax(
5570
signature: .init(parameterClause: .init(
5671
parameters: .init(itemsBuilder: {

Sources/SageSwiftKitMacros/MockableMacros/Auxiliars/Builders/ProtocolFunctionsConformanceBuilder.swift

+30
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ struct ProtocolFunctionsConformanceBuilder {
2929
body: .init(statements: .init(itemsBuilder: {
3030
buildCall()
3131

32+
if data.needThrows {
33+
buildThrow()
34+
}
35+
3236
if data.returnValue != nil {
3337
buildReturn()
3438
}
@@ -66,6 +70,32 @@ struct ProtocolFunctionsConformanceBuilder {
6670
)
6771
}
6872

73+
private func buildThrow() -> CodeBlockItemSyntax {
74+
CodeBlockItemSyntax(
75+
item: .expr(ExprSyntax(
76+
fromProtocol: IfExprSyntax(
77+
conditions: ConditionElementListSyntax(itemsBuilder: {
78+
OptionalBindingConditionSyntax(
79+
bindingSpecifier: .keyword(.let),
80+
pattern: IdentifierPatternSyntax(identifier: "error"),
81+
initializer: InitializerClauseSyntax(
82+
equal: .equalToken(),
83+
value: DeclReferenceExprSyntax(
84+
baseName: "\(mockEntity).returnError".tokenSyntax
85+
)
86+
)
87+
)
88+
}),
89+
body: CodeBlockSyntax(
90+
statements: .init(itemsBuilder: {
91+
ThrowStmtSyntax(expression: DeclReferenceExprSyntax(baseName: "error"))
92+
})
93+
)
94+
)
95+
))
96+
)
97+
}
98+
6999
private func buildReturn() -> ReturnStmtSyntax {
70100
return ReturnStmtSyntax(
71101
returnKeyword: .keyword(.return),

Sources/SageSwiftKitMacros/MockableMacros/Auxiliars/Builders/ProtocolVarsConformanceBuilder.swift

+8-3
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@ struct ProtocolVarsConformanceBuilder {
2424
return nil
2525
}
2626

27-
guard let typeSyntax = myType.type.as(IdentifierTypeSyntax.self) else {
28-
return myType
27+
if let optional = myType.type.as(OptionalTypeSyntax.self) {
28+
return TypeAnnotationSyntax(type: optional)
2929
}
3030

31-
return TypeAnnotationSyntax(type: TypeSyntax(stringLiteral: "\(typeSyntax.name.text)!"))
31+
return TypeAnnotationSyntax(
32+
type: ImplicitlyUnwrappedOptionalTypeSyntax(
33+
wrappedType: myType.type.trimmed,
34+
exclamationMark: .exclamationMarkToken()
35+
)
36+
)
3237
}
3338

3439
init(

Sources/SageSwiftKitMacros/MockableMacros/Auxiliars/FunctionsMockData.swift

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ struct FunctionsMockData {
3333

3434
var mocksVarName: String { "mock" }
3535

36+
var needThrows: Bool { syntax.signature.effectSpecifiers?.throwsSpecifier != nil }
37+
3638
init(syntax: FunctionDeclSyntax, accessLevel: TokenSyntax) {
3739
self.syntax = syntax
3840
self.name = syntax.name

Tests/SageSwiftKitTests/MockableMacrosTests/MockableMacrosTests.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ final class MockableMacrosTests: XCTestCase {
3535
internal init() {
3636
}
3737
internal class TmpFunc_Value {
38-
internal struct Parameters {
38+
internal struct ParametersMock {
3939
internal let value: String
4040
}
41-
internal var calls: [Parameters] = []
42-
internal var lastCall: Parameters? {
41+
internal var calls: [ParametersMock] = []
42+
internal var lastCall: ParametersMock? {
4343
return self.calls.last
4444
}
4545
internal var called: Bool {
@@ -53,6 +53,7 @@ final class MockableMacrosTests: XCTestCase {
5353
internal var tmpFunc_Value = TmpFunc_Value()
5454
}
5555
internal var mock = FunctionMocks()
56+
internal var valueReturn: String?
5657
internal var value: String? {
5758
get {
5859
return valueReturn
@@ -61,7 +62,6 @@ final class MockableMacrosTests: XCTestCase {
6162
self.valueReturn = newValue
6263
}
6364
}
64-
internal var valueReturn: String?
6565
internal func tmpFunc(value: String) -> Int {
6666
self.mock.tmpFunc_Value.calls.append(.init(value: value))
6767
return self.mock.tmpFunc_Value.returnValue

0 commit comments

Comments
 (0)