goreduce
goreduce copied to clipboard
Reduce Go programs
goreduce
Reduce a program to its simplest form as long as it produces a compiler error or any output (such as a panic) matching a regular expression.
go get -u mvdan.cc/goreduce
Example
func main() {
a := []int{1, 2, 3}
if true {
a = append(a, 4)
}
a[1] = -2
println(a[10])
}
goreduce -match 'index out of range' .
func main() {
a := []int{}
println(a[0])
}
For more usage information, see goreduce -h.
Design
- The tool should be reproducible, giving the same output for an input program as long as external factors don't modify its behavior
- The rules should be as simple and composable as possible
- Rules should avoid generating changes that they can know won't compile
Rules
Removing
| Before | After | |
|---|---|---|
| statement | a; b |
a or b |
| index | a[1] |
a |
| slice | a[:2] |
a or a[:] |
| binary part | a + b, a && b |
a or b |
| unary op | -a, !a |
a |
| star | *a |
a |
| parentheses | (a) |
a |
| if/else | if a { b } else c |
b or c |
| defer | defer f() |
f() |
| go | go f() |
f() |
| basic value | 123, "foo" |
0, "" |
| composite value | T{a, b} |
T{} |
Inlining
| Before | After | |
|---|---|---|
| const | const c = 0; f(c) |
f(0) |
| var | v := false; f(v) |
f(false) |
| case | case x: a |
a |
| block | { a } |
a |
| simple call | f() |
{ body } |
Resolving
| Before | After | |
|---|---|---|
| integer op | 2 * 3 |
6 |
| string op | "foo" + "bar" |
"foobar" |
| slice | "foo"[1:] |
"oo" |
| index | "foo"[0] |
'f' |
| builtin | len("foo") |
3 |