1

我正在为 Go 创建一个自定义 linter,它在下面的示例中验证 'foo' 函数的某些参数。

假设我们有一个sample.go,它看起来像这样。

// Package pkg does something.
package pkg

import (
    "fmt"
)

func foo(use string, items ...interface{}) {
    s := "lol"
    fmt.Sprint(s)
}

func yolo() {
    foo("lol", "p1", "p2", "ppp3:", "p4")
}

然后我们有另一个名为的文件,它为foobar.go函数实现了一个 linter (检查它的参数的长度),如下所示:

func (f *file) checkForValidFoo() {
    f.walk(func(n ast.Node) bool {
        ce, ok := n.(*ast.CallExpr)
        if !ok || len(ce.Args) <= 1 {
            return true
        }
        expr, ok := ce.Fun.(*ast.Ident)
        if expr.Name == "foo" {
            decl, _ := ce.Fun.(*ast.Ident)
            funDec := decl.Obj.Decl.(*ast.FuncDecl)
            // How do I know this is the foo function I want, and not some other one?

            for i, arg := range ce.Args[1:] {
                if i%2 == 0 {
                    realArg := arg.(*ast.BasicLit)
                    if(len(realArg.Value) > 2) {
                        break
                    }
                }
            }
        }
        return true
    })
}

我怎么知道调用表达式ce, ok := n.(*ast.CallExpr)实际上是在调用foo函数bar.go而不是其他源文件?

我能够进入调用表达式的函数声明对象 - funDec,但它的所有属性似乎都不能帮助唯一地识别函数声明/签名。

函数对象的属性

我正在使用的代码可以在这里找到。本质上,我正在寻找的是一种类似于 Go 中函数声明的“哈希码”实现。

4

0 回答 0