github.com/mavryk-network/mvgo@v1.19.9/internal/parse/fixup.go (about)

     1  package parse
     2  
     3  import "github.com/mavryk-network/mvgo/contract/ast"
     4  
     5  type FixupConfig map[string]FixupStruct
     6  
     7  type FixupStruct struct {
     8  	Name   string
     9  	Equals string
    10  	Fields map[string]string
    11  }
    12  
    13  func Fixup(cfg FixupConfig, structs []*ast.Struct, processNameFunc func(string) string) []*ast.Struct {
    14  	structsByOldName := make(map[string]*ast.Struct)
    15  	for _, s := range structs {
    16  		structsByOldName[processNameFunc(s.Name)] = s
    17  	}
    18  	for name, v := range cfg {
    19  		currentStruct := structsByOldName[name]
    20  		if v.Name != "" {
    21  			currentStruct.Name = v.Name
    22  		}
    23  		for oldF, newF := range v.Fields {
    24  			for i, f := range currentStruct.Fields {
    25  				if processNameFunc(f.Name) == oldF {
    26  					currentStruct.Fields[i].Name = newF
    27  				}
    28  			}
    29  		}
    30  	}
    31  	for name, v := range cfg {
    32  		old := structsByOldName[name]
    33  		if v.Equals != "" {
    34  			*old = *structsByOldName[v.Equals]
    35  			structs = deleteStruct(structs, old)
    36  		}
    37  	}
    38  	return structs
    39  }
    40  
    41  func deleteStruct(structs []*ast.Struct, str *ast.Struct) []*ast.Struct {
    42  	for i, s := range structs {
    43  		if s == str {
    44  			newSlice := make([]*ast.Struct, 0, len(structs)-1)
    45  			newSlice = append(newSlice, structs[:i]...)
    46  			return append(newSlice, structs[i+1:]...)
    47  		}
    48  	}
    49  	return structs
    50  }