go/analysis/passes/sortslice: add missing functions using empty interface

Add missing functions using empty interface in `sort` package.

Change-Id: Ic39bc55897705b08d3739a993b30d4b4e9a77baf
GitHub-Last-Rev: 1cfb9149456ebe6489299564e53666cdafcf49de
GitHub-Pull-Request: golang/tools#318
Reviewed-on: https://go-review.googlesource.com/c/tools/+/319689
Reviewed-by: Tim King <taking@google.com>
Trust: Tim King <taking@google.com>
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Tim King <taking@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
diff --git a/go/analysis/passes/sortslice/analyzer.go b/go/analysis/passes/sortslice/analyzer.go
index 69a6793..5eb957a 100644
--- a/go/analysis/passes/sortslice/analyzer.go
+++ b/go/analysis/passes/sortslice/analyzer.go
@@ -45,7 +45,8 @@
 			return
 		}
 
-		if fn.FullName() != "sort.Slice" {
+		fnName := fn.FullName()
+		if fnName != "sort.Slice" && fnName != "sort.SliceStable" && fnName != "sort.SliceIsSorted" {
 			return
 		}
 
@@ -115,7 +116,7 @@
 		pass.Report(analysis.Diagnostic{
 			Pos:            call.Pos(),
 			End:            call.End(),
-			Message:        fmt.Sprintf("sort.Slice's argument must be a slice; is called with %s", typ.String()),
+			Message:        fmt.Sprintf("%s's argument must be a slice; is called with %s", fnName, typ.String()),
 			SuggestedFixes: fixes,
 		})
 	})
diff --git a/go/analysis/passes/sortslice/testdata/src/a/a.go b/go/analysis/passes/sortslice/testdata/src/a/a.go
index 3403660..bc6cc16 100644
--- a/go/analysis/passes/sortslice/testdata/src/a/a.go
+++ b/go/analysis/passes/sortslice/testdata/src/a/a.go
@@ -7,6 +7,8 @@
 	i := 5
 	sortFn := func(i, j int) bool { return false }
 	sort.Slice(i, sortFn) // want "sort.Slice's argument must be a slice; is called with int"
+	sort.SliceStable(i, sortFn) // want "sort.SliceStable's argument must be a slice; is called with int"
+	sort.SliceIsSorted(i, sortFn) // want "sort.SliceIsSorted's argument must be a slice; is called with int"
 }
 
 // CorrectSort sorts integers. It should not produce a diagnostic.
@@ -14,6 +16,8 @@
 	s := []int{2, 3, 5, 6}
 	sortFn := func(i, j int) bool { return s[i] < s[j] }
 	sort.Slice(s, sortFn)
+	sort.SliceStable(s, sortFn)
+	sort.SliceIsSorted(s, sortFn)
 }
 
 // CorrectInterface sorts an interface with a slice
@@ -23,6 +27,8 @@
 	s = interface{}([]int{2, 1, 0})
 	sortFn := func(i, j int) bool { return s.([]int)[i] < s.([]int)[j] }
 	sort.Slice(s, sortFn)
+	sort.SliceStable(s, sortFn)
+	sort.SliceIsSorted(s, sortFn)
 }
 
 type slicecompare interface {
@@ -41,6 +47,8 @@
 	var s slicecompare
 	s = intslice([]int{2, 1, 0})
 	sort.Slice(s, s.compare)
+	sort.SliceStable(s, s.compare)
+	sort.SliceIsSorted(s, s.compare)
 }
 
 type mySlice []int
@@ -51,4 +59,6 @@
 	s := mySlice{2, 3, 5, 6}
 	sortFn := func(i, j int) bool { return s[i] < s[j] }
 	sort.Slice(s, sortFn)
+	sort.SliceStable(s, sortFn)
+	sort.SliceIsSorted(s, sortFn)
 }