Skip to content

Commit

Permalink
Initializer fixit fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
dfed committed Nov 29, 2023
1 parent c592a4d commit 5b64589
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Sources/SafeDICore/Models/Initializer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public struct Initializer: Codable, Equatable {
leadingTrivia: .space,
trailingTrivia: .space),
rightOperand: DeclReferenceExprSyntax(baseName: TokenSyntax.identifier(dependency.property.label)),
trailingTrivia: .newline
trailingTrivia: dependency == dependencies.last ? .newline : nil
)))
)
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/SafeDIMacros/Macros/ConstructableMacro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public struct ConstructableMacro: MemberMacro {
.compactMap({ try? $0.result.get() })
.first
else {
if initializerAndResultPairs.isEmpty {
if !visitor.dependencies.isEmpty || initializerAndResultPairs.isEmpty {
var membersWithInitializer = declaration.memberBlock.members
membersWithInitializer.insert(
MemberBlockItemSyntax(
Expand Down
96 changes: 93 additions & 3 deletions Tests/SafeDIMacrosTests/MacroTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ final class MacroTests: XCTestCase {
@provided
}
""" // fixes is quite wrong here. In Xcode this removes all but the first macro.
""" // fixes are super wrong here. We delete @provided not the rest.
}
}

Expand Down Expand Up @@ -679,14 +679,14 @@ final class MacroTests: XCTestCase {
init() {}
init() {}
""" // fixes are wrong! It's duplicating the correction. not sure why.
""" // this is seriously incorrect – it works in Xcode.
} expansion: {
"""
public struct ExampleService {
init() {}
init() {}
""" // expansion is wrong! It's duplicating the correction. not sure why.
"""
}
}

Expand Down Expand Up @@ -738,5 +738,95 @@ final class MacroTests: XCTestCase {
}
}

func test_constructableMacro_addsFixitMissingRequiredInitializerWhenDependencyMissingFromInit() {
assertMacro {
"""
@constructable
public struct ExampleService {
init(variantA: VariantA, variantB: VariantB) {
self.variantA = variantA
self.variantB = variantB
invariantA = InvariantA()
}
@propagated
let variantA: VariantA
@propagated
let variantB: VariantB
@provided
let invariantA: InvariantA
}
"""
} diagnostics: {
"""
@constructable
public struct ExampleService {
╰─ 🛑 @constructable-decorated type must have initializer for all injected parameters
✏️ Add required initializer
init(variantA: VariantA, variantB: VariantB) {
self.variantA = variantA
self.variantB = variantB
invariantA = InvariantA()
}
@propagated
let variantA: VariantA
@propagated
let variantB: VariantB
@provided
let invariantA: InvariantA
}
"""
} fixes: {
"""
@constructable
public struct ExampleService {
init(variantA: VariantA, variantB: VariantB, invariantA: InvariantA) {
self.variantA = variantA
self.variantB = variantB
self.invariantA = invariantA
}
init(variantA: VariantA, variantB: VariantB) {
self.variantA = variantA
self.variantB = variantB
invariantA = InvariantA()
}
@propagated
let variantA: VariantA
@propagated
let variantB: VariantB
@provided
let invariantA: InvariantA
}
"""
} expansion: {
"""
public struct ExampleService {
init(variantA: VariantA, variantB: VariantB, invariantA: InvariantA) {
self.variantA = variantA
self.variantB = variantB
self.invariantA = invariantA
}
init(variantA: VariantA, variantB: VariantB) {
self.variantA = variantA
self.variantB = variantB
invariantA = InvariantA()
}
let variantA: VariantA
let variantB: VariantB
let invariantA: InvariantA
public init(buildSafeDIDependencies: (VariantA, VariantB) -> (variantA: VariantA, variantB: VariantB, invariantA: InvariantA), variantA: VariantA, variantB: VariantB) {
let dependencies = buildSafeDIDependencies(variantA, variantB)
self.init(variantA: dependencies.variantA, variantB: dependencies.variantB, invariantA: dependencies.invariantA)
}
}
"""
}
}

}
#endif

0 comments on commit 5b64589

Please sign in to comment.