diff --git a/cmd/structcheck/structcheck.go b/cmd/structcheck/structcheck.go index 5dc5f83..1c07d9d 100644 --- a/cmd/structcheck/structcheck.go +++ b/cmd/structcheck/structcheck.go @@ -78,6 +78,10 @@ func (v *visitor) typeAndFieldName(expr *ast.SelectorExpr) (types.Type, string, if ptr, ok := recv.(*types.Pointer); ok { recv = ptr.Elem() } + for _, idx := range selection.Index()[:len(selection.Index())-1] { + recv = recv.Underlying().(*types.Struct).Field(idx).Type() + } + return recv, selection.Obj().Name(), true } @@ -100,6 +104,21 @@ func (v *visitor) assignStmt(node *ast.AssignStmt) { } } +func (v *visitor) getRealStruct(expr *ast.SelectorExpr, fieldName string) *ast.SelectorExpr { + tv := v.pkg.Types[expr.X] + if !tv.IsType() { + return expr + } + + switch st := tv.Type.Underlying().(type) { + case *types.Struct: + obj, _, _ := types.LookupFieldOrMethod(st, false, v.pkg.Pkg, fieldName) + // return + _ = obj + } + return nil +} + func (v *visitor) compositeLiteral(node *ast.CompositeLit) { t := v.pkg.Info.Types[node.Type].Type for _, expr := range node.Elts {