| // 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(netdialFix) | |
| register(tlsdialFix) | |
| register(netlookupFix) | |
| } | |
| var netdialFix = fix{ | |
| "netdial", | |
| "2011-03-28", | |
| netdial, | |
| `Adapt 3-argument calls of net.Dial to use 2-argument form. | |
| http://codereview.appspot.com/4244055 | |
| `, | |
| } | |
| var tlsdialFix = fix{ | |
| "tlsdial", | |
| "2011-03-28", | |
| tlsdial, | |
| `Adapt 4-argument calls of tls.Dial to use 3-argument form. | |
| http://codereview.appspot.com/4244055 | |
| `, | |
| } | |
| var netlookupFix = fix{ | |
| "netlookup", | |
| "2011-03-28", | |
| netlookup, | |
| `Adapt 3-result calls to net.LookupHost to use 2-result form. | |
| http://codereview.appspot.com/4244055 | |
| `, | |
| } | |
| func netdial(f *ast.File) bool { | |
| if !imports(f, "net") { | |
| return false | |
| } | |
| fixed := false | |
| walk(f, func(n interface{}) { | |
| call, ok := n.(*ast.CallExpr) | |
| if !ok || !isPkgDot(call.Fun, "net", "Dial") || len(call.Args) != 3 { | |
| return | |
| } | |
| // net.Dial(a, "", b) -> net.Dial(a, b) | |
| if !isEmptyString(call.Args[1]) { | |
| warn(call.Pos(), "call to net.Dial with non-empty second argument") | |
| return | |
| } | |
| call.Args[1] = call.Args[2] | |
| call.Args = call.Args[:2] | |
| fixed = true | |
| }) | |
| return fixed | |
| } | |
| func tlsdial(f *ast.File) bool { | |
| if !imports(f, "crypto/tls") { | |
| return false | |
| } | |
| fixed := false | |
| walk(f, func(n interface{}) { | |
| call, ok := n.(*ast.CallExpr) | |
| if !ok || !isPkgDot(call.Fun, "tls", "Dial") || len(call.Args) != 4 { | |
| return | |
| } | |
| // tls.Dial(a, "", b, c) -> tls.Dial(a, b, c) | |
| if !isEmptyString(call.Args[1]) { | |
| warn(call.Pos(), "call to tls.Dial with non-empty second argument") | |
| return | |
| } | |
| call.Args[1] = call.Args[2] | |
| call.Args[2] = call.Args[3] | |
| call.Args = call.Args[:3] | |
| fixed = true | |
| }) | |
| return fixed | |
| } | |
| func netlookup(f *ast.File) bool { | |
| if !imports(f, "net") { | |
| return false | |
| } | |
| fixed := false | |
| walk(f, func(n interface{}) { | |
| as, ok := n.(*ast.AssignStmt) | |
| if !ok || len(as.Lhs) != 3 || len(as.Rhs) != 1 { | |
| return | |
| } | |
| call, ok := as.Rhs[0].(*ast.CallExpr) | |
| if !ok || !isPkgDot(call.Fun, "net", "LookupHost") { | |
| return | |
| } | |
| if !isBlank(as.Lhs[2]) { | |
| warn(as.Pos(), "call to net.LookupHost expecting cname; use net.LookupCNAME") | |
| return | |
| } | |
| as.Lhs = as.Lhs[:2] | |
| fixed = true | |
| }) | |
| return fixed | |
| } |