本文整理汇总了Golang中go/ast.ImportSpec类的典型用法代码示例。如果您正苦于以下问题:Golang ImportSpec类的具体用法?Golang ImportSpec怎么用?Golang ImportSpec使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ImportSpec类的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: LookupImport
func (w *PkgWalker) LookupImport(pkg *types.Package, pkgInfo *types.Info, cursor *FileCursor, is *ast.ImportSpec) {
fpath, err := strconv.Unquote(is.Path.Value)
if err != nil {
return
}
fbase := fpath
pos := strings.LastIndexAny(fpath, "./-\\")
if pos != -1 {
fbase = fpath[pos+1:]
}
fid := fpath + "." + fbase
//kind := ObjPkgName
//fmt.Println(kind, true)
if typeFindDef {
fmt.Println(w.fset.Position(is.Pos()))
}
if typeFindInfo {
fmt.Println("package", fpath)
}
if !typeFindUse {
return
}
var usages []int
for id, obj := range pkgInfo.Uses {
if obj != nil && obj.Id() == fid { //!= nil && cursorObj.Pos() == obj.Pos() {
usages = append(usages, int(id.Pos()))
}
}
(sort.IntSlice(usages)).Sort()
for _, pos := range usages {
fmt.Println(w.fset.Position(token.Pos(pos)))
}
}
示例2: UnusedImport
func (p *patchUnused) UnusedImport(imp *ast.ImportSpec) {
if imp.Name != nil {
p.patches = append(p.patches, patch.Replace(imp.Name, "_"))
} else {
p.patches = append(p.patches, patch.Insert(imp.Pos(), "_ "))
}
}
示例3: LookupImport
func (w *PkgWalker) LookupImport(pkg *types.Package, pkgInfo *types.Info, cursor *FileCursor, is *ast.ImportSpec) {
fpath, err := strconv.Unquote(is.Path.Value)
if err != nil {
return
}
if typesFindDef {
fmt.Println(w.fset.Position(is.Pos()))
}
fbase := fpath
pos := strings.LastIndexAny(fpath, "./-\\")
if pos != -1 {
fbase = fpath[pos+1:]
}
var fname string
if is.Name != nil {
fname = is.Name.Name
} else {
fname = fbase
}
if typesFindInfo {
if fname == fpath {
fmt.Printf("package %s\n", fname)
} else {
fmt.Printf("package %s (\"%s\")\n", fname, fpath)
}
}
if !typesFindUse {
return
}
path := pkg.Path()
if strings.Contains(path, "vendor/") {
path = strings.Split(path, "vendor/")[1]
}
fid := path + "." + fname
var usages []int
for id, obj := range pkgInfo.Uses {
if obj != nil && obj.Id() == fid { //!= nil && cursorObj.Pos() == obj.Pos() {
usages = append(usages, int(id.Pos()))
}
}
(sort.IntSlice(usages)).Sort()
for _, pos := range usages {
fmt.Println(w.fset.Position(token.Pos(pos)))
}
}
示例4: foundImport
func (ps *ProjectStats) foundImport(fs *token.FileSet, i *ast.ImportSpec, path string) error {
importPath, err := strconv.Unquote(i.Path.Value)
if err != nil {
return err
}
ref := fs.Position(i.Pos())
_, found := ps.ImportStatsByPath[importPath]
if found {
ps.ImportStatsByPath[importPath].ReferencePositions = append(ps.ImportStatsByPath[importPath].ReferencePositions, ref)
} else {
ps.ImportStatsByPath[importPath] = NewImportStats(importPath, ref)
}
return nil
}
示例5: parseImportSpec
func (p *parser) parseImportSpec(n *parse.Node) *ast.ImportSpec {
spec := ast.ImportSpec{}
if n.Child(0).Is(importPath) {
spec.Path = p.parseBasicLit(n.Child(0))
} else {
name := n.Child(0)
switch name.Rule() {
case identifier:
spec.Name = p.parseIdent(name)
case term("."):
spec.Name = &ast.Ident{
NamePos: token.Pos(name.Pos()),
Name: ".",
}
}
spec.Path = p.parseBasicLit(n.Child(1))
}
return &spec
}
示例6: fixGoExact
func fixGoExact(f *ast.File) bool {
// This one is harder because the import name changes.
// First find the import spec.
var importSpec *ast.ImportSpec
walk(f, func(n interface{}) {
if importSpec != nil {
return
}
spec, ok := n.(*ast.ImportSpec)
if !ok {
return
}
path, err := strconv.Unquote(spec.Path.Value)
if err != nil {
return
}
if path == "golang.org/x/tools/go/exact" {
importSpec = spec
}
})
if importSpec == nil {
return false
}
// We are about to rename exact.* to constant.*, but constant is a common
// name. See if it will conflict. This is a hack but it is effective.
exists := renameTop(f, "constant", "constant")
suffix := ""
if exists {
suffix = "_"
}
// Now we need to rename all the uses of the import. RewriteImport
// affects renameTop, but not vice versa, so do them in this order.
renameTop(f, "exact", "constant"+suffix)
rewriteImport(f, "golang.org/x/tools/go/exact", "go/constant")
// renameTop will also rewrite the imported package name. Fix that;
// we know it should be missing.
importSpec.Name = nil
return true
}
示例7: main
func main() {
flag.Parse()
src, err := ioutil.ReadFile(*in)
if err != nil {
log.Fatal(err)
}
fset := token.NewFileSet()
f, _ := parser.ParseFile(fset, "", src, parser.AllErrors)
// Find where "crypto/aes" is imported.
var importSpec *ast.ImportSpec
for _, imp := range f.Imports {
if imp.Path.Value == target {
importSpec = imp
break
}
}
if importSpec == nil {
log.Fatalf("File doesn't import %v!", target)
}
// Name the import explicitly if it's not already named. Change the import path to a white-box construction.
if importSpec.Name == nil {
importSpec.Name = &ast.Ident{0, "aes", nil}
} else if importSpec.Name.Name == "." {
log.Fatalf("Can't transform a file's encryption keys if %v is imported into the local scope!", target)
}
importSpec.Path.Value = replacement
// Find everywhere we initialize a block cipher with an explicit key and replace it with a white-box.
ast.Inspect(f, func(n ast.Node) bool {
switch n.(type) {
case *ast.CallExpr:
callExpr := n.(*ast.CallExpr)
if IsCallToEncrypt(importSpec.Name.Name, callExpr) {
key, ok := ExtractKey(callExpr.Args[0]) // aes.NewCipher has only one argument.
if ok {
TransformCallToEncrypt(callExpr, key)
return false
} else {
log.Printf("Found encryption call at %v, but couldn't extract the key!", fset.Position(n.Pos()))
return true
}
}
}
return true
})
dst, err := os.Create(*out)
if err != nil {
log.Fatal(err)
}
printer.Fprint(dst, fset, f)
}
示例8: LookupImport
func (w *PkgWalker) LookupImport(pkg *types.Package, pkgInfo *types.Info, cursor *FileCursor, is *ast.ImportSpec) []*Doc {
fpath, err := strconv.Unquote(is.Path.Value)
if err != nil {
return []*Doc{}
}
ret := []*Doc{}
if w.findDef {
fpos := w.fset.Position(is.Pos())
ret = append(ret, &Doc{
Pkg: pkg.Name(),
Src: "",
Name: is.Name.Name,
Kind: "package",
Fn: fpos.Filename,
Row: fpos.Line - 1,
Col: fpos.Column - 1,
})
fmt.Println(fpos)
}
fbase := fpath
pos := strings.LastIndexAny(fpath, "./-\\")
if pos != -1 {
fbase = fpath[pos+1:]
}
var fname string
if is.Name != nil {
fname = is.Name.Name
} else {
fname = fbase
}
if w.findInfo {
if fname == fpath {
fmt.Printf("package %s\n", fname)
} else {
fmt.Printf("package %s (\"%s\")\n", fname, fpath)
}
}
if !w.findUse {
return ret
}
fid := pkg.Path() + "." + fname
var usages []int
for id, obj := range pkgInfo.Uses {
if obj != nil && obj.Id() == fid { //!= nil && cursorObj.Pos() == obj.Pos() {
usages = append(usages, int(id.Pos()))
}
}
(sort.IntSlice(usages)).Sort()
for _, pos := range usages {
fpos := w.fset.Position(token.Pos(pos))
ret = append(ret, &Doc{
Pkg: pkg.Name(),
Src: "",
Name: fname,
Kind: "package",
Fn: fpos.Filename,
Row: fpos.Line - 1,
Col: fpos.Column - 1,
})
if typeVerbose {
log.Println(fpos)
}
}
return ret
}