diff options
Diffstat (limited to 'src/cmd/vet/assign.go')
-rw-r--r-- | src/cmd/vet/assign.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/cmd/vet/assign.go b/src/cmd/vet/assign.go new file mode 100644 index 000000000..a11f0f875 --- /dev/null +++ b/src/cmd/vet/assign.go @@ -0,0 +1,44 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +This file contains the code to check for useless assignments. +*/ + +package main + +import ( + "go/ast" + "go/token" + "reflect" +) + +// TODO: should also check for assignments to struct fields inside methods +// that are on T instead of *T. + +// checkAssignStmt checks for assignments of the form "<expr> = <expr>". +// These are almost always useless, and even when they aren't they are usually a mistake. +func (f *File) checkAssignStmt(stmt *ast.AssignStmt) { + if !vet("assign") { + return + } + if stmt.Tok != token.ASSIGN { + return // ignore := + } + if len(stmt.Lhs) != len(stmt.Rhs) { + // If LHS and RHS have different cardinality, they can't be the same. + return + } + for i, lhs := range stmt.Lhs { + rhs := stmt.Rhs[i] + if reflect.TypeOf(lhs) != reflect.TypeOf(rhs) { + continue // short-circuit the heavy-weight gofmt check + } + le := f.gofmt(lhs) + re := f.gofmt(rhs) + if le == re { + f.Warnf(stmt.Pos(), "self-assignment of %s to %s", re, le) + } + } +} |