github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/src/cmd/fix/netipv6zone.go (about)

     1  // Copyright 2012 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import "go/ast"
     8  
     9  func init() {
    10  	register(netipv6zoneFix)
    11  }
    12  
    13  var netipv6zoneFix = fix{
    14  	"netipv6zone",
    15  	"2012-11-26",
    16  	netipv6zone,
    17  	`Adapt element key to IPAddr, UDPAddr or TCPAddr composite literals.
    18  
    19  https://codereview.appspot.com/6849045/
    20  `,
    21  }
    22  
    23  func netipv6zone(f *ast.File) bool {
    24  	if !imports(f, "net") {
    25  		return false
    26  	}
    27  
    28  	fixed := false
    29  	walk(f, func(n interface{}) {
    30  		cl, ok := n.(*ast.CompositeLit)
    31  		if !ok {
    32  			return
    33  		}
    34  		se, ok := cl.Type.(*ast.SelectorExpr)
    35  		if !ok {
    36  			return
    37  		}
    38  		if !isTopName(se.X, "net") || se.Sel == nil {
    39  			return
    40  		}
    41  		switch ss := se.Sel.String(); ss {
    42  		case "IPAddr", "UDPAddr", "TCPAddr":
    43  			for i, e := range cl.Elts {
    44  				if _, ok := e.(*ast.KeyValueExpr); ok {
    45  					break
    46  				}
    47  				switch i {
    48  				case 0:
    49  					cl.Elts[i] = &ast.KeyValueExpr{
    50  						Key:   ast.NewIdent("IP"),
    51  						Value: e,
    52  					}
    53  				case 1:
    54  					if elit, ok := e.(*ast.BasicLit); ok && elit.Value == "0" {
    55  						cl.Elts = append(cl.Elts[:i], cl.Elts[i+1:]...)
    56  					} else {
    57  						cl.Elts[i] = &ast.KeyValueExpr{
    58  							Key:   ast.NewIdent("Port"),
    59  							Value: e,
    60  						}
    61  					}
    62  				}
    63  				fixed = true
    64  			}
    65  		}
    66  	})
    67  	return fixed
    68  }