v2/walk: use v2 packages
diff --git a/testtools/config.go b/testtools/config.go
index f50fa1e..a263d72 100644
--- a/testtools/config.go
+++ b/testtools/config.go
@@ -16,9 +16,9 @@
 package testtools
 
 import (
+	"flag"
 	"testing"
 
-	v2 "github.com/bazel-contrib/bazel-gazelle/v2/testtools"
 	"github.com/bazelbuild/bazel-gazelle/config"
 	"github.com/bazelbuild/bazel-gazelle/language"
 )
@@ -31,7 +31,25 @@
 // error is encountered while processing flags.
 //
 // Deprecated: Use github.com/bazel-contrib/bazel-gazelle/v2/testtools.NewTestConfig instead.
-//go:fix inline
 func NewTestConfig(t *testing.T, cexts []config.Configurer, langs []language.Language, args []string) *config.Config {
-	return v2.NewTestConfig(t, cexts, langs, args)
+	c := config.New()
+	fs := flag.NewFlagSet("test", flag.ContinueOnError)
+
+	for _, lang := range langs {
+		cexts = append(cexts, lang)
+	}
+	for _, cext := range cexts {
+		cext.RegisterFlags(fs, "update", c)
+	}
+
+	if err := fs.Parse(args); err != nil {
+		t.Fatal(err)
+	}
+	for _, cext := range cexts {
+		if err := cext.CheckFlags(fs, c); err != nil {
+			t.Fatal(err)
+		}
+	}
+
+	return c
 }
diff --git a/v2/cmd/gazelle/update/BUILD.bazel b/v2/cmd/gazelle/update/BUILD.bazel
index f8f0c19..7afc2e2 100644
--- a/v2/cmd/gazelle/update/BUILD.bazel
+++ b/v2/cmd/gazelle/update/BUILD.bazel
@@ -27,7 +27,7 @@
         "//v2/label",
         "//v2/merger",
         "//v2/rule",
-        "//v2/walk",
+        "//walk",
         "@com_github_bazelbuild_buildtools//build",
         "@com_github_pmezard_go_difflib//difflib",
     ],
diff --git a/v2/cmd/gazelle/update/update.go b/v2/cmd/gazelle/update/update.go
index aa2c266..a5b6b8c 100644
--- a/v2/cmd/gazelle/update/update.go
+++ b/v2/cmd/gazelle/update/update.go
@@ -39,7 +39,7 @@
 	"github.com/bazel-contrib/bazel-gazelle/v2/label"
 	"github.com/bazel-contrib/bazel-gazelle/v2/merger"
 	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
-	"github.com/bazel-contrib/bazel-gazelle/v2/walk"
+	"github.com/bazelbuild/bazel-gazelle/walk"
 	"github.com/bazelbuild/bazel-gazelle/config"
 	"github.com/bazelbuild/bazel-gazelle/language"
 	"github.com/bazelbuild/bazel-gazelle/repo"
diff --git a/v2/testtools/BUILD.bazel b/v2/testtools/BUILD.bazel
index 9ef3fe2..ed329ad 100644
--- a/v2/testtools/BUILD.bazel
+++ b/v2/testtools/BUILD.bazel
@@ -10,8 +10,9 @@
     importpath = "github.com/bazel-contrib/bazel-gazelle/v2/testtools",
     visibility = ["//visibility:public"],
     deps = [
-        "//config",
-        "//language",
+        "//v2/compat",
+        "//v2/config",
+        "//v2/language",
         "@com_github_google_go_cmp//cmp",
     ],
 )
diff --git a/v2/testtools/config.go b/v2/testtools/config.go
index 3586fda..9caf597 100644
--- a/v2/testtools/config.go
+++ b/v2/testtools/config.go
@@ -19,8 +19,9 @@
 	"flag"
 	"testing"
 
-	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/language"
+	"github.com/bazel-contrib/bazel-gazelle/v2/compat"
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	"github.com/bazel-contrib/bazel-gazelle/v2/language"
 )
 
 // NewTestConfig returns a Config used for tests in any language extension.
@@ -34,18 +35,24 @@
 	fs := flag.NewFlagSet("test", flag.ContinueOnError)
 
 	for _, lang := range langs {
-		cexts = append(cexts, lang)
+		if cfg, ok := compat.ConfigurerV2(lang); ok {
+			cexts = append(cexts, cfg)
+		}
 	}
 	for _, cext := range cexts {
-		cext.RegisterFlags(fs, "update", c)
+		if fc, ok := cext.(compat.FlagConfigurer); ok {
+			fc.RegisterFlags(fs, "update", c)
+		}
 	}
 
 	if err := fs.Parse(args); err != nil {
 		t.Fatal(err)
 	}
 	for _, cext := range cexts {
-		if err := cext.CheckFlags(fs, c); err != nil {
-			t.Fatal(err)
+		if fc, ok := cext.(compat.FlagConfigurer); ok {
+			if err := fc.CheckFlags(fs, c); err != nil {
+				t.Fatal(err)
+			}
 		}
 	}
 
diff --git a/v2/walk/BUILD.bazel b/v2/walk/BUILD.bazel
index e00762c..c2e466e 100644
--- a/v2/walk/BUILD.bazel
+++ b/v2/walk/BUILD.bazel
@@ -11,10 +11,10 @@
     importpath = "github.com/bazel-contrib/bazel-gazelle/v2/walk",
     visibility = ["//visibility:public"],
     deps = [
-        "//config",
-        "//flag",
-        "//pathtools",
-        "//rule",
+        "//v2/config",
+        "//v2/flag",
+        "//v2/pathtools",
+        "//v2/rule",
         "@com_github_bazelbuild_buildtools//build",
         "@com_github_bmatcuk_doublestar_v4//:doublestar",
     ],
@@ -28,9 +28,9 @@
     ],
     embed = [":walk"],
     deps = [
-        "//config",
-        "//rule",
-        "//testtools",
+        "//v2/config",
+        "//v2/rule",
+        "//v2/testtools",
         "@com_github_bmatcuk_doublestar_v4//:doublestar",
         "@com_github_google_go_cmp//cmp",
     ],
diff --git a/v2/walk/cache.go b/v2/walk/cache.go
index e2fbba5..e3e09aa 100644
--- a/v2/walk/cache.go
+++ b/v2/walk/cache.go
@@ -5,7 +5,7 @@
 	"path"
 	"sync"
 
-	"github.com/bazelbuild/bazel-gazelle/pathtools"
+	"github.com/bazel-contrib/bazel-gazelle/v2/pathtools"
 )
 
 // cache is an in-memory cache for file system information. Its purpose is to
diff --git a/v2/walk/config.go b/v2/walk/config.go
index f02c721..f3f482c 100644
--- a/v2/walk/config.go
+++ b/v2/walk/config.go
@@ -17,6 +17,7 @@
 
 import (
 	"bufio"
+	"context"
 	"errors"
 	"flag"
 	"fmt"
@@ -27,12 +28,11 @@
 	"path/filepath"
 	"strings"
 
-	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/rule"
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	gzflag "github.com/bazel-contrib/bazel-gazelle/v2/flag"
+	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
 	bzl "github.com/bazelbuild/buildtools/build"
 	"github.com/bmatcuk/doublestar/v4"
-
-	gzflag "github.com/bazelbuild/bazel-gazelle/flag"
 )
 
 // generationModeType represents one of the generation modes.
@@ -142,7 +142,8 @@
 	return []string{"build_file_name", "directive_file", "generation_mode", "exclude", "follow", "ignore"}
 }
 
-func (cr *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
+func (cr *Configurer) Configure(_ context.Context, args config.ConfigureArgs) error {
+	c := args.Config
 	if c.Exts[walkNameCached] != nil {
 		// A normal Configurer implementation would process directives and set
 		// c.Exts[walkName] here. However, we've parallelized the tree walk and
@@ -155,9 +156,10 @@
 	} else {
 		// In some unit tests, c.Exts[walkNameCached] is not set.
 		// Process directives normally using the same code.
-		c.Exts[walkName] = configureForWalk(getWalkConfig(c), rel, f)
+		c.Exts[walkName] = configureForWalk(getWalkConfig(c), args.Rel, args.File)
 	}
 	c.ValidBuildFileNames = getWalkConfig(c).validBuildFileNames
+	return nil
 }
 
 func configureForWalk(parent *walkConfig, rel string, f *rule.File) *walkConfig {
diff --git a/v2/walk/config_test.go b/v2/walk/config_test.go
index ce615d7..3995dfe 100644
--- a/v2/walk/config_test.go
+++ b/v2/walk/config_test.go
@@ -1,14 +1,15 @@
 package walk
 
 import (
+	"context"
 	"flag"
 	"os"
 	"path/filepath"
 	"reflect"
 	"testing"
 
-	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/rule"
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
 	"github.com/bmatcuk/doublestar/v4"
 )
 
@@ -74,7 +75,7 @@
 	if err := cc.CheckFlags(nil, c); err != nil {
 		t.Errorf("CheckFlags: %v", err)
 	}
-	cc.Configure(c, "", f)
+	cc.Configure(context.TODO(), config.ConfigureArgs{Config: c, Rel: "", File: f})
 	want := []string{"x", "y"}
 	if !reflect.DeepEqual(c.ValidBuildFileNames, want) {
 		t.Errorf("for ValidBuildFileNames, got %#v, want %#v", c.ValidBuildFileNames, want)
diff --git a/v2/walk/dirinfo.go b/v2/walk/dirinfo.go
index 97097aa..60be63c 100644
--- a/v2/walk/dirinfo.go
+++ b/v2/walk/dirinfo.go
@@ -8,7 +8,7 @@
 	"path/filepath"
 	"sync"
 
-	"github.com/bazelbuild/bazel-gazelle/rule"
+	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
 )
 
 // DirInfo holds all the information about a directory that Walk2 needs.
diff --git a/v2/walk/walk.go b/v2/walk/walk.go
index ca88b43..416682a 100644
--- a/v2/walk/walk.go
+++ b/v2/walk/walk.go
@@ -18,6 +18,7 @@
 package walk
 
 import (
+	"context"
 	"errors"
 	"fmt"
 	"io/fs"
@@ -27,9 +28,9 @@
 	"path/filepath"
 	"strings"
 
-	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/pathtools"
-	"github.com/bazelbuild/bazel-gazelle/rule"
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	"github.com/bazel-contrib/bazel-gazelle/v2/pathtools"
+	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
 )
 
 // Mode determines which directories Walk visits and which directories
@@ -435,7 +436,9 @@
 	// Configure the directory, if we haven't done so already.
 	_, alreadyConfigured := w.visits[rel]
 	if !containedByParent && !alreadyConfigured {
-		configure(w.cexts, w.knownDirectives, c, rel, info.File, info.config)
+		if err := configure(w.cexts, w.knownDirectives, c, rel, info.File, info.config); err != nil {
+			w.errs = append(w.errs, err)
+		}
 	}
 
 	regularFiles := info.RegularFiles
@@ -531,7 +534,7 @@
 	return rule.LoadFile(path, pkg)
 }
 
-func configure(cexts []config.Configurer, knownDirectives map[string]bool, c *config.Config, rel string, f *rule.File, wc *walkConfig) {
+func configure(cexts []config.Configurer, knownDirectives map[string]bool, c *config.Config, rel string, f *rule.File, wc *walkConfig) error {
 	if f != nil {
 		for _, d := range f.Directives {
 			if !knownDirectives[d.Key] {
@@ -545,9 +548,17 @@
 		}
 	}
 	c.Exts[walkNameCached] = wc
+	var errs []error
 	for _, cext := range cexts {
-		cext.Configure(c, rel, f)
+		if err := cext.Configure(context.TODO(), config.ConfigureArgs{
+			Config: c,
+			Rel:    rel,
+			File:   f,
+		}); err != nil {
+			errs = append(errs, err)
+		}
 	}
+	return errors.Join(errs...)
 }
 
 func findGenFiles(wc *walkConfig, f *rule.File) []string {
diff --git a/v2/walk/walk_test.go b/v2/walk/walk_test.go
index d295ac0..83d3109 100644
--- a/v2/walk/walk_test.go
+++ b/v2/walk/walk_test.go
@@ -17,6 +17,7 @@
 
 import (
 	"bytes"
+	"context"
 	"flag"
 	"fmt"
 	"os"
@@ -26,9 +27,9 @@
 	"strings"
 	"testing"
 
-	"github.com/bazelbuild/bazel-gazelle/config"
-	"github.com/bazelbuild/bazel-gazelle/rule"
-	"github.com/bazelbuild/bazel-gazelle/testtools"
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	"github.com/bazel-contrib/bazel-gazelle/v2/rule"
+	"github.com/bazel-contrib/bazel-gazelle/v2/testtools"
 	"github.com/google/go-cmp/cmp"
 )
 
@@ -901,14 +902,11 @@
 	configure func(c *config.Config, rel string, f *rule.File)
 }
 
-func (*testConfigurer) RegisterFlags(_ *flag.FlagSet, _ string, _ *config.Config) {}
-
-func (*testConfigurer) CheckFlags(_ *flag.FlagSet, _ *config.Config) error { return nil }
-
 func (*testConfigurer) KnownDirectives() []string { return nil }
 
-func (tc *testConfigurer) Configure(c *config.Config, rel string, f *rule.File) {
-	tc.configure(c, rel, f)
+func (tc *testConfigurer) Configure(_ context.Context, args config.ConfigureArgs) error {
+	tc.configure(args.Config, args.Rel, args.File)
+	return nil
 }
 
 func TestDirectiveFile(t *testing.T) {
@@ -1170,14 +1168,14 @@
 	c.IndexLibraries = true
 	fs := flag.NewFlagSet("gazelle", flag.ContinueOnError)
 	for _, cext := range cexts {
-		cext.RegisterFlags(fs, "update", c)
+		cext.(*Configurer).RegisterFlags(fs, "update", c)
 	}
 	args := []string{rootDir}
 	if err := fs.Parse(args); err != nil {
 		b.Fatal(err)
 	}
 	for _, cext := range cexts {
-		cext.CheckFlags(fs, c)
+		cext.(*Configurer).CheckFlags(fs, c)
 	}
 
 	// Benchmark calling Walk with a trivial callback function.
diff --git a/walk/BUILD.bazel b/walk/BUILD.bazel
index 9f7f77a..42ddfb0 100644
--- a/walk/BUILD.bazel
+++ b/walk/BUILD.bazel
@@ -12,6 +12,9 @@
     visibility = ["//visibility:public"],
     deps = [
         "//config",
+        "//rule",
+        "//v2/compat",
+        "//v2/config",
         "//v2/walk",
     ],
 )
diff --git a/walk/config.go b/walk/config.go
index ae21f22..86ac7eb 100644
--- a/walk/config.go
+++ b/walk/config.go
@@ -15,7 +15,38 @@
 
 package walk
 
-import v2 "github.com/bazel-contrib/bazel-gazelle/v2/walk"
+import (
+	"context"
+	"flag"
 
+	"github.com/bazel-contrib/bazel-gazelle/v2/config"
+	v2 "github.com/bazel-contrib/bazel-gazelle/v2/walk"
+	"github.com/bazelbuild/bazel-gazelle/rule"
+)
+
+// Configurer sets walk-specific configuration in each directory.
+//
 // Deprecated: Use github.com/bazel-contrib/bazel-gazelle/v2/walk.Configurer instead.
-type Configurer = v2.Configurer
+type Configurer struct {
+	v2 v2.Configurer
+}
+
+func (cr *Configurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) {
+	cr.v2.RegisterFlags(fs, cmd, c)
+}
+
+func (cr *Configurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error {
+	return cr.v2.CheckFlags(fs, c)
+}
+
+func (cr *Configurer) KnownDirectives() []string {
+	return cr.v2.KnownDirectives()
+}
+
+func (cr *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
+	cr.v2.Configure(context.TODO(), config.ConfigureArgs{
+		Config: c,
+		Rel:    rel,
+		File:   f,
+	})
+}
diff --git a/walk/walk.go b/walk/walk.go
index 2db8ec1..db0c6de 100644
--- a/walk/walk.go
+++ b/walk/walk.go
@@ -18,6 +18,8 @@
 package walk
 
 import (
+	"github.com/bazel-contrib/bazel-gazelle/v2/compat"
+	v2config "github.com/bazel-contrib/bazel-gazelle/v2/config"
 	v2 "github.com/bazel-contrib/bazel-gazelle/v2/walk"
 	"github.com/bazelbuild/bazel-gazelle/config"
 )
@@ -101,7 +103,11 @@
 //
 // Deprecated: Use github.com/bazel-contrib/bazel-gazelle/v2/walk.Walk instead.
 func Walk(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode, wf WalkFunc) {
-	v2.Walk(c, cexts, dirs, mode, wf)
+	v2cexts := make([]v2config.Configurer, len(cexts))
+	for i, cext := range cexts {
+		v2cexts[i] = compat.MustConfigurerV2(cext)
+	}
+	v2.Walk(c, v2cexts, dirs, mode, wf)
 }
 
 // Deprecated: Use github.com/bazel-contrib/bazel-gazelle/v2/walk.Walk2Func instead.
@@ -134,5 +140,9 @@
 //
 // Deprecated: Use github.com/bazel-contrib/bazel-gazelle/v2/walk.Walk2 instead.
 func Walk2(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode, wf Walk2Func) error {
-	return v2.Walk2(c, cexts, dirs, mode, wf)
+	v2cexts := make([]v2config.Configurer, len(cexts))
+	for i, cext := range cexts {
+		v2cexts[i] = compat.MustConfigurerV2(cext)
+	}
+	return v2.Walk2(c, v2cexts, dirs, mode, wf)
 }