Gophers With Hammers

Josh Bleecher Snyder
PayPal
josharian@gmail.com
@offbymany


* Go was designed with tools in mind. (Rob Pike)

* Designed with tools in mind

Simple, regular syntax
Simple semantics
Batteries included

* Tools everywhere

- go
- gofmt, goimports
- godoc
- go test [-cover] [-race]
- go vet
- gofix, gofmt -r, eg
- oracle
- golint
- godep

and more...

* go command

	$ go list -f '{{.Deps}}' bytes
	[errors io runtime sync sync/atomic unicode unicode/utf8 unsafe]

* gofmt

from

	for{
	fmt.Println(      "I feel pretty." );
	       }

to

	for {
		fmt.Println("I feel pretty.")
	}

* godoc

	$ godoc strings Repeat
	func Repeat(s string, count int) string
	    Repeat returns a new string consisting of count copies of the string s.

* go vet

Oops

	if suffix != ".md" || suffix != ".markdown" {

Flagged

	suspect or: suffix != ".md" || suffix != ".markdown"

* go tool cover -mode=set

	func Repeat(s string, count int) string {
		b := make([]byte, len(s)*count)
		bp := 0
		for i := 0; i < count; i++ {
			bp += copy(b[bp:], s)
		}
		return string(b)
	}

to

	func Repeat(s string, count int) string {
		GoCover.Count[0] = 1
		b := make([]byte, len(s)*count)
		bp := 0
		for i := 0; i < count; i++ {
			GoCover.Count[2] = 1
			bp += copy(b[bp:], s)
		}
		GoCover.Count[1] = 1
		return string(b)
	}

* go test -cover

	$ go test -coverprofile=c.out strings
	ok  	strings	0.455s	coverage: 96.9% of statements

	$ go tool cover -func=c.out
	strings/reader.go:	Len				66.7%
	strings/reader.go:	Read				100.0%
	strings/reader.go:	ReadAt				100.0%
	strings/reader.go:	ReadByte			100.0%
	strings/reader.go:	UnreadByte			100.0%
	strings/reader.go:	ReadRune			100.0%
	strings/reader.go:	UnreadRune			100.0%
	strings/reader.go:	Seek				90.9%
	strings/reader.go:	WriteTo				83.3%
	...
	
	$ go tool cover -html=c.out
	# opens a browser window, shows line-by-line coverage


* Tools to make tools

- text/template
- go/build
- go/doc
- go/format
- go/{parser,token,ast,printer}
- go.tools/go/types and friends

and more...

* Hammers are fun!

# Why to write your own tools: Fun, learning, profit

* impl

Generate implementation stubs given an interface.

	go get github.com/josharian/impl

Generate

	$ impl 'f *File' io.Reader
	func (f *File) Read(p []byte) (n int, err error) {
	}

from

	package io

	type Reader interface {
		Read(p []byte) (n int, err error)
	}

* impl

Generate

	$ impl 'f *File' io.ReadWriter
	func (f *File) Read(p []byte) (n int, err error) {
	}

	func (f *File) Write(p []byte) (n int, err error) {
	}

from

	package io

	type ReadWriter interface {
		Reader
		Writer
	}

* impl

Generate

	$ impl 'c *Ctx' http.Handler
	func (c *Ctx) ServeHTTP(http.ResponseWriter, *http.Request) {
	}

from

	package http

	type Handler interface {
		ServeHTTP(ResponseWriter, *Request)
	}

* Plan

*Find*import*path*and*interface*name*

	http.Handler ⇒ net/http, Handler

Parse interface

	net/http, Handler ⇒ {{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}}

Generate output

	{{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}} ⇒ profit!

* goimports ftw

	import "golang.org/x/tools/imports"

.play hammers/importpath.go /func main/,/^}/

* Hello, AST

    *ast.File {
    .  Package: 1:1
    .  Name: *ast.Ident {
    .  .  NamePos: 1:9
    .  .  Name: "hack"
    .  }
    .  Decls: []ast.Decl (len = 2) {
    .  .  0: *ast.GenDecl {
    .  .  .  TokPos: 1:15
    .  .  .  Tok: import
    .  .  .  Lparen: -
    .  .  .  Specs: []ast.Spec (len = 1) {
    .  .  .  .  0: *ast.ImportSpec {
    .  .  .  .  .  Path: *ast.BasicLit {
    .  .  .  .  .  .  ValuePos: 1:22
    .  .  .  .  .  .  Kind: STRING
    .  .  .  .  .  .  Value: "\"net/http\""
    .  .  .  .  .  }

[truncated]


* Extract the import path

	import (
		"go/parser"
		"go/token"
	)

.play hammers/extractpath.go /func main/,/^}/

* Extract the interface name

	import "go/ast"

.play hammers/extractiface.go /func main/,/^}/

A `GenDecl` can have many `Specs`

	var (
		r io.Reader
		w io.Writer
	)

* Plan

Find import path and interface name

	http.Handler ⇒ net/http, Handler

*Parse*interface*

	net/http, Handler ⇒ {{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}}

Generate output

	{{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}} ⇒ profit!

* Data structures

Represent

	Read(p []byte) (n int, err error)

as

	Func{
		Name:   "Read",
		Params: []Param{{Name: "p", Type: "[]byte"}},
		Res: []Param{
			{Name: "n", Type: "int"},
			{Name: "err", Type: "error"},
		},
	},

* Data structures

.code hammers/types.go /type Func/,/^}/
.code hammers/types.go /type Param/,/^}/

* Find the code

	import "go/build"

.play hammers/findthecode.go /func main/,/^}/

* Find the interface declaration

	import "go/printer"

.play hammers/findtheifacedecl.go /func main/,/^}/

* Extract function names

No name? It's an embedded interface. Recurse.

	type ByteScanner interface {
	    ByteReader
	    UnreadByte() error
	}

* Extract params and results

No name? Just use `""`.

	type ByteWriter interface {
	    WriteByte(c byte) error
	}

* Qualify types

Types can be arbitrarily complicated.

	type CrazyGopher interface {
		CrazyGoph(int) func(chan<- [32]byte, map[string]int64) ([]rune, error)
	}

And we need to rewrite some of them.

	int ⇒ int
	*Request ⇒ *http.Request
	io.Reader ⇒ io.Reader
	func(io.Reader, chan map[S][]*T) ⇒ func(io.Reader, chan map[foo.S][]*foo.T))

* Qualify types

.play hammers/fulltype.go /func main/,/end main/

* Plan

Find import path and interface name

	http.Handler ⇒ net/http, Handler

Parse interface

	net/http, Handler ⇒ {{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}}

*Generate*output*

	{{"ServeHTTP", {{"", "http.ResponseWriter"}, {"", "*http.Request"}}, {}}}} ⇒ profit!

* Method type

.code hammers/types.go /type Method/,/^}/
.code hammers/types.go /type Func/,/^}/
.code hammers/types.go /type Param/,/^}/

* Use text/template

.play hammers/codegen.go /func main/,/^}/

# Don't generate an AST. It's a lot of work, and Go is its own DSL.

* Ugly is ok

	import "go/format"

.play hammers/format.go /func main/,/^}/

* Great success

Full code plus tests at `github.com/josharian/impl`

* Tips

Use `go`get`-d` to download lots of code from `godoc.org/-/index`. (Don't forget to set a temporary `GOPATH`!)

Use (and improve) `github.com/yuroyoro/goast-viewer`.

You don't have to generate all the code. And generating data is even better.

The `go/ast` docs are your friend.

`go.tools/go/types` is powerful.

`go`generate` is coming.


* Nails!

- Break up long strings
- Enums and flags to Stringers
- Dynamic code analysis
- Vet checks
- Reflect ⇒ codegen
- Convention-based http dispatch
- Detect "last line" copy/paste bugs
- AST-aware diff, merge, blame; automated fork analysis
- Machine learning models of ASTs: anomaly detection, bug-prone code detection
- Code fingerprinting
- Examine usage patterns
- Compiler stress tests

