diff --git a/naming_test.go b/naming_test.go new file mode 100644 index 0000000..04604fc --- /dev/null +++ b/naming_test.go @@ -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 +}