diff --git a/go/analysis/passes/modernize/slicescontains.go b/go/analysis/passes/modernize/slicescontains.go
index 19e5978..c1d4218 100644
--- a/go/analysis/passes/modernize/slicescontains.go
+++ b/go/analysis/passes/modernize/slicescontains.go
@@ -327,12 +327,13 @@
len(assign.Rhs) == 1 {
// Have: body={ lhs = rhs; break }
+ assignBool := isTrueOrFalse(info, assign.Rhs[0])
if prevAssign, ok := prevStmt.(*ast.AssignStmt); ok &&
len(prevAssign.Lhs) == 1 &&
len(prevAssign.Rhs) == 1 &&
+ assignBool != 0 && // non-bool assignments don't apply in this case
astutil.EqualSyntax(prevAssign.Lhs[0], assign.Lhs[0]) &&
- isTrueOrFalse(info, assign.Rhs[0]) ==
- -isTrueOrFalse(info, prevAssign.Rhs[0]) {
+ assignBool == -isTrueOrFalse(info, prevAssign.Rhs[0]) {
// Have:
// lhs = false
@@ -343,7 +344,7 @@
// TODO(adonovan):
// - support "var lhs bool = false" and variants.
// - allow the break to be omitted.
- neg := cond(isTrueOrFalse(info, assign.Rhs[0]) < 0, "!", "")
+ neg := cond(assignBool < 0, "!", "")
report([]analysis.TextEdit{
// Replace "rhs" of previous assignment by [!]slices.Contains(...)
{
diff --git a/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go b/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go
index 7c324bb..b9734e4 100644
--- a/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go
+++ b/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go
@@ -1,6 +1,9 @@
package slicescontains
-import "slices"
+import (
+ "fmt"
+ "slices"
+)
var _ = slices.Contains[[]int] // force import of "slices" to avoid duplicate import edits
@@ -232,3 +235,19 @@
}
}
}
+
+type Object struct{}
+
+func (o Object) Do() Object { return Object{} }
+func (o Object) Print() { fmt.Println("Hello, World!") }
+
+func issue78149nonboolassign(obj Object, opts ...string) {
+ o := obj
+ for _, opt := range opts { // want "Loop can be simplified using slices.Contains"
+ if opt == "something" {
+ o = o.Do()
+ break
+ }
+ }
+ o.Print()
+}
diff --git a/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go.golden b/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go.golden
index 07e99b2..6b9275d 100644
--- a/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go.golden
+++ b/go/analysis/passes/modernize/testdata/src/slicescontains/slicescontains.go.golden
@@ -1,6 +1,9 @@
package slicescontains
-import "slices"
+import (
+ "fmt"
+ "slices"
+)
var _ = slices.Contains[[]int] // force import of "slices" to avoid duplicate import edits
@@ -174,3 +177,16 @@
}
}
}
+
+type Object struct{}
+
+func (o Object) Do() Object { return Object{} }
+func (o Object) Print() { fmt.Println("Hello, World!") }
+
+func issue78149nonboolassign(obj Object, opts ...string) {
+ o := obj
+ if slices.Contains(opts, "something") {
+ o = o.Do()
+ }
+ o.Print()
+}