@@ -1228,7 +1228,8 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
12281228 =>
12291229 ( equality_type_constraint left: { left} right: { right} )
12301230 ) ,
1231- // Class declaration with body containing members
1231+ // Class declaration with body containing members. If the class has no
1232+ // explicit initializer, add Swift's implicit parameter-less `init`.
12321233 rule!(
12331234 ( classDecl
12341235 classKeyword: @@kind
@@ -1241,15 +1242,29 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
12411242 genericWhereClause: ( genericWhereClause requirements: _* @declaration_constraints) ?
12421243 memberBlock: ( memberBlock members: _* @members) )
12431244 =>
1244- ( class_like_declaration
1245- modifier: ( modifier #{ kind} )
1246- modifier: { mods}
1247- name_node: ( identifier #{ name} )
1248- type_parameter: { params}
1249- type_constraint: { parameter_constraints}
1250- type_constraint: { declaration_constraints}
1251- base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
1252- member: { members} )
1245+ class_like_declaration {
1246+ let has_explicit_initializer = members. iter( ) . any( |member| {
1247+ ctx. ast
1248+ . get_node( * member)
1249+ . is_some_and( |node| node. kind_name( ) == "constructor_declaration" )
1250+ } ) ;
1251+ let implicit_initializer = ( !has_explicit_initializer) . then( || {
1252+ tree!( ( constructor_declaration
1253+ modifier: ( modifier "generated" )
1254+ name_node: ( identifier "init" )
1255+ body: ( block) ) )
1256+ } ) ;
1257+ tree!( ( class_like_declaration
1258+ modifier: ( modifier #{ kind} )
1259+ modifier: { mods}
1260+ name_node: ( identifier #{ name} )
1261+ type_parameter: { params}
1262+ type_constraint: { parameter_constraints}
1263+ type_constraint: { declaration_constraints}
1264+ base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
1265+ member: { members}
1266+ member: { implicit_initializer} ) )
1267+ }
12531268 ) ,
12541269 // Enum class declaration: same as a regular class but with an enum body.
12551270 rule!(
0 commit comments