diff --git a/cmd/generate-bindings/solana/anchor-go/generator/accounts.go b/cmd/generate-bindings/solana/anchor-go/generator/accounts.go index efadafe5..9ab08df7 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/accounts.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/accounts.go @@ -154,7 +154,7 @@ func (g *Generator) gen_IDLTypeDefTyStruct( // TODO: optionality for complex enums is a nil interface. uniqueFieldName := uniqueFieldNames[field.Name] - fieldsGroup.Add(genFieldWithName(field, uniqueFieldName, optionality)). + fieldsGroup.Add(g.genFieldWithName(field, uniqueFieldName, optionality)). Add(func() Code { tagMap := map[string]string{} if IsOption(field.Ty) { @@ -180,7 +180,7 @@ func (g *Generator) gen_IDLTypeDefTyStruct( fieldsGroup.Line() optionality := IsOption(field) || IsCOption(field) - fieldsGroup.Add(genFieldNamed( + fieldsGroup.Add(g.genFieldNamed( FormatTupleItemName(fieldIndex), field, optionality, @@ -223,7 +223,7 @@ func (g *Generator) gen_IDLTypeDefTyStruct( // Declare MarshalWithEncoder: // TODO: code.Line().Line().Add( - gen_MarshalWithEncoder_struct( + g.gen_MarshalWithEncoder_struct( g.idl, withDiscriminator, exportedAccountName, @@ -234,7 +234,7 @@ func (g *Generator) gen_IDLTypeDefTyStruct( // Declare UnmarshalWithDecoder code.Line().Line().Add( - gen_UnmarshalWithDecoder_struct( + g.gen_UnmarshalWithDecoder_struct( g.idl, withDiscriminator, exportedAccountName, @@ -284,20 +284,19 @@ func generateUniqueFieldNames(fields []idl.IdlField) map[string]string { return fieldNameMap } -func genField(field idl.IdlField, pointer bool) Code { - return genFieldNamed(field.Name, field.Ty, pointer) +func (g *Generator) genField(field idl.IdlField, pointer bool) Code { + return g.genFieldNamed(field.Name, field.Ty, pointer) } -// genFieldWithName generates a field with a custom field name (for handling duplicates) -func genFieldWithName(field idl.IdlField, fieldName string, pointer bool) Code { - return genFieldNamed(fieldName, field.Ty, pointer) +func (g *Generator) genFieldWithName(field idl.IdlField, fieldName string, pointer bool) Code { + return g.genFieldNamed(fieldName, field.Ty, pointer) } -func genFieldNamed(name string, typ idltype.IdlType, pointer bool) Code { +func (g *Generator) genFieldNamed(name string, typ idltype.IdlType, pointer bool) Code { st := newStatement() st.Id(tools.ToCamelUpper(name)). Add(func() Code { - if isComplexEnum(typ) { + if g.isComplexEnum(typ) { return nil } if pointer { diff --git a/cmd/generate-bindings/solana/anchor-go/generator/complex-enums.go b/cmd/generate-bindings/solana/anchor-go/generator/complex-enums.go index a5bd2bf5..6755fe16 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/complex-enums.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/complex-enums.go @@ -6,33 +6,30 @@ import ( "github.com/gagliardetto/anchor-go/idl/idltype" ) -// typeRegistryComplexEnum contains all types that are a complex enum (and thus implemented as an interface). -var typeRegistryComplexEnum = make(map[string]struct{}) - -func isComplexEnum(envel idltype.IdlType) bool { +func (g *Generator) isComplexEnum(envel idltype.IdlType) bool { switch vv := envel.(type) { case *idltype.Defined: - _, ok := typeRegistryComplexEnum[vv.Name] + _, ok := g.complexEnumRegistry[vv.Name] return ok } return false } -func register_TypeName_as_ComplexEnum(name string) { - typeRegistryComplexEnum[name] = struct{}{} +func (g *Generator) registerComplexEnumType(name string) { + g.complexEnumRegistry[name] = struct{}{} } -func registerComplexEnums(def idl.IdlTypeDef) { +func (g *Generator) registerComplexEnums(def idl.IdlTypeDef) { switch vv := def.Ty.(type) { case *idl.IdlTypeDefTyEnum: enumTypeName := def.Name if !vv.IsAllSimple() { - register_TypeName_as_ComplexEnum(enumTypeName) + g.registerComplexEnumType(enumTypeName) } case idl.IdlTypeDefTyEnum: enumTypeName := def.Name if !vv.IsAllSimple() { - register_TypeName_as_ComplexEnum(enumTypeName) + g.registerComplexEnumType(enumTypeName) } } } diff --git a/cmd/generate-bindings/solana/anchor-go/generator/generator.go b/cmd/generate-bindings/solana/anchor-go/generator/generator.go index 4eddb47d..b95e1bc5 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/generator.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/generator.go @@ -12,8 +12,9 @@ import ( var Debug = false // Set to true to enable debug logging. type Generator struct { - options *GeneratorOptions - idl *idl.Idl + options *GeneratorOptions + idl *idl.Idl + complexEnumRegistry map[string]struct{} } type GeneratorOptions struct { @@ -62,13 +63,14 @@ func (g *Generator) Generate() (*Output, error) { Files: make([]*OutputFile, 0), } + g.complexEnumRegistry = make(map[string]struct{}) + { // Register complex enums. { - // register complex enums: // TODO: .types is the only place where we can find complex enums? (or enums in general?) for _, typ := range g.idl.Types { - registerComplexEnums(typ) + g.registerComplexEnums(typ) } } if len(g.idl.Docs) > 0 { diff --git a/cmd/generate-bindings/solana/anchor-go/generator/instructions.go b/cmd/generate-bindings/solana/anchor-go/generator/instructions.go index 2f8123ba..b0e237b1 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/instructions.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/instructions.go @@ -134,9 +134,9 @@ func (g *Generator) gen_instructions() (*OutputFile, error) { // ) // } checkNil := true - body.BlockFunc(func(g *Group) { - gen_marshal_DefinedFieldsNamed( - g, + body.BlockFunc(func(grp *Group) { + g.gen_marshal_DefinedFieldsNamed( + grp, instruction.Args, checkNil, func(param idl.IdlField) *Statement { diff --git a/cmd/generate-bindings/solana/anchor-go/generator/marshal.go b/cmd/generate-bindings/solana/anchor-go/generator/marshal.go index d5dd14a2..8984cf8c 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/marshal.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/marshal.go @@ -10,7 +10,7 @@ import ( "github.com/gagliardetto/anchor-go/tools" ) -func gen_MarshalWithEncoder_struct( +func (g *Generator) gen_MarshalWithEncoder_struct( idl_ *idl.Idl, withDiscriminator bool, receiverTypeName string, @@ -45,7 +45,7 @@ func gen_MarshalWithEncoder_struct( } switch fields := fields.(type) { case idl.IdlDefinedFieldsNamed: - gen_marshal_DefinedFieldsNamed( + g.gen_marshal_DefinedFieldsNamed( body, fields, checkNil, @@ -60,7 +60,7 @@ func gen_MarshalWithEncoder_struct( ) case idl.IdlDefinedFieldsTuple: convertedFields := tupleToFieldsNamed(fields) - gen_marshal_DefinedFieldsNamed( + g.gen_marshal_DefinedFieldsNamed( body, convertedFields, checkNil, @@ -135,7 +135,7 @@ func gen_MarshalWithEncoder_struct( return code } -func gen_marshal_DefinedFieldsNamed( +func (g *Generator) gen_marshal_DefinedFieldsNamed( body *Group, fields idl.IdlDefinedFieldsNamed, checkNil bool, @@ -152,7 +152,7 @@ func gen_marshal_DefinedFieldsNamed( body.Commentf("Serialize `%s`:", exportedArgName) } - if isComplexEnum(field.Ty) || (IsArray(field.Ty) && isComplexEnum(field.Ty.(*idltype.Array).Type)) || (IsVec(field.Ty) && isComplexEnum(field.Ty.(*idltype.Vec).Vec)) { + if g.isComplexEnum(field.Ty) || (IsArray(field.Ty) && g.isComplexEnum(field.Ty.(*idltype.Array).Type)) || (IsVec(field.Ty) && g.isComplexEnum(field.Ty.(*idltype.Vec).Vec)) { switch field.Ty.(type) { case *idltype.Defined: enumTypeName := field.Ty.(*idltype.Defined).Name diff --git a/cmd/generate-bindings/solana/anchor-go/generator/types.go b/cmd/generate-bindings/solana/anchor-go/generator/types.go index d3822fb1..670b9903 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/types.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/types.go @@ -117,7 +117,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD // Add comments for the enum type: addComments(code, docs) { - register_TypeName_as_ComplexEnum(name) + g.registerComplexEnumType(name) containerName := formatEnumContainerName(enumTypeName) interfaceMethodName := formatInterfaceMethodName(enumTypeName) @@ -259,7 +259,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD case idl.IdlDefinedFieldsNamed: for _, variantField := range fields { optionality := IsOption(variantField.Ty) || IsCOption(variantField.Ty) - structGroup.Add(genField(variantField, optionality)). + structGroup.Add(g.genField(variantField, optionality)). Add(func() Code { tagMap := map[string]string{} if IsOption(variantField.Ty) { @@ -282,7 +282,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD for itemIndex, tupleItem := range fields { optionality := IsOption(tupleItem) || IsCOption(tupleItem) tupleItemName := FormatTupleItemName(itemIndex) - structGroup.Add(genFieldNamed(tupleItemName, tupleItem, optionality)). + structGroup.Add(g.genFieldNamed(tupleItemName, tupleItem, optionality)). Add(func() Code { tagMap := map[string]string{} if IsOption(tupleItem) { @@ -351,7 +351,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD case idl.IdlDefinedFieldsNamed: // Declare MarshalWithEncoder: code.Line().Line().Add( - gen_MarshalWithEncoder_struct( + g.gen_MarshalWithEncoder_struct( g.idl, false, variantTypeNameComplex, @@ -362,7 +362,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD // Declare UnmarshalWithDecoder code.Line().Line().Add( - gen_UnmarshalWithDecoder_struct( + g.gen_UnmarshalWithDecoder_struct( g.idl, false, variantTypeNameComplex, @@ -374,7 +374,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD // TODO: handle tuples // Declare MarshalWithEncoder: code.Line().Line().Add( - gen_MarshalWithEncoder_struct( + g.gen_MarshalWithEncoder_struct( g.idl, false, variantTypeNameComplex, @@ -385,7 +385,7 @@ func (g *Generator) gen_complexEnum(name string, docs []string, typ idl.IdlTypeD // Declare UnmarshalWithDecoder code.Line().Line().Add( - gen_UnmarshalWithDecoder_struct( + g.gen_UnmarshalWithDecoder_struct( g.idl, false, variantTypeNameComplex, diff --git a/cmd/generate-bindings/solana/anchor-go/generator/unmarshal.go b/cmd/generate-bindings/solana/anchor-go/generator/unmarshal.go index 5e7b6a35..7715bff7 100644 --- a/cmd/generate-bindings/solana/anchor-go/generator/unmarshal.go +++ b/cmd/generate-bindings/solana/anchor-go/generator/unmarshal.go @@ -72,7 +72,7 @@ func formatEnumEncoderName(enumTypeName string) string { return "Encode" + enumTypeName } -func gen_UnmarshalWithDecoder_struct( +func (g *Generator) gen_UnmarshalWithDecoder_struct( idl_ *idl.Idl, withDiscriminator bool, receiverTypeName string, @@ -118,10 +118,10 @@ func gen_UnmarshalWithDecoder_struct( switch fields := fields.(type) { case idl.IdlDefinedFieldsNamed: - gen_unmarshal_DefinedFieldsNamed(body, fields) + g.gen_unmarshal_DefinedFieldsNamed(body, fields) case idl.IdlDefinedFieldsTuple: convertedFields := tupleToFieldsNamed(fields) - gen_unmarshal_DefinedFieldsNamed(body, convertedFields) + g.gen_unmarshal_DefinedFieldsNamed(body, convertedFields) case nil: // No fields, just an empty struct. // TODO: should we panic here? @@ -226,7 +226,7 @@ func tupleToFieldsNamed( return fields } -func gen_unmarshal_DefinedFieldsNamed( +func (g *Generator) gen_unmarshal_DefinedFieldsNamed( body *Group, fields idl.IdlDefinedFieldsNamed, ) { @@ -238,7 +238,7 @@ func gen_unmarshal_DefinedFieldsNamed( body.Commentf("Deserialize `%s`:", exportedArgName) } - if isComplexEnum(field.Ty) || (IsArray(field.Ty) && isComplexEnum(field.Ty.(*idltype.Array).Type)) || (IsVec(field.Ty) && isComplexEnum(field.Ty.(*idltype.Vec).Vec)) { + if g.isComplexEnum(field.Ty) || (IsArray(field.Ty) && g.isComplexEnum(field.Ty.(*idltype.Array).Type)) || (IsVec(field.Ty) && g.isComplexEnum(field.Ty.(*idltype.Vec).Vec)) { // TODO: this assumes this cannot be an option; // - check whether this is an option? switch field.Ty.(type) {