func (c *codeSet) intersection(a *codeSet) *codeSet {
	res := newCodeSet()
	for elem := range c.set {
		if a.has(elem) {
			res.add(elem)
		}
	}
	return res
}
intersection returns a new set which is the intersection of c and a
package main
import (
	"bufio"
	"bytes"
	"flag"
	"fmt"
	"go/ast"
	"go/format"
	"go/parser"
	"go/token"
	"io"
	"io/ioutil"
	"log"
	"os"
	"path"
	"path/filepath"
	"regexp"
	"strconv"
	"strings"
)
const validGOOS = "aix|darwin|dragonfly|freebsd|linux|netbsd|openbsd|solaris"
func getValidGOOS(filename string) (string, bool) {
	matches := regexp.MustCompile(`_(` + validGOOS + `)\.go$`).FindStringSubmatch(filename)
	if len(matches) != 2 {
		return "", false
	}
	return matches[1], true
}
type codeElem struct {
	tok token.Token  
	src string       
}
func newCodeElem(tok token.Token, node ast.Node) (codeElem, error) {
	var b strings.Builder
	err := format.Node(&b, token.NewFileSet(), node)
	if err != nil {
		return codeElem{}, err
	}
	return codeElem{tok, b.String()}, nil
}
type codeSet struct {
	set map[codeElem]bool  
}
func newCodeSet() *codeSet { return &codeSet{make(map[codeElem]bool)} }
func (c *codeSet) add(elem codeElem) { c.set[elem] = true }
func (c *codeSet) has(elem codeElem) bool { return c.set[elem] }
func (c *codeSet) isEmpty() bool { return len(c.set) == 0 }