code: func (f *file) lintElses() {
  	// We don't want to flag if { } else if { } else { } constructions.
  	// They will appear as an IfStmt whose Else field is also an IfStmt.
  	// Record such a node so we ignore it when we visit it.
  	ignore := make(map[*ast.IfStmt]bool)
  
  	f.walk(func(node ast.Node) bool {
  		ifStmt, ok := node.(*ast.IfStmt)
  		if !ok || ifStmt.Else == nil {
  			return true
  		}
  		if elseif, ok := ifStmt.Else.(*ast.IfStmt); ok {
  			ignore[elseif] = true
  			return true
  		}
  		if ignore[ifStmt] {
  			return true
  		}
  		if _, ok := ifStmt.Else.(*ast.BlockStmt); !ok {
  			// only care about elses without conditions
  			return true
  		}
  		if len(ifStmt.Body.List) == 0 {
  			return true
  		}
  		shortDecl := false // does the if statement have a ":=" initialization statement?
  		if ifStmt.Init != nil {
  			if as, ok := ifStmt.Init.(*ast.AssignStmt); ok && as.Tok == token.DEFINE {
  				shortDecl = true
  			}
  		}
  		lastStmt := ifStmt.Body.List[len(ifStmt.Body.List)-1]
  		if _, ok := lastStmt.(*ast.ReturnStmt); ok {
  			extra := ""
  			if shortDecl {
  				extra = " (move short variable declaration to its own line if necessary)"
  			}
  			f.errorf(ifStmt.Else, 1, link(styleGuideBase+"#indent-error-flow"), category("indent"), "if block ends with a return statement, so drop this else and outdent its block"+extra)
  		}
  		return true
  	})
  }
docs: // lintElses examines else blocks. It complains about any else block whose if block ends in a return.