| // 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() { | |
| addTestCases(importTests, nil) | |
| } | |
| var importTests = []testCase{ | |
| { | |
| Name: "import.0", | |
| Fn: addImportFn("os"), | |
| In: `package main | |
| import ( | |
| "os" | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "os" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.1", | |
| Fn: addImportFn("os"), | |
| In: `package main | |
| `, | |
| Out: `package main | |
| import "os" | |
| `, | |
| }, | |
| { | |
| Name: "import.2", | |
| Fn: addImportFn("os"), | |
| In: `package main | |
| // Comment | |
| import "C" | |
| `, | |
| Out: `package main | |
| // Comment | |
| import "C" | |
| import "os" | |
| `, | |
| }, | |
| { | |
| Name: "import.3", | |
| Fn: addImportFn("os"), | |
| In: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "io" | |
| "utf8" | |
| ) | |
| `, | |
| Out: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.4", | |
| Fn: deleteImportFn("os"), | |
| In: `package main | |
| import ( | |
| "os" | |
| ) | |
| `, | |
| Out: `package main | |
| `, | |
| }, | |
| { | |
| Name: "import.5", | |
| Fn: deleteImportFn("os"), | |
| In: `package main | |
| // Comment | |
| import "C" | |
| import "os" | |
| `, | |
| Out: `package main | |
| // Comment | |
| import "C" | |
| `, | |
| }, | |
| { | |
| Name: "import.6", | |
| Fn: deleteImportFn("os"), | |
| In: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| Out: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "io" | |
| "utf8" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.7", | |
| Fn: deleteImportFn("io"), | |
| In: `package main | |
| import ( | |
| "io" // a | |
| "os" // b | |
| "utf8" // c | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| // a | |
| "os" // b | |
| "utf8" // c | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.8", | |
| Fn: deleteImportFn("os"), | |
| In: `package main | |
| import ( | |
| "io" // a | |
| "os" // b | |
| "utf8" // c | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "io" // a | |
| // b | |
| "utf8" // c | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.9", | |
| Fn: deleteImportFn("utf8"), | |
| In: `package main | |
| import ( | |
| "io" // a | |
| "os" // b | |
| "utf8" // c | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "io" // a | |
| "os" // b | |
| // c | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.10", | |
| Fn: deleteImportFn("io"), | |
| In: `package main | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.11", | |
| Fn: deleteImportFn("os"), | |
| In: `package main | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "io" | |
| "utf8" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.12", | |
| Fn: deleteImportFn("utf8"), | |
| In: `package main | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "io" | |
| "os" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.13", | |
| Fn: rewriteImportFn("utf8", "encoding/utf8"), | |
| In: `package main | |
| import ( | |
| "io" | |
| "os" | |
| "utf8" // thanks ken | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "encoding/utf8" // thanks ken | |
| "io" | |
| "os" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.14", | |
| Fn: rewriteImportFn("asn1", "encoding/asn1"), | |
| In: `package main | |
| import ( | |
| "asn1" | |
| "crypto" | |
| "crypto/rsa" | |
| _ "crypto/sha1" | |
| "crypto/x509" | |
| "crypto/x509/pkix" | |
| "time" | |
| ) | |
| var x = 1 | |
| `, | |
| Out: `package main | |
| import ( | |
| "crypto" | |
| "crypto/rsa" | |
| _ "crypto/sha1" | |
| "crypto/x509" | |
| "crypto/x509/pkix" | |
| "encoding/asn1" | |
| "time" | |
| ) | |
| var x = 1 | |
| `, | |
| }, | |
| { | |
| Name: "import.15", | |
| Fn: rewriteImportFn("url", "net/url"), | |
| In: `package main | |
| import ( | |
| "bufio" | |
| "net" | |
| "path" | |
| "url" | |
| ) | |
| var x = 1 // comment on x, not on url | |
| `, | |
| Out: `package main | |
| import ( | |
| "bufio" | |
| "net" | |
| "net/url" | |
| "path" | |
| ) | |
| var x = 1 // comment on x, not on url | |
| `, | |
| }, | |
| { | |
| Name: "import.16", | |
| Fn: rewriteImportFn("http", "net/http", "template", "text/template"), | |
| In: `package main | |
| import ( | |
| "flag" | |
| "http" | |
| "log" | |
| "template" | |
| ) | |
| var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 | |
| `, | |
| Out: `package main | |
| import ( | |
| "flag" | |
| "log" | |
| "net/http" | |
| "text/template" | |
| ) | |
| var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 | |
| `, | |
| }, | |
| { | |
| Name: "import.17", | |
| Fn: addImportFn("x/y/z", "x/a/c"), | |
| In: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "a" | |
| "b" | |
| "x/w" | |
| "d/f" | |
| ) | |
| `, | |
| Out: `package main | |
| // Comment | |
| import "C" | |
| import ( | |
| "a" | |
| "b" | |
| "x/a/c" | |
| "x/w" | |
| "x/y/z" | |
| "d/f" | |
| ) | |
| `, | |
| }, | |
| { | |
| Name: "import.18", | |
| Fn: addDelImportFn("e", "o"), | |
| In: `package main | |
| import ( | |
| "f" | |
| "o" | |
| "z" | |
| ) | |
| `, | |
| Out: `package main | |
| import ( | |
| "e" | |
| "f" | |
| "z" | |
| ) | |
| `, | |
| }, | |
| } | |
| func addImportFn(path ...string) func(*ast.File) bool { | |
| return func(f *ast.File) bool { | |
| fixed := false | |
| for _, p := range path { | |
| if !imports(f, p) { | |
| addImport(f, p) | |
| fixed = true | |
| } | |
| } | |
| return fixed | |
| } | |
| } | |
| func deleteImportFn(path string) func(*ast.File) bool { | |
| return func(f *ast.File) bool { | |
| if imports(f, path) { | |
| deleteImport(f, path) | |
| return true | |
| } | |
| return false | |
| } | |
| } | |
| func addDelImportFn(p1 string, p2 string) func(*ast.File) bool { | |
| return func(f *ast.File) bool { | |
| fixed := false | |
| if !imports(f, p1) { | |
| addImport(f, p1) | |
| fixed = true | |
| } | |
| if imports(f, p2) { | |
| deleteImport(f, p2) | |
| fixed = true | |
| } | |
| return fixed | |
| } | |
| } | |
| func rewriteImportFn(oldnew ...string) func(*ast.File) bool { | |
| return func(f *ast.File) bool { | |
| fixed := false | |
| for i := 0; i < len(oldnew); i += 2 { | |
| if imports(f, oldnew[i]) { | |
| rewriteImport(f, oldnew[i], oldnew[i+1]) | |
| fixed = true | |
| } | |
| } | |
| return fixed | |
| } | |
| } |