@@ -185,6 +185,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
185185 // the target AST has no expression-level discard (only `ignore_pattern`,
186186 // which is a pattern), so it becomes a `name_expr` over the `_` token.
187187 rule!( ( discardAssignmentExpr wildcard: @@w) => ( name_expr identifier: ( identifier #{ w} ) ) ) ,
188+ // A generic specialization in expression position (`C<Foo>`,
189+ // `Array<Int>`) is represented by swift-syntax as a
190+ // `genericSpecializationExpr`. When used as a call target
191+ // (`C<Foo>()`), this should become a `call_expr` whose callee is a
192+ // `generic_type_expr`, so we map it directly to that shape.
193+ rule!(
194+ ( genericSpecializationExpr
195+ expression: ( declReferenceExpr baseName: @name)
196+ genericArgumentClause: ( genericArgumentClause arguments: ( genericArgument argument: @args) * ) )
197+ =>
198+ ( generic_type_expr
199+ base: ( named_type_expr name: ( identifier #{ name} ) )
200+ type_argument: { args} )
201+ ) ,
188202 // ---- Operators ----
189203 // The parser front-end folds operator chains into nested
190204 // `infixOperatorExpr`s by precedence (see swift-syntax-rs), so
@@ -568,26 +582,30 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
568582 rule!(
569583 ( functionDecl
570584 name: @name
585+ genericParameterClause: ( genericParameterClause parameters: _* @type_params) ?
571586 signature: ( functionSignature
572587 parameterClause: ( functionParameterClause parameters: _* @params)
573588 returnClause: ( returnClause type : @ret) ?)
574589 body: ( codeBlock statements: _* @body) )
575590 =>
576591 ( function_declaration
577592 name: ( identifier #{ name} )
593+ type_parameter: { type_params}
578594 parameter: { params}
579595 return_type: { ret}
580596 body: ( block stmt: { body} ) )
581597 ) ,
582598 rule!(
583599 ( functionDecl
584600 name: @name
601+ genericParameterClause: ( genericParameterClause parameters: _* @type_params) ?
585602 signature: ( functionSignature
586603 parameterClause: ( functionParameterClause parameters: _* @params)
587604 returnClause: ( returnClause type : @ret) ?) )
588605 =>
589606 ( function_declaration
590607 name: ( identifier #{ name} )
608+ type_parameter: { type_params}
591609 parameter: { params}
592610 return_type: { ret}
593611 body: ( block) )
@@ -1065,19 +1083,51 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10651083 // A nominal type's `inheritanceClause` (`: Base, Proto`) becomes a list
10661084 // of `base_type`s, one per inherited type. Each declaration keyword
10671085 // gets its own rule; the bodies are identical but for the keyword.
1086+ rule!(
1087+ ( genericParameter
1088+ attributes: _* @attrs
1089+ specifier: _? @@spec
1090+ name: @@name
1091+ inheritedType: _? @bound)
1092+ =>
1093+ ( type_parameter
1094+ modifier: { attrs}
1095+ modifier: ( modifier #{ spec} ) ?
1096+ name: ( identifier #{ name} )
1097+ bound: { bound} )
1098+ ) ,
1099+ rule!(
1100+ ( genericRequirement
1101+ requirement: ( conformanceRequirement leftType: @ty rightType: @bound) )
1102+ =>
1103+ ( bound_type_constraint type : { ty} bound: { bound} )
1104+ ) ,
1105+ rule!(
1106+ ( genericRequirement
1107+ requirement: ( sameTypeRequirement leftType: @left rightType: @right) )
1108+ =>
1109+ ( equality_type_constraint left: { left} right: { right} )
1110+ ) ,
10681111 // Class declaration with body containing members
10691112 rule!(
10701113 ( classDecl
10711114 classKeyword: @kind
10721115 modifiers: _* @mods
10731116 name: @name
1117+ genericParameterClause: ( genericParameterClause
1118+ parameters: _* @params
1119+ genericWhereClause: ( genericWhereClause requirements: _* @parameter_constraints) ?) ?
10741120 inheritanceClause: ( inheritanceClause inheritedTypes: ( inheritedType type : @bases) * ) ?
1121+ genericWhereClause: ( genericWhereClause requirements: _* @declaration_constraints) ?
10751122 memberBlock: ( memberBlock members: _* @members) )
10761123 =>
10771124 ( class_like_declaration
10781125 modifier: ( modifier #{ kind} )
10791126 modifier: { mods}
10801127 name: ( identifier #{ name} )
1128+ type_parameter: { params}
1129+ type_constraint: { parameter_constraints}
1130+ type_constraint: { declaration_constraints}
10811131 base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
10821132 member: { members} )
10831133 ) ,
@@ -1087,13 +1137,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10871137 enumKeyword: @kind
10881138 modifiers: _* @mods
10891139 name: @name
1140+ genericParameterClause: ( genericParameterClause
1141+ parameters: _* @params
1142+ genericWhereClause: ( genericWhereClause requirements: _* @parameter_constraints) ?) ?
10901143 inheritanceClause: ( inheritanceClause inheritedTypes: ( inheritedType type : @bases) * ) ?
1144+ genericWhereClause: ( genericWhereClause requirements: _* @declaration_constraints) ?
10911145 memberBlock: ( memberBlock members: _* @members) )
10921146 =>
10931147 ( class_like_declaration
10941148 modifier: ( modifier #{ kind} )
10951149 modifier: { mods}
10961150 name: ( identifier #{ name} )
1151+ type_parameter: { params}
1152+ type_constraint: { parameter_constraints}
1153+ type_constraint: { declaration_constraints}
10971154 base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
10981155 member: { members} )
10991156 ) ,
@@ -1103,13 +1160,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11031160 structKeyword: @kind
11041161 modifiers: _* @mods
11051162 name: @name
1163+ genericParameterClause: ( genericParameterClause
1164+ parameters: _* @params
1165+ genericWhereClause: ( genericWhereClause requirements: _* @parameter_constraints) ?) ?
11061166 inheritanceClause: ( inheritanceClause inheritedTypes: ( inheritedType type : @bases) * ) ?
1167+ genericWhereClause: ( genericWhereClause requirements: _* @declaration_constraints) ?
11071168 memberBlock: ( memberBlock members: _* @members) )
11081169 =>
11091170 ( class_like_declaration
11101171 modifier: ( modifier #{ kind} )
11111172 modifier: { mods}
11121173 name: ( identifier #{ name} )
1174+ type_parameter: { params}
1175+ type_constraint: { parameter_constraints}
1176+ type_constraint: { declaration_constraints}
11131177 base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
11141178 member: { members} )
11151179 ) ,
@@ -1119,13 +1183,17 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11191183 protocolKeyword: @kind
11201184 modifiers: _* @mods
11211185 name: @name
1186+ genericParameterClause: ( genericParameterClause parameters: _* @params) ?
11221187 inheritanceClause: ( inheritanceClause inheritedTypes: ( inheritedType type : @bases) * ) ?
1188+ genericWhereClause: ( genericWhereClause requirements: _* @declaration_constraints) ?
11231189 memberBlock: ( memberBlock members: _* @members) )
11241190 =>
11251191 ( class_like_declaration
11261192 modifier: ( modifier #{ kind} )
11271193 modifier: { mods}
11281194 name: ( identifier #{ name} )
1195+ type_parameter: { params}
1196+ type_constraint: { declaration_constraints}
11291197 base_type: { bases. into_iter( ) . map( |ty| tree!( ( base_type type : { ty} ) ) ) }
11301198 member: { members} )
11311199 ) ,
@@ -1180,11 +1248,13 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11801248 ( typeAliasDecl
11811249 modifiers: _* @mods
11821250 name: @@name
1251+ genericParameterClause: ( genericParameterClause parameters: _* @type_params) ?
11831252 initializer: ( typeInitializerClause value: @val) )
11841253 =>
11851254 ( type_alias_declaration
11861255 modifier: { mods}
11871256 name: ( identifier #{ name} )
1257+ type_parameter: { type_params}
11881258 r#type: { val} )
11891259 ) ,
11901260 // Associated type declaration (with optional bound)
0 commit comments