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
Note that this project isn't being actively developed right now.
If you are interested in continuing the work, feel free to fork the repository,
or email me to discuss transferring the entire repository over.
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 |