github.com/benma/gogen@v0.0.0-20160826115606-cf49914b915a/cleanimports/clean.go (about)

     1  // Package cleanimports provides functionality to clean unused imports from the
     2  // given source code
     3  package cleanimports
     4  
     5  import (
     6  	"go/ast"
     7  	"go/format"
     8  	"go/parser"
     9  	"go/token"
    10  	"io"
    11  	"strings"
    12  
    13  	"golang.org/x/tools/go/ast/astutil"
    14  )
    15  
    16  // Clean writes the clean source to io.Writer. The source can be a io.Reader,
    17  // string or []bytes
    18  func Clean(w io.Writer, src interface{}) error {
    19  	fset := token.NewFileSet()
    20  	file, err := parser.ParseFile(fset, "clean.go", src, parser.ParseComments)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	// Clean unused imports
    25  	imports := astutil.Imports(fset, file)
    26  	for _, group := range imports {
    27  		for _, imp := range group {
    28  			path := strings.Trim(imp.Path.Value, `"`)
    29  			if !astutil.UsesImport(file, path) {
    30  				astutil.DeleteImport(fset, file, path)
    31  			}
    32  		}
    33  	}
    34  	ast.SortImports(fset, file)
    35  	// Write formatted code without unused imports
    36  	return format.Node(w, fset, file)
    37  }