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 |