第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 go/analysis 找到 Ident 的聲明?

如何使用 go/analysis 找到 Ident 的聲明?

Go
波斯汪 2022-08-15 16:21:26
我使用go/analysis來創(chuàng)建自己的靜態(tài)分析工具。我仍然不知道如何從ast中找到def信息。同上。這是我的測試數(shù)據(jù)package randomcheckfunc xxx() {}func demo()  {    xxx()}還有我自己的分析儀import (    "fmt"    "go/ast"    "golang.org/x/tools/go/analysis"    "golang.org/x/tools/go/analysis/passes/inspect")var name string // -name flagvar Analyzer = &analysis.Analyzer{    Name:     "fft",    Requires: []*analysis.Analyzer{inspect.Analyzer},    Run:      run,}//pass.Fset.Position(name.Pos())func run(pass *analysis.Pass) (interface{}, error) {    for _, f := range pass.Files {        ast.Inspect(f, func(node ast.Node) bool {            name,ok := node.(*ast.Ident)            if !ok {                return true            }            if name == nil {                return true            }            if pass.TypesInfo.Defs[name] != nil {                fmt.Println("def: " ,name)            } else {                fmt.Println("use: ", name)            }            return true        })    }    return nil, nil}output:use:  randomcheckdef:  xxxdef:  demouse:  xxx我需要直接從 use:xxx 找到 def 信息 def:xxx,但我找不到有用的信息。類型信息
查看完整描述

1 回答

?
郎朗坤

TA貢獻1921條經(jīng)驗 獲得超9個贊

你在尋找方法嗎?以下是經(jīng)過一些修改的版本:ObjectOf


func run(pass *analysis.Pass) (interface{}, error) {

    for _, f := range pass.Files {

        ast.Inspect(f, func(node ast.Node) bool {

            name, ok := node.(*ast.Ident)

            if !ok {

                return true

            }

            if name == nil {

                return true

            }


            fmt.Println("ident:", nodeString(node, pass.Fset))

            obj := pass.TypesInfo.ObjectOf(name)

            fmt.Println(obj)

            if obj != nil {

                fmt.Println("  pos:", pass.Fset.Position(obj.Pos()))

            }

            return true

        })

    }


    return nil, nil

}


// nodeString formats a syntax tree in the style of gofmt.

func nodeString(n ast.Node, fset *token.FileSet) string {

    var buf bytes.Buffer

    format.Node(&buf, fset, n)

    return buf.String()

}

在示例輸入文件上運行時,它顯示:


ident: randomcheck

<nil>

ident: xxx

func command-line-arguments.xxx()

  pos: /home/eliben/temp/randomcheck.go:3:6

ident: demo

func command-line-arguments.demo()

  pos: /home/eliben/temp/randomcheck.go:5:6

ident: xxx

func command-line-arguments.xxx()

  pos: /home/eliben/temp/randomcheck.go:3:6

請注意,最后一個 id 是作為對頂級函數(shù)的引用及其正確位置等找到的。xxxxxx()


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關(guān)注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號