Skip to content
This repository has been archived by the owner on Mar 19, 2024. It is now read-only.

mvdan/goreduce

Folders and files

NameName
Last commit message
Last commit date

Latest commit

50b0d7f · Mar 19, 2024
Dec 25, 2020
Oct 8, 2017
Feb 7, 2017
Jan 19, 2017
Mar 19, 2024
Jul 20, 2019
Jul 20, 2019
May 25, 2022
Mar 6, 2019
Jun 21, 2017
Oct 9, 2017
Oct 9, 2017

Repository files navigation

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