| // Copyright 2011 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "go/ast" |
| ) |
| |
| func init() { |
| register(netudpgroupFix) |
| } |
| |
| var netudpgroupFix = fix{ |
| "netudpgroup", |
| "2011-08-18", |
| netudpgroup, |
| `Adapt 1-argument calls of net.(*UDPConn).JoinGroup, LeaveGroup to use 2-argument form. |
| |
| http://codereview.appspot.com/4815074 |
| `, |
| } |
| |
| func netudpgroup(f *ast.File) bool { |
| if !imports(f, "net") { |
| return false |
| } |
| |
| fixed := false |
| for _, d := range f.Decls { |
| fd, ok := d.(*ast.FuncDecl) |
| if !ok || fd.Body == nil { |
| continue |
| } |
| walk(fd.Body, func(n interface{}) { |
| ce, ok := n.(*ast.CallExpr) |
| if !ok { |
| return |
| } |
| se, ok := ce.Fun.(*ast.SelectorExpr) |
| if !ok || len(ce.Args) != 1 { |
| return |
| } |
| switch se.Sel.String() { |
| case "JoinGroup", "LeaveGroup": |
| // c.JoinGroup(a) -> c.JoinGroup(nil, a) |
| // c.LeaveGroup(a) -> c.LeaveGroup(nil, a) |
| arg := ce.Args[0] |
| ce.Args = make([]ast.Expr, 2) |
| ce.Args[0] = ast.NewIdent("nil") |
| ce.Args[1] = arg |
| fixed = true |
| } |
| }) |
| } |
| return fixed |
| } |