goreduce

by mvdan

mvdan / goreduce

Reduce Go programs

202 Stars 6 Forks Last release: Not found BSD 3-Clause "New" or "Revised" License 275 Commits 0 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

goreduce

Build Status

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
|

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.