Skip to content

Commit 69d204f

Browse files
committed
add disableGenerateInit, developer can create initializer manually.
1 parent 5ef939b commit 69d204f

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

Sources/CoreDataEvolution/Macros.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Foundation
99

1010
@attached(member, names: named(modelExecutor), named(modelContainer), named(init))
1111
@attached(extension, conformances: NSModelActor)
12-
public macro NSModelActor() = #externalMacro(module: "CoreDataEvolutionMacros", type: "NSModelActorMacro")
12+
public macro NSModelActor(disableGenerateInit: Bool = false) = #externalMacro(module: "CoreDataEvolutionMacros", type: "NSModelActorMacro")
1313

1414
@attached(member, names: named(modelExecutor), named(modelContainer), named(init))
1515
@attached(extension, conformances: NSMainModelActor)

Sources/CoreDataEvolutionMacros/NSModelActorMacro.swift

+43-24
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,53 @@ import SwiftSyntaxMacros
3333
public enum NSModelActorMacro {}
3434

3535
extension NSModelActorMacro: ExtensionMacro {
36-
public static func expansion(of _: SwiftSyntax.AttributeSyntax, attachedTo _: some SwiftSyntax.DeclGroupSyntax, providingExtensionsOf type: some SwiftSyntax.TypeSyntaxProtocol, conformingTo _: [SwiftSyntax.TypeSyntax], in _: some SwiftSyntaxMacros.MacroExpansionContext) throws -> [SwiftSyntax.ExtensionDeclSyntax] {
37-
let decl: DeclSyntax =
38-
"""
39-
extension \(type.trimmed): CoreDataEvolution.NSModelActor {}
40-
"""
36+
public static func expansion(of _: SwiftSyntax.AttributeSyntax, attachedTo _: some SwiftSyntax.DeclGroupSyntax, providingExtensionsOf type: some SwiftSyntax.TypeSyntaxProtocol, conformingTo _: [SwiftSyntax.TypeSyntax], in _: some SwiftSyntaxMacros.MacroExpansionContext) throws -> [SwiftSyntax.ExtensionDeclSyntax] {
37+
let decl: DeclSyntax =
38+
"""
39+
extension \(type.trimmed): CoreDataEvolution.NSModelActor {}
40+
"""
4141

42-
guard let extensionDecl = decl.as(ExtensionDeclSyntax.self) else {
43-
return []
44-
}
42+
guard let extensionDecl = decl.as(ExtensionDeclSyntax.self) else {
43+
return []
44+
}
4545

46-
return [extensionDecl]
47-
}
46+
return [extensionDecl]
47+
}
4848
}
4949

5050
extension NSModelActorMacro: MemberMacro {
51-
public static func expansion(of _: AttributeSyntax, providingMembersOf _: some DeclGroupSyntax, conformingTo _: [TypeSyntax], in _: some MacroExpansionContext) throws -> [DeclSyntax] {
52-
[
53-
"""
54-
public nonisolated let modelExecutor: CoreDataEvolution.NSModelObjectContextExecutor
55-
public nonisolated let modelContainer: CoreData.NSPersistentContainer
51+
public static func expansion(
52+
of node: AttributeSyntax,
53+
providingMembersOf _: some DeclGroupSyntax,
54+
conformingTo _: [TypeSyntax],
55+
in _: some MacroExpansionContext
56+
) throws -> [DeclSyntax] {
57+
var generateInitializer = true
58+
if let argumentList = node.arguments?.as(LabeledExprListSyntax.self) {
59+
for argument in argumentList {
60+
if argument.label?.text == "disableGenerateInit",
61+
let booleanLiteral = argument.expression.as(BooleanLiteralExprSyntax.self)
62+
{
63+
generateInitializer = booleanLiteral.literal.text != "true"
64+
}
65+
}
66+
}
5667

57-
public init(container: CoreData.NSPersistentContainer) {
58-
let context: NSManagedObjectContext
59-
context = container.newBackgroundContext()
60-
modelExecutor = CoreDataEvolution.NSModelObjectContextExecutor(context: context)
61-
modelContainer = container
62-
}
63-
""",
64-
]
65-
}
68+
let decl: DeclSyntax =
69+
"""
70+
public nonisolated let modelExecutor: CoreDataEvolution.NSModelObjectContextExecutor
71+
public nonisolated let modelContainer: CoreData.NSPersistentContainer
72+
73+
"""
74+
let initializer: DeclSyntax = generateInitializer ?
75+
"""
76+
public init(container: CoreData.NSPersistentContainer) {
77+
let context: NSManagedObjectContext
78+
context = container.newBackgroundContext()
79+
modelExecutor = CoreDataEvolution.NSModelObjectContextExecutor(context: context)
80+
modelContainer = container
81+
}
82+
""" : ""
83+
return [decl, initializer]
84+
}
6685
}

0 commit comments

Comments
 (0)