diff options
author | Mikio Hara <mikioh.mikioh@gmail.com> | 2012-11-27 00:45:42 +0900 |
---|---|---|
committer | Mikio Hara <mikioh.mikioh@gmail.com> | 2012-11-27 00:45:42 +0900 |
commit | e8cf49f701cf9204f51df2557f75e33d2da4b5d9 (patch) | |
tree | b278834a1ffa3f42e5a012a19fa127de386c48d2 /src/cmd/fix | |
parent | f02cf1997d84107cbdd53967748c1d8f3a2a8577 (diff) | |
download | go-e8cf49f701cf9204f51df2557f75e33d2da4b5d9.tar.gz go-e8cf49f701cf9204f51df2557f75e33d2da4b5d9.zip |
net, cmd/fix: add IPv6 scoped addressing zone to INET, INET6 address structs
This CL starts to introduce IPv6 scoped addressing capability
into the net package.
The Public API changes are:
+pkg net, type IPAddr struct, Zone string
+pkg net, type IPNet struct, Zone string
+pkg net, type TCPAddr struct, Zone string
+pkg net, type UDPAddr struct, Zone string
Update #4234.
R=rsc, bradfitz, iant
CC=golang-dev
https://golang.org/cl/6849045
Diffstat (limited to 'src/cmd/fix')
-rw-r--r-- | src/cmd/fix/netipv6zone.go | 71 | ||||
-rw-r--r-- | src/cmd/fix/netipv6zone_test.go | 51 |
2 files changed, 122 insertions, 0 deletions
diff --git a/src/cmd/fix/netipv6zone.go b/src/cmd/fix/netipv6zone.go new file mode 100644 index 0000000000..587b9ffec6 --- /dev/null +++ b/src/cmd/fix/netipv6zone.go @@ -0,0 +1,71 @@ +// Copyright 2012 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(netipv6zoneFix) +} + +var netipv6zoneFix = fix{ + "netipv6zone", + "2012-11-26", + netipv6zone, + `Adapt element key to IPNet, IPAddr, UDPAddr or TCPAddr composite literals. + +https://codereview.appspot.com/6849045/ +`, +} + +func netipv6zone(f *ast.File) bool { + if !imports(f, "net") { + return false + } + + fixed := false + walk(f, func(n interface{}) { + cl, ok := n.(*ast.CompositeLit) + if !ok { + return + } + se, ok := cl.Type.(*ast.SelectorExpr) + if !ok { + return + } + if !isTopName(se.X, "net") || se.Sel == nil { + return + } + switch ss := se.Sel.String(); ss { + case "IPNet", "IPAddr", "UDPAddr", "TCPAddr": + for i, e := range cl.Elts { + if _, ok := e.(*ast.KeyValueExpr); ok { + break + } + switch i { + case 0: + cl.Elts[i] = &ast.KeyValueExpr{ + Key: ast.NewIdent("IP"), + Value: e, + } + case 1: + if ss == "IPNet" { + cl.Elts[i] = &ast.KeyValueExpr{ + Key: ast.NewIdent("Mask"), + Value: e, + } + } else { + cl.Elts[i] = &ast.KeyValueExpr{ + Key: ast.NewIdent("Port"), + Value: e, + } + } + } + fixed = true + } + } + }) + return fixed +} diff --git a/src/cmd/fix/netipv6zone_test.go b/src/cmd/fix/netipv6zone_test.go new file mode 100644 index 0000000000..229daa386d --- /dev/null +++ b/src/cmd/fix/netipv6zone_test.go @@ -0,0 +1,51 @@ +// Copyright 2012 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 + +func init() { + addTestCases(netipv6zoneTests, netipv6zone) +} + +var netipv6zoneTests = []testCase{ + { + Name: "netipv6zone.0", + In: `package main + +import "net" + +var a = []struct { + *net.IPNet +}{ + &net.IPNet{net.ParseIP("2001:DB8::"), net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, +} + +func f() net.Addr { + b := net.IPNet{net.IPv4(127, 0, 0, 1), net.IPv4Mask(255, 0, 0, 0)} + c := &net.IPAddr{ip1} + sub(&net.UDPAddr{ip2, 12345}) + d := &net.TCPAddr{IP: ip3, Port: 54321} + return &net.TCPAddr{ip4}, nil +} +`, + Out: `package main + +import "net" + +var a = []struct { + *net.IPNet +}{ + &net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, +} + +func f() net.Addr { + b := net.IPNet{IP: net.IPv4(127, 0, 0, 1), Mask: net.IPv4Mask(255, 0, 0, 0)} + c := &net.IPAddr{IP: ip1} + sub(&net.UDPAddr{IP: ip2, Port: 12345}) + d := &net.TCPAddr{IP: ip3, Port: 54321} + return &net.TCPAddr{IP: ip4}, nil +} +`, + }, +} |