in tools/go-agent/tools/dst.go [55:103]
func DeletePackageImports(file dst.Node, imports ...string) {
containsDeletedImport := false
deletedPackages := make(map[string]string)
dstutil.Apply(file, func(cursor *dstutil.Cursor) bool {
switch n := cursor.Node().(type) {
case *dst.ImportSpec:
for _, pkg := range imports {
if n.Path.Value == fmt.Sprintf("%q", pkg) {
containsDeletedImport = true
cursor.Delete()
if n.Name != nil {
deletedPackages[n.Name.Name] = pkg
} else {
deletedPackages[filepath.Base(pkg)] = pkg
}
}
}
return false
case *dst.SelectorExpr:
pkgRefName, ok := n.X.(*dst.Ident)
if !ok {
return true
}
if _, ok := deletedPackages[pkgRefName.Name]; ok {
RemovePackageRef(cursor.Parent(), n, -1)
}
case *dst.CaseClause:
for i, d := range n.List {
if sel, ok := d.(*dst.SelectorExpr); ok {
pkgRefName, ok := sel.X.(*dst.Ident)
if !ok {
return true
}
if _, ok := deletedPackages[pkgRefName.Name]; ok {
RemovePackageRef(n, sel, i)
}
}
}
}
return true
}, func(cursor *dstutil.Cursor) bool {
return true
})
if containsDeletedImport {
RemoveImportDefineIfNoPackage(file)
}
}