gofix: be more conservative about rewrite to os.Create Rewrite only if we understood all the flags we saw. R=r CC=golang-dev https://golang.org/cl/4376046
diff --git a/src/cmd/gofix/osopen.go b/src/cmd/gofix/osopen.go index 5d7f5cb..49993d8 100644 --- a/src/cmd/gofix/osopen.go +++ b/src/cmd/gofix/osopen.go
@@ -70,7 +70,6 @@ func isCreateFlag(flag ast.Expr) bool { foundCreate := false foundTrunc := false - foundAppend := false // OR'ing of flags: is O_CREATE on? + or | would be fine; we just look for os.O_CREATE // and don't worry about the actual opeator. p := flag.Pos() @@ -80,14 +79,21 @@ if isBinary { lhs = expr.Y } - if isPkgDot(lhs, "os", "O_CREATE") { + sel, ok := lhs.(*ast.SelectorExpr) + if !ok || !isTopName(sel.X, "os") { + return false + } + switch sel.Sel.Name { + case "O_CREATE": foundCreate = true - } - if isPkgDot(lhs, "os", "O_TRUNC") { + case "O_TRUNC": foundTrunc = true - } - if isPkgDot(lhs, "os", "O_APPEND") { - foundAppend = true + case "O_RDONLY", "O_WRONLY", "O_RDWR": + // okay + default: + // Unexpected flag, like O_APPEND or O_EXCL. + // Be conservative and do not rewrite. + return false } if !isBinary { break @@ -97,9 +103,6 @@ if !foundCreate { return false } - if foundAppend { - return false - } if !foundTrunc { warn(p, "rewrote os.Open with O_CREATE but not O_TRUNC to os.Create") }
diff --git a/src/cmd/gofix/osopen_test.go b/src/cmd/gofix/osopen_test.go index b0a4f63..43ddd1a 100644 --- a/src/cmd/gofix/osopen_test.go +++ b/src/cmd/gofix/osopen_test.go
@@ -28,6 +28,8 @@ os.Open(a, os.O_CREATE|os.O_TRUNC, 0664) os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) + os.Open(a, os.O_SURPRISE|os.O_CREATE, 0666) _ = os.O_CREAT } `, @@ -48,6 +50,8 @@ os.Create(a) os.Create(a) os.OpenFile(a, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) + os.OpenFile(a, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) + os.OpenFile(a, os.O_SURPRISE|os.O_CREATE, 0666) _ = os.O_CREATE } `,