parsing - 解析 Golang 变量

标签 parsing go abstract-syntax-tree

我正在尝试静态分析 Go 文件。为此,我需要解析以下格式的变量:

shape.color = color.red

我需要找到所有使用点符号访问的变量。例如,我需要知道 shape 变量具有 color 属性。并且还需要颜色变量具有红色属性。 我正在尝试使用 go/ast 和 go/parser 包,但无法找到一种方法。

注意如果它是类似于 shape.color() 的东西,即一种方法,那么它不应该被计算在内

最佳答案

啊!以下代码打印了所有使用点符号访问的变量!

package main

import (
    "fmt"
    "go/ast"
    "go/parser"
    "go/token"
    "log"
)

func main() {
    v := visitor{}
    filename := "test.go"

    fset := token.NewFileSet()
    f, err := parser.ParseFile(fset, filename, nil, 0)

    if err != nil {
        log.Fatal(err)
    }

    ast.Walk(&v, f)
}

type visitor struct {
}

func (v *visitor) Visit(n ast.Node) ast.Visitor {
    if n == nil {
        return v
    }

    if selectorExp, ok := n.(*ast.SelectorExpr); ok {
        if x, ok := selectorExp.X.(*ast.Ident); ok {
            if x.Obj == nil {
                return v
            }  

            fmt.Printf("%s.%s\n", x.Name, selectorExp.Sel.Name)
        }
    }
    return v
}

关于parsing - 解析 Golang 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52994442/

相关文章:

methods - 为什么 Go 中的方法只能声明在同一个包中定义的类型上?

parsing - Haskell 中的 AST 和解析

javascript - 如何编写 Typescript 插件?

python - 解析具有各种特殊字符的消息并拆分为列表(re 和 regex)Python 2.7

c# - 将字符串解析为具有自定义属性的枚举

go - 带有注释的代码行的约定是什么?

go - 在Go语句“typesubscriber struct {…}”中,type有什么作用?

c++ - 使用 libclang/libtooling

c# - 以零开头的电话号码的 String.Format

c++ - C++ 中的 Bencode 解析器