我正在为 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 中函数声明的“哈希码”实现。