Уникальная идентификация объявлений функций в Go AST для Linter
Я создаю пользовательский линтер для Go, который проверяет определенные параметры функции '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")
}
Затем у нас есть другой файл с именем bar.go
который реализует линтер для функции foo (проверяя длину ее параметров) следующим образом:
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
, но ни одно из его свойств не помогает однозначно идентифицировать объявление / сигнатуру функции.
Код, с которым я работаю, можно найти здесь. По сути, я ищу что-то вроде реализации 'hashcode' для объявления функции в Go.