GitHub - mmatczuk/go_generics: Templates, generics engine for Go
source link: https://github.com/mmatczuk/go_generics
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
Generics
This project is bazel-free version of Google go_generics tool released with gVisor project.
It allows for generating code from template while still working with standard Go code. A great example of using it is ScyllaDB go-set package.
Installation
go get -u github.com/mmatczuk/go_generics/cmd/go_generics go get -u github.com/mmatczuk/go_generics/cmd/go_merge
go_generics
go_generics
reads a Go source file and writes a new version of that file with a few transformations applied to each. Namely:
- Global types can be explicitly renamed with the -t option. For example, if
-t=A=B
is passed in, all references toA
will be replaced with references toB
; a function declaration like:
func f(arg *A)
would be renamed to:
func f(arg *B)
- Global type definitions and their method sets will be removed when they're being renamed with
-t
. For example, if-t=A=B
is passed in, the following definition and methods that existed in the input file wouldn't exist at all in the output file:
type A struct{} func (*A) f() {}
- All global types, variables, constants and functions (not methods) are prefixed and suffixed based on the option
-prefix
and-suffix
arguments. For example, if-suffix=A
is passed in, the following globals:
func f() type t struct{}
would be renamed to:
func fA() type tA struct{}
Some special tags are also modified. For example:
"state:.(t)"
would become:
"state:.(tA)"
-
The package is renamed to the value via the
-p
argument. -
Value of constants can be modified with
-c
argument. Note that not just the top-level declarations are renamed, all references to them are also properly renamed as well, taking into account visibility rules and shadowing. For example, if-suffix=A
is passed in, the following:
var b = 100 func f() { g(b) b := 0 g(b) }
Would be replaced with:
var bA = 100 func f() { g(bA) b := 0 g(b) }
Note that the second call to g()
kept "b" as an argument because it refers to the local variable "b".
Unfortunately, go_generics
does not handle anonymous fields with renamed types.
go_merge
go_merge
merges multiple Go files into one, may be used in a pipeline before go_generics
.
License
This project is distributed under the Apache 2.0 license. See the LICENSE file for details. It contains software from:
- github.com/google/gvisor, licensed under the Apache 2.0 license.
GitHub star is always appreciated!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK