@@ -72,36 +72,38 @@ extension VariableDeclSyntax {
7272 return nil
7373 }
7474
75- var getter : CodeBlockItemListSyntax ? {
75+ func asMigrationsArray ( in context : some MacroExpansionContext ) -> [ ( String , ExprSyntax ) ] {
7676 for binding in bindings {
77- guard let accessorBlock = binding. accessorBlock,
78- // TODO: Handle explicit `get {}`, seems different than the `.getter`
79- case let . getter( getter) = accessorBlock. accessors else { return nil }
80- return getter
77+ if let accessorBlock = binding. accessorBlock,
78+ case let . getter( getter) = accessorBlock. accessors {
79+ // Has a getter block `{ return [] }`
80+ guard let stmt = getter. last? . item, getter. count == 1 else {
81+ context. addDiagnostics ( from: SyntaxError ( " Migrations must have one statement returning [String] " ) , node: self )
82+ return [ ]
83+ }
84+
85+ if let ret = stmt. as ( ReturnStmtSyntax . self) , let expr = ret. expression {
86+ return getMigrationsArray ( expr: expr, in: context)
87+ } else if let expr = stmt. as ( ExprSyntax . self) {
88+ return getMigrationsArray ( expr: expr, in: context)
89+ } else {
90+ context. addDiagnostics ( from: SyntaxError ( " Must be return statement " ) , node: self )
91+ return [ ]
92+ }
93+ } else if let initializer = binding. initializer {
94+ // Set with a value `ident = value`
95+ return getMigrationsArray ( expr: initializer. value, in: context)
96+ }
8197 }
8298
83- return nil
99+ context. addDiagnostics ( from: SyntaxError ( " Must have a getter that returns [String] " ) , node: self )
100+ return [ ]
84101 }
85102
86- func asMigrationsArray ( in context: some MacroExpansionContext ) -> [ ( String , ExprSyntax ) ] {
103+ func getMigrationsArray ( expr : ExprSyntax , in context: some MacroExpansionContext ) -> [ ( String , ExprSyntax ) ] {
87104 var strings : [ ( String , ExprSyntax ) ] = [ ]
88105
89- guard let getter else {
90- context. addDiagnostics ( from: SyntaxError ( " Must have a getter that returns [String] " ) , node: self )
91- return strings
92- }
93-
94- guard let stmt = getter. last? . item, getter. count == 1 else {
95- context. addDiagnostics ( from: SyntaxError ( " Migrations must have one statement returning [String] " ) , node: self )
96- return strings
97- }
98-
99- guard let ret = stmt. as ( ReturnStmtSyntax . self) else {
100- context. addDiagnostics ( from: SyntaxError ( " Must be return statement " ) , node: self )
101- return strings
102- }
103-
104- guard let array = ret. expression? . as ( ArrayExprSyntax . self) else {
106+ guard let array = expr. as ( ArrayExprSyntax . self) else {
105107 context. addDiagnostics ( from: SyntaxError ( " Migrations must return an array literal " ) , node: self )
106108 return strings
107109 }
0 commit comments