Home | History | Annotate | Download | only in fix
      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 	name: "netipv6zone",
     15 	date: "2012-11-26",
     16 	f:    netipv6zone,
     17 	desc: `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 }
     69