func (check *Checker) arityMatch(s, init *ast.ValueSpec) {
	l := len(s.Names)
	r := len(s.Values)
	if init != nil {
		r = len(init.Values)
	}
	switch {
	case init == nil && r == 0:
		if s.Type == nil {
			check.errorf(s.Pos(), "missing type or init expr")
		}
	case l < r:
		if l < len(s.Values) {
			n := s.Values[l]
			check.errorf(n.Pos(), "extra init expr %s", n)
		} else {
			check.errorf(s.Pos(), "extra init expr at %s", init.Pos())
		}
	case l > r && (init != nil || r != 1):
		n := s.Names[r]
		check.errorf(n.Pos(), "missing init expr for %s", n)
	}
}
arityMatch checks that the lhs and rhs of a const or var decl
have the appropriate number of names and init exprs. For const
decls, init is the value spec providing the init exprs; for
var decls, init is nil (the init exprs are in s in this case).
package types
import (
	"errors"
	"fmt"
	"go/ast"
	"go/token"
	pathLib "path"
	"strconv"
	"strings"
	"unicode"
	"github.com/mailgun/godebug/Godeps/_workspace/src/golang.org/x/tools/go/exact"
)
type declInfo struct {
	file  *Scope         
	lhs   []*Var         
	typ   ast.Expr       
	init  ast.Expr       
	fdecl *ast.FuncDecl  
	deps map[Object]bool  
	mark int              
}
func (d *declInfo) hasInitializer() bool {
	return d.init != nil || d.fdecl != nil && d.fdecl.Body != nil
}
func (d *declInfo) addDep(obj Object) {
	m := d.deps
	if m == nil {
		m = make(map[Object]bool)
		d.deps = m
	}
	m[obj] = true
}