Fence a function that spells a method
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
package fejkdata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go/ast"
|
||||||
|
"sort"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestNoFunctionSpellsAMethod holds a call to one unit. A method is written with
|
||||||
|
// its receiver and a function bare, so one name on both reads alike at a call site
|
||||||
|
// and greps as one unit; two types may share a method name, since the receiver
|
||||||
|
// standing before it says which.
|
||||||
|
func TestNoFunctionSpellsAMethod(t *testing.T) {
|
||||||
|
_, files := sourceFiles(t)
|
||||||
|
funcs, methods := declaredCalls(files)
|
||||||
|
names := make([]string, 0, len(funcs))
|
||||||
|
for name := range funcs {
|
||||||
|
names = append(names, name)
|
||||||
|
}
|
||||||
|
sort.Strings(names)
|
||||||
|
for _, name := range names {
|
||||||
|
if recv := methods[name]; recv != "" {
|
||||||
|
t.Errorf("func %s and %s.%s are two units under one name; name them apart", name, recv, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// declaredCalls is every name the package declares as a function, and every name
|
||||||
|
// it declares as a method with one type declaring it.
|
||||||
|
func declaredCalls(files []*ast.File) (funcs map[string]bool, methods map[string]string) {
|
||||||
|
funcs, methods = map[string]bool{}, map[string]string{}
|
||||||
|
for _, f := range files {
|
||||||
|
for _, decl := range f.Decls {
|
||||||
|
d, isFunc := decl.(*ast.FuncDecl)
|
||||||
|
if !isFunc {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if recv := receiverType(d.Recv); recv != "" {
|
||||||
|
methods[d.Name.Name] = recv
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
funcs[d.Name.Name] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return funcs, methods
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user