isReferencableType checks if a type is referencable (needs reference tracking)
(t types.Type)
| 713 | |
| 714 | // isReferencableType checks if a type is referencable (needs reference tracking) |
| 715 | func isReferencableType(t types.Type) bool { |
| 716 | // Handle pointer types |
| 717 | if _, ok := t.(*types.Pointer); ok { |
| 718 | return true |
| 719 | } |
| 720 | |
| 721 | // Basic types and their underlying types |
| 722 | if basic, ok := t.Underlying().(*types.Basic); ok { |
| 723 | return basic.Kind() == types.String |
| 724 | } |
| 725 | |
| 726 | // Slices, maps, and interfaces are referencable |
| 727 | switch t.Underlying().(type) { |
| 728 | case *types.Slice, *types.Map, *types.Interface: |
| 729 | return true |
| 730 | } |
| 731 | |
| 732 | // Structs are referencable |
| 733 | if _, ok := t.Underlying().(*types.Struct); ok { |
| 734 | return true |
| 735 | } |
| 736 | |
| 737 | return false |
| 738 | } |
| 739 | |
| 740 | // generateMapKeyWrite generates code to write a map key |
| 741 | func generateMapKeyWrite(buf *bytes.Buffer, keyType types.Type, varName string) error { |
no test coverage detected