aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/macabu/inamedparam/inamedparam.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/macabu/inamedparam/inamedparam.go')
-rw-r--r--vendor/github.com/macabu/inamedparam/inamedparam.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/vendor/github.com/macabu/inamedparam/inamedparam.go b/vendor/github.com/macabu/inamedparam/inamedparam.go
new file mode 100644
index 000000000..433e04e5b
--- /dev/null
+++ b/vendor/github.com/macabu/inamedparam/inamedparam.go
@@ -0,0 +1,67 @@
+package inamedparam
+
+import (
+ "go/ast"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+)
+
+var Analyzer = &analysis.Analyzer{
+ Name: "inamedparam",
+ Doc: "reports interfaces with unnamed method parameters",
+ Run: run,
+ Requires: []*analysis.Analyzer{
+ inspect.Analyzer,
+ },
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+
+ types := []ast.Node{
+ &ast.InterfaceType{},
+ }
+
+ inspect.Preorder(types, func(n ast.Node) {
+ interfaceType, ok := n.(*ast.InterfaceType)
+ if !ok || interfaceType == nil || interfaceType.Methods == nil {
+ return
+ }
+
+ for _, method := range interfaceType.Methods.List {
+ interfaceFunc, ok := method.Type.(*ast.FuncType)
+ if !ok || interfaceFunc == nil || interfaceFunc.Params == nil {
+ continue
+ }
+
+ methodName := method.Names[0].Name
+
+ for _, param := range interfaceFunc.Params.List {
+ if param.Names == nil {
+ var builtParamType string
+
+ switch paramType := param.Type.(type) {
+ case *ast.SelectorExpr:
+ if ident := paramType.X.(*ast.Ident); ident != nil {
+ builtParamType += ident.Name + "."
+ }
+
+ builtParamType += paramType.Sel.Name
+ case *ast.Ident:
+ builtParamType = paramType.Name
+ }
+
+ if builtParamType != "" {
+ pass.Reportf(param.Pos(), "interface method %v must have named param for type %v", methodName, builtParamType)
+ } else {
+ pass.Reportf(param.Pos(), "interface method %v must have all named params", methodName)
+ }
+ }
+ }
+ }
+ })
+
+ return nil, nil
+}