diff options
author | Mark <markya0616@gmail.com> | 2018-03-07 20:34:53 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-03-07 20:34:53 +0800 |
commit | cddb529d701fdb4f1f02fb4c96b5b604617693fe (patch) | |
tree | c16bf3a28d69a3133d2d7c33117bda28e681d238 /accounts/abi/bind/bind.go | |
parent | 63687f04e441c97cbb39d6b0ebea346b154d2e73 (diff) | |
download | dexon-cddb529d701fdb4f1f02fb4c96b5b604617693fe.tar.gz dexon-cddb529d701fdb4f1f02fb4c96b5b604617693fe.tar.zst dexon-cddb529d701fdb4f1f02fb4c96b5b604617693fe.zip |
accounts/abi: normalize method name to a camel-case string (#15976)
Diffstat (limited to 'accounts/abi/bind/bind.go')
-rw-r--r-- | accounts/abi/bind/bind.go | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 7fdd2c624..411177057 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -385,8 +385,7 @@ var methodNormalizer = map[Lang]func(string) string{ LangJava: decapitalise, } -// capitalise makes the first character of a string upper case, also removing any -// prefixing underscores from the variable names. +// capitalise makes a camel-case string which starts with an upper case character. func capitalise(input string) string { for len(input) > 0 && input[0] == '_' { input = input[1:] @@ -394,12 +393,42 @@ func capitalise(input string) string { if len(input) == 0 { return "" } - return strings.ToUpper(input[:1]) + input[1:] + return toCamelCase(strings.ToUpper(input[:1]) + input[1:]) } -// decapitalise makes the first character of a string lower case. +// decapitalise makes a camel-case string which starts with a lower case character. func decapitalise(input string) string { - return strings.ToLower(input[:1]) + input[1:] + for len(input) > 0 && input[0] == '_' { + input = input[1:] + } + if len(input) == 0 { + return "" + } + return toCamelCase(strings.ToLower(input[:1]) + input[1:]) +} + +// toCamelCase converts an under-score string to a camel-case string +func toCamelCase(input string) string { + toupper := false + + result := "" + for k, v := range input { + switch { + case k == 0: + result = strings.ToUpper(string(input[0])) + + case toupper: + result += strings.ToUpper(string(v)) + toupper = false + + case v == '_': + toupper = true + + default: + result += string(v) + } + } + return result } // structured checks whether a list of ABI data types has enough information to |