generateGroupedCaseWithAssignment generates a single case clause with assignment for a group.
(group *armGroup, varName string, typeSwitch bool)
| 373 | |
| 374 | // generateGroupedCaseWithAssignment generates a single case clause with assignment for a group. |
| 375 | func (g *MatchCodeGen) generateGroupedCaseWithAssignment(group *armGroup, varName string, typeSwitch bool) { |
| 376 | if len(group.arms) == 0 { |
| 377 | return |
| 378 | } |
| 379 | |
| 380 | firstArm := group.arms[0] |
| 381 | |
| 382 | // Generate case clause header |
| 383 | if group.isDefault { |
| 384 | g.Write("default:\n") |
| 385 | } else if lit, ok := firstArm.Pattern.(*ast.LiteralPattern); ok { |
| 386 | g.Write("case " + lit.Value + ":\n") |
| 387 | } else { |
| 388 | g.Write("case " + group.typeName + ":\n") |
| 389 | } |
| 390 | |
| 391 | // Extract bindings from first arm |
| 392 | var bindings []Binding |
| 393 | if cp, ok := firstArm.Pattern.(*ast.ConstructorPattern); ok { |
| 394 | numParams := len(cp.Params) |
| 395 | isTupleVariant := g.isTupleVariant(group.typeName) |
| 396 | for i, param := range cp.Params { |
| 397 | bindings = append(bindings, g.extractBindings(param, i, numParams, isTupleVariant)...) |
| 398 | } |
| 399 | } else if vp, ok := firstArm.Pattern.(*ast.VariablePattern); ok { |
| 400 | bindings = []Binding{{Name: vp.Name, FieldPath: ""}} |
| 401 | } |
| 402 | |
| 403 | // Generate bindings once |
| 404 | for _, binding := range bindings { |
| 405 | bindingCode := binding.Name + " := " |
| 406 | if binding.FieldPath != "" { |
| 407 | tempVar := g.scrutineeTempVar |
| 408 | if tempVar == "" { |
| 409 | tempVar = "v" |
| 410 | } |
| 411 | bindingCode += tempVar + "." + binding.FieldPath |
| 412 | } else { |
| 413 | scrutineeResult := GenerateExpr(g.Match.Scrutinee) |
| 414 | bindingCode += string(scrutineeResult.Output) |
| 415 | } |
| 416 | bindingCode += "\n" |
| 417 | g.Write(bindingCode) |
| 418 | } |
| 419 | |
| 420 | // Generate if/else chain for multiple arms (guards) with assignment |
| 421 | g.generateArmsChainWithAssignment(group.arms, varName) |
| 422 | } |
| 423 | |
| 424 | // generateArmsChainWithAssignment generates an if/else chain with assignments. |
| 425 | func (g *MatchCodeGen) generateArmsChainWithAssignment(arms []*ast.MatchArm, varName string) { |
no test coverage detected