Remove rules_go version detection logic

The logic is conditional on whether rules_go is loaded in version 0.23.0
or later, which is almost three years old at this point.

In addition to removing quite a bit of code, getting rid of the version
detection also means that we don't have to port it to Bzlmod.
diff --git a/cmd/gazelle/integration_test.go b/cmd/gazelle/integration_test.go
index 3cdba9c..f91ac98 100644
--- a/cmd/gazelle/integration_test.go
+++ b/cmd/gazelle/integration_test.go
@@ -4756,55 +4756,6 @@
 	})
 }
 
-func TestFindRulesGoVersionWithWORKSPACE(t *testing.T) {
-	files := []testtools.FileSpec{
-		{
-			Path: "WORKSPACE",
-			Content: `
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
-http_archive(
-    name = "io_bazel_rules_go",
-    sha256 = "7b9bbe3ea1fccb46dcfa6c3f3e29ba7ec740d8733370e21cdc8937467b4a4349",
-    urls = [
-        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/v0.22.4/rules_go-v0.22.4.tar.gz",
-        "https://github.com/bazelbuild/rules_go/releases/download/v0.22.4/rules_go-v0.22.4.tar.gz",
-    ],
-)
-`,
-		},
-		{
-			Path: "foo_illumos.go",
-			Content: `
-// illumos not supported in rules_go v0.22.4
-package foo
-`,
-		},
-		{
-			Path: "BUILD.bazel",
-			Content: `
-# gazelle:prefix example.com/foo
-`,
-		},
-	}
-
-	dir, cleanup := testtools.CreateFiles(t, files)
-	defer cleanup()
-
-	if err := runGazelle(dir, []string{"update"}); err != nil {
-		t.Fatal(err)
-	}
-
-	testtools.CheckFiles(t, dir, []testtools.FileSpec{
-		{
-			Path: "BUILD.bazel",
-			Content: `
-# gazelle:prefix example.com/foo
-`,
-		},
-	})
-}
-
 func TestPlatformSpecificEmbedsrcs(t *testing.T) {
 	files := []testtools.FileSpec{
 		{
diff --git a/cmd/generate_repo_config/generate_repo_config.go b/cmd/generate_repo_config/generate_repo_config.go
index bf2f16d..ac8aaa6 100644
--- a/cmd/generate_repo_config/generate_repo_config.go
+++ b/cmd/generate_repo_config/generate_repo_config.go
@@ -40,8 +40,7 @@
 )
 
 const (
-	goRepoRuleKind      = "go_repository"
-	httpArchiveRuleKind = "http_archive"
+	goRepoRuleKind = "go_repository"
 )
 
 var (
@@ -109,20 +108,16 @@
 
 	destFile := rule.EmptyFile(configDest, "")
 	for _, rsrc := range repos {
-		var rdst *rule.Rule
-		if rsrc.Kind() == goRepoRuleKind {
-			rdst = rule.NewRule(goRepoRuleKind, rsrc.Name())
-			rdst.SetAttr("importpath", rsrc.AttrString("importpath"))
-			if namingConvention := rsrc.AttrString("build_naming_convention"); namingConvention != "" {
-				rdst.SetAttr("build_naming_convention", namingConvention)
-			}
-		} else if rsrc.Kind() == httpArchiveRuleKind && rsrc.Name() == "io_bazel_rules_go" {
-			rdst = rule.NewRule(httpArchiveRuleKind, "io_bazel_rules_go")
-			rdst.SetAttr("urls", rsrc.AttrStrings("urls"))
+		if rsrc.Kind() != goRepoRuleKind {
+			continue
 		}
-		if rdst != nil {
-			rdst.Insert(destFile)
+
+		rdst := rule.NewRule(goRepoRuleKind, rsrc.Name())
+		rdst.SetAttr("importpath", rsrc.AttrString("importpath"))
+		if namingConvention := rsrc.AttrString("build_naming_convention"); namingConvention != "" {
+			rdst.SetAttr("build_naming_convention", namingConvention)
 		}
+		rdst.Insert(destFile)
 	}
 
 	buf.WriteString("\n")
diff --git a/internal/BUILD.bazel b/internal/BUILD.bazel
index 4e687f4..ddf5877 100644
--- a/internal/BUILD.bazel
+++ b/internal/BUILD.bazel
@@ -54,7 +54,6 @@
         "//internal/gazellebinarytest:all_files",
         "//internal/generationtest:all_files",
         "//internal/language:all_files",
-        "//internal/version:all_files",
         "//internal/wspace:all_files",
     ],
     visibility = ["//visibility:public"],
diff --git a/internal/go_repository_tools_srcs.bzl b/internal/go_repository_tools_srcs.bzl
index 77e283d..1d983cb 100644
--- a/internal/go_repository_tools_srcs.bzl
+++ b/internal/go_repository_tools_srcs.bzl
@@ -40,8 +40,6 @@
 	Label("//internal/language/test_loads_from_flag:BUILD.bazel"),
 	Label("//internal/language/test_loads_from_flag:lang.go"),
 	Label("//internal:list_repository_tools_srcs.go"),
-	Label("//internal/version:BUILD.bazel"),
-	Label("//internal/version:version.go"),
 	Label("//internal/wspace:BUILD.bazel"),
 	Label("//internal/wspace:finder.go"),
 	Label("//label:BUILD.bazel"),
diff --git a/internal/version/BUILD.bazel b/internal/version/BUILD.bazel
deleted file mode 100644
index 2d358d8..0000000
--- a/internal/version/BUILD.bazel
+++ /dev/null
@@ -1,31 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-
-go_library(
-    name = "version",
-    srcs = ["version.go"],
-    importpath = "github.com/bazelbuild/bazel-gazelle/internal/version",
-    visibility = ["//:__subpackages__"],
-)
-
-go_test(
-    name = "version_test",
-    srcs = ["version_test.go"],
-    embed = [":version"],
-)
-
-filegroup(
-    name = "all_files",
-    testonly = True,
-    srcs = [
-        "BUILD.bazel",
-        "version.go",
-        "version_test.go",
-    ],
-    visibility = ["//visibility:public"],
-)
-
-alias(
-    name = "go_default_library",
-    actual = ":version",
-    visibility = ["//:__subpackages__"],
-)
diff --git a/internal/version/version.go b/internal/version/version.go
deleted file mode 100644
index 5c56fca..0000000
--- a/internal/version/version.go
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright 2018 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package version
-
-import (
-	"fmt"
-	"strconv"
-	"strings"
-)
-
-// Version is a tuple of non-negative integers that represents the version of
-// a software package.
-type Version []int
-
-func (v Version) String() string {
-	cstrs := make([]string, len(v))
-	for i, cn := range v {
-		cstrs[i] = strconv.Itoa(cn)
-	}
-	return strings.Join(cstrs, ".")
-}
-
-// Compare returns an integer comparing two versions lexicographically.
-func (x Version) Compare(y Version) int {
-	n := len(x)
-	if len(y) < n {
-		n = len(y)
-	}
-	for i := 0; i < n; i++ {
-		cmp := x[i] - y[i]
-		if cmp != 0 {
-			return cmp
-		}
-	}
-	return len(x) - len(y)
-}
-
-// ParseVersion parses a version of the form "12.34.56-abcd". Non-negative
-// integer components are separated by dots. An arbitrary suffix may appear
-// after '-', which is ignored.
-func ParseVersion(vs string) (Version, error) {
-	i := strings.IndexByte(vs, '-')
-	if i >= 0 {
-		vs = vs[:i]
-	}
-	cstrs := strings.Split(vs, ".")
-	v := make(Version, len(cstrs))
-	for i, cstr := range cstrs {
-		cn, err := strconv.Atoi(cstr)
-		if err != nil {
-			return nil, fmt.Errorf("could not parse version string: %q is not an integer", cstr)
-		}
-		if cn < 0 {
-			return nil, fmt.Errorf("could not parse version string: %q is negative", cstr)
-		}
-		v[i] = cn
-	}
-	return v, nil
-}
diff --git a/internal/version/version_test.go b/internal/version/version_test.go
deleted file mode 100644
index 4c7b8f6..0000000
--- a/internal/version/version_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright 2018 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package version
-
-import "testing"
-
-func TestCompare(t *testing.T) {
-	for _, tc := range []struct {
-		x, y Version
-		want int
-	}{
-		{
-			x:    Version{1},
-			y:    Version{1},
-			want: 0,
-		}, {
-			x:    Version{1},
-			y:    Version{2},
-			want: -1,
-		}, {
-			x:    Version{2},
-			y:    Version{1},
-			want: 1,
-		}, {
-			x:    Version{1},
-			y:    Version{1, 1},
-			want: -1,
-		}, {
-			x:    Version{1, 1},
-			y:    Version{1},
-			want: 1,
-		},
-	} {
-		if got := tc.x.Compare(tc.y); got != tc.want {
-			t.Errorf("Compare(%s, %s): got %v, want %v", tc.x, tc.y, got, tc.want)
-		}
-	}
-}
-
-func TestParseVersion(t *testing.T) {
-	for _, tc := range []struct {
-		str     string
-		want    Version
-		wantErr bool
-	}{
-		{
-			str:     "",
-			wantErr: true,
-		}, {
-			str:  "1",
-			want: Version{1},
-		}, {
-			str:     "-1",
-			wantErr: true,
-		}, {
-			str:  "0.1.2",
-			want: Version{0, 1, 2},
-		}, {
-			str:  "0-suffix",
-			want: Version{0},
-		},
-	} {
-		if got, err := ParseVersion(tc.str); tc.wantErr && err == nil {
-			t.Errorf("ParseVersion(%q): got %s, want error", tc.str, got)
-		} else if !tc.wantErr && err != nil {
-			t.Errorf("ParseVersion(%q): got %v, want success", tc.str, err)
-		} else if got.Compare(tc.want) != 0 {
-			t.Errorf("ParseVersion(%q): got %s, want %s", tc.str, got, tc.want)
-		}
-	}
-}
diff --git a/language/go/BUILD.bazel b/language/go/BUILD.bazel
index 325eb23..87ddc23 100644
--- a/language/go/BUILD.bazel
+++ b/language/go/BUILD.bazel
@@ -40,7 +40,6 @@
     deps = [
         "//config",
         "//flag",
-        "//internal/version",
         "//label",
         "//language",
         "//language/proto",
diff --git a/language/go/config.go b/language/go/config.go
index f46a60f..35f5220 100644
--- a/language/go/config.go
+++ b/language/go/config.go
@@ -16,7 +16,6 @@
 package golang
 
 import (
-	"errors"
 	"flag"
 	"fmt"
 	"go/build"
@@ -25,27 +24,18 @@
 	"os"
 	"path"
 	"path/filepath"
-	"regexp"
 	"strconv"
 	"strings"
 
 	"github.com/bazelbuild/bazel-gazelle/config"
 	gzflag "github.com/bazelbuild/bazel-gazelle/flag"
-	"github.com/bazelbuild/bazel-gazelle/internal/version"
 	"github.com/bazelbuild/bazel-gazelle/language/proto"
-	"github.com/bazelbuild/bazel-gazelle/repo"
 	"github.com/bazelbuild/bazel-gazelle/rule"
 	bzl "github.com/bazelbuild/buildtools/build"
 )
 
-var minimumRulesGoVersion = version.Version{0, 29, 0}
-
 // goConfig contains configuration values related to Go rules.
 type goConfig struct {
-	// rulesGoVersion is the version of io_bazel_rules_go being used. Determined
-	// by reading go/def.bzl. May be unset if the version can't be read.
-	rulesGoVersion version.Version
-
 	// genericTags is a set of tags that Gazelle considers to be true. Set with
 	// -build_tags or # gazelle:build_tags. Some tags, like gc, are always on.
 	genericTags map[string]bool
@@ -463,22 +453,6 @@
 	c.Exts[goName] = gc
 
 	if rel == "" {
-		const message = `Gazelle may not be compatible with this version of rules_go.
-Update io_bazel_rules_go to a newer version in your WORKSPACE file.`
-		var err error
-		gc.rulesGoVersion, err = findRulesGoVersion(c)
-		if c.ShouldFix {
-			// Only check the version when "fix" is run. Generated build files
-			// frequently work with older version of rules_go, and we don't want to
-			// nag too much since there's no way to disable this warning.
-			// Also, don't print a warning if the rules_go repo hasn't been fetched,
-			// since that's a common issue when Gazelle is run as a separate binary.
-			if err != nil && err != errRulesGoRepoNotFound && c.ShouldFix {
-				log.Printf("%v\n%s", err, message)
-			} else if err == nil && gc.rulesGoVersion.Compare(minimumRulesGoVersion) < 0 {
-				log.Printf("Found RULES_GO_VERSION %s. Minimum compatible version is %s.\n%s", gc.rulesGoVersion, minimumRulesGoVersion, message)
-			}
-		}
 		repoNamingConvention := map[string]namingConvention{}
 		for _, repo := range c.Repos {
 			if repo.Kind() == "go_repository" {
@@ -637,56 +611,6 @@
 	return values
 }
 
-// findRulesGoVersion attempts to infer the version of io_bazel_rules_go.
-// It can read the external directory (if bazel has fetched it), or it can
-// read WORKSPACE. Neither method is completely reliable.
-func findRulesGoVersion(c *config.Config) (version.Version, error) {
-	const message = `Gazelle may not be compatible with this version of rules_go.
-Update io_bazel_rules_go to a newer version in your WORKSPACE file.`
-
-	var vstr string
-	if rulesGoPath, err := repo.FindExternalRepo(c.RepoRoot, config.RulesGoRepoName); err == nil {
-		// Bazel has already fetched io_bazel_rules_go. We can read its version
-		// from //go:def.bzl.
-		defBzlPath := filepath.Join(rulesGoPath, "go", "def.bzl")
-		defBzlContent, err := ioutil.ReadFile(defBzlPath)
-		if err != nil {
-			return nil, err
-		}
-		versionRe := regexp.MustCompile(`(?m)^RULES_GO_VERSION = ['"]([0-9.]*)['"]`)
-		match := versionRe.FindSubmatch(defBzlContent)
-		if match == nil {
-			return nil, fmt.Errorf("RULES_GO_VERSION not found in @%s//go:def.bzl.\n%s", config.RulesGoRepoName, message)
-		}
-		vstr = string(match[1])
-	} else {
-		// Bazel has not fetched io_bazel_rules_go. Maybe we can find it in the
-		// WORKSPACE file.
-		re := regexp.MustCompile(`github\.com/bazelbuild/rules_go/releases/download/v([0-9.]+)/`)
-	RepoLoop:
-		for _, r := range c.Repos {
-			if r.Kind() == "http_archive" && r.Name() == "io_bazel_rules_go" {
-				for _, u := range r.AttrStrings("urls") {
-					if m := re.FindStringSubmatch(u); m != nil {
-						vstr = m[1]
-						break RepoLoop
-					}
-				}
-			}
-		}
-	}
-
-	if vstr == "" {
-		// Couldn't find a version. We return a specific value since this is not
-		// usually a useful error to report.
-		return nil, errRulesGoRepoNotFound
-	}
-
-	return version.ParseVersion(vstr)
-}
-
-var errRulesGoRepoNotFound = errors.New(config.RulesGoRepoName + " external repository not found")
-
 // detectNamingConvention attempts to detect the naming convention in use by
 // reading build files in subdirectories of the repository root directory.
 //
diff --git a/language/go/fileinfo.go b/language/go/fileinfo.go
index fb431b0..247b34a 100644
--- a/language/go/fileinfo.go
+++ b/language/go/fileinfo.go
@@ -31,7 +31,6 @@
 	"unicode/utf8"
 
 	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/internal/version"
 	"github.com/bazelbuild/bazel-gazelle/rule"
 )
 
@@ -382,11 +381,11 @@
 //
 // For example, the following string:
 //
-//     a b:"c d" 'e''f'  "g\""
+//	a b:"c d" 'e''f'  "g\""
 //
 // Would be parsed as:
 //
-//     []string{"a", "b:c d", "ef", `g"`}
+//	[]string{"a", "b:c d", "ef", `g"`}
 //
 // Copied from go/build.splitQuoted
 func splitQuoted(s string) (r []string, err error) {
@@ -579,54 +578,6 @@
 	return tags.eval(checker) && cgoTags.eval(checker)
 }
 
-// rulesGoSupportsOS returns whether the os tag is recognized by the version of
-// rules_go being used. This avoids incompatibility between new versions of
-// Gazelle and old versions of rules_go.
-func rulesGoSupportsOS(v version.Version, os string) bool {
-	if len(v) == 0 {
-		return true
-	}
-	if v.Compare(version.Version{0, 23, 0}) < 0 &&
-		(os == "aix" || os == "illumos") {
-		return false
-	}
-	return true
-}
-
-// rulesGoSupportsArch returns whether the arch tag is recognized by the version
-// of rules_go being used. This avoids incompatibility between new versions of
-// Gazelle and old versions of rules_go.
-func rulesGoSupportsArch(v version.Version, arch string) bool {
-	if len(v) == 0 {
-		return true
-	}
-	if v.Compare(version.Version{0, 23, 0}) < 0 &&
-		arch == "riscv64" {
-		return false
-	}
-	return true
-}
-
-// rulesGoSupportsPlatform returns whether the os and arch tag combination is
-// recognized by the version of rules_go being used. This avoids incompatibility
-// between new versions of Gazelle and old versions of rules_go.
-func rulesGoSupportsPlatform(v version.Version, p rule.Platform) bool {
-	if len(v) == 0 {
-		return true
-	}
-	if v.Compare(version.Version{0, 23, 0}) < 0 &&
-		(p.OS == "aix" && p.Arch == "ppc64" ||
-			p.OS == "freebsd" && p.Arch == "arm64" ||
-			p.OS == "illumos" && p.Arch == "amd64" ||
-			p.OS == "linux" && p.Arch == "riscv64" ||
-			p.OS == "netbsd" && p.Arch == "arm64" ||
-			p.OS == "openbsd" && p.Arch == "arm64" ||
-			p.OS == "windows" && p.Arch == "arm") {
-		return false
-	}
-	return true
-}
-
 // parseGoEmbed parses the text following "//go:embed" to extract the glob patterns.
 // It accepts unquoted space-separated patterns as well as double-quoted and back-quoted Go strings.
 // This is based on a similar function in cmd/compile/internal/gc/noder.go;
diff --git a/language/go/package.go b/language/go/package.go
index 20502e8..c7e344c 100644
--- a/language/go/package.go
+++ b/language/go/package.go
@@ -330,7 +330,6 @@
 // performance optimization to avoid evaluating constraints repeatedly.
 func getPlatformStringsAddFunction(c *config.Config, info fileInfo, cgoTags *cgoTagsAndOpts) func(sb *platformStringsBuilder, ss ...string) {
 	isOSSpecific, isArchSpecific := isOSArchSpecific(info, cgoTags)
-	v := getGoConfig(c).rulesGoVersion
 
 	switch {
 	case !isOSSpecific && !isArchSpecific:
@@ -345,8 +344,7 @@
 	case isOSSpecific && !isArchSpecific:
 		var osMatch []string
 		for _, os := range rule.KnownOSs {
-			if rulesGoSupportsOS(v, os) &&
-				checkConstraints(c, os, "", info.goos, info.goarch, info.tags, cgoTags) {
+			if checkConstraints(c, os, "", info.goos, info.goarch, info.tags, cgoTags) {
 				osMatch = append(osMatch, os)
 			}
 		}
@@ -361,8 +359,7 @@
 	case !isOSSpecific && isArchSpecific:
 		var archMatch []string
 		for _, arch := range rule.KnownArchs {
-			if rulesGoSupportsArch(v, arch) &&
-				checkConstraints(c, "", arch, info.goos, info.goarch, info.tags, cgoTags) {
+			if checkConstraints(c, "", arch, info.goos, info.goarch, info.tags, cgoTags) {
 				archMatch = append(archMatch, arch)
 			}
 		}
@@ -377,8 +374,7 @@
 	default:
 		var platformMatch []rule.Platform
 		for _, platform := range rule.KnownPlatforms {
-			if rulesGoSupportsPlatform(v, platform) &&
-				checkConstraints(c, platform.OS, platform.Arch, info.goos, info.goarch, info.tags, cgoTags) {
+			if checkConstraints(c, platform.OS, platform.Arch, info.goos, info.goarch, info.tags, cgoTags) {
 				platformMatch = append(platformMatch, platform)
 			}
 		}
diff --git a/language/go/std_package_list.go b/language/go/std_package_list.go
index 034c2b3..83468ab 100644
--- a/language/go/std_package_list.go
+++ b/language/go/std_package_list.go
@@ -166,7 +166,6 @@
 	"cmd/go/internal/tool": true,
 	"cmd/go/internal/trace": true,
 	"cmd/go/internal/vcs": true,
-	"cmd/go/internal/version": true,
 	"cmd/go/internal/vet": true,
 	"cmd/go/internal/web": true,
 	"cmd/go/internal/work": true,