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 "code.google.com/p/go.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

