Уникальная идентификация объявлений функций в 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.

0 ответов

Другие вопросы по тегам