fix(gazelle) Register pyi_deps as ResolveAttrs (#3037)
Fix an issue in https://github.com/bazel-contrib/rules_python/pull/3014
where, when all type-checking dependencies are removed from a file, the
corresponding target's `pyi_deps` doesn't get cleaned up. I traced this
back to `ResolveAttrs`, though I'm not entirely sure of what other
behaviors this may trigger. (Currently, removing `deps` from
`ResolveAttrs` doesn't break any existing test case)
(No new changelog entry since this is a fix to an unreleased feature
that is already in the changelog)
diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go
index 7a0639a..ff3f6ce 100644
--- a/gazelle/python/kinds.go
+++ b/gazelle/python/kinds.go
@@ -46,6 +46,7 @@
},
ResolveAttrs: map[string]bool{
"deps": true,
+ "pyi_deps": true,
},
},
pyLibraryKind: {
@@ -62,6 +63,7 @@
},
ResolveAttrs: map[string]bool{
"deps": true,
+ "pyi_deps": true,
},
},
pyTestKind: {
@@ -78,6 +80,7 @@
},
ResolveAttrs: map[string]bool{
"deps": true,
+ "pyi_deps": true,
},
},
}
diff --git a/gazelle/python/testdata/clear_out_deps/BUILD.in b/gazelle/python/testdata/clear_out_deps/BUILD.in
new file mode 100644
index 0000000..99d122a
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/BUILD.in
@@ -0,0 +1 @@
+# gazelle:python_generate_pyi_deps true
diff --git a/gazelle/python/testdata/clear_out_deps/BUILD.out b/gazelle/python/testdata/clear_out_deps/BUILD.out
new file mode 100644
index 0000000..99d122a
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/BUILD.out
@@ -0,0 +1 @@
+# gazelle:python_generate_pyi_deps true
diff --git a/gazelle/python/testdata/clear_out_deps/README.md b/gazelle/python/testdata/clear_out_deps/README.md
new file mode 100644
index 0000000..53b62a4
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/README.md
@@ -0,0 +1,9 @@
+# Clearing deps / pyi_deps
+
+This test case asserts that an existing `py_library` specifying `deps` and
+`pyi_deps` have these attributes removed if the corresponding imports are
+removed.
+
+`a/BUILD.in` declares `deps`/`pyi_deps` on non-existing libraries, `b/BUILD.in` declares dependency on `//a`
+without a matching import, and `c/BUILD.in` declares both `deps` and `pyi_deps` as `["//a", "//b"]`, but
+it should have only `//a` as `deps` and only `//b` as `pyi_deps`.
diff --git a/gazelle/python/testdata/clear_out_deps/WORKSPACE b/gazelle/python/testdata/clear_out_deps/WORKSPACE
new file mode 100644
index 0000000..faff6af
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/WORKSPACE
@@ -0,0 +1 @@
+# This is a Bazel workspace for the Gazelle test data.
diff --git a/gazelle/python/testdata/clear_out_deps/a/BUILD.in b/gazelle/python/testdata/clear_out_deps/a/BUILD.in
new file mode 100644
index 0000000..832683b
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/a/BUILD.in
@@ -0,0 +1,9 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "a",
+ srcs = ["__init__.py"],
+ pyi_deps = ["//:nonexistent_pyi_dep"],
+ visibility = ["//:__subpackages__"],
+ deps = ["//nonexistent_dep"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/a/BUILD.out b/gazelle/python/testdata/clear_out_deps/a/BUILD.out
new file mode 100644
index 0000000..2668e97
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/a/BUILD.out
@@ -0,0 +1,7 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "a",
+ srcs = ["__init__.py"],
+ visibility = ["//:__subpackages__"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/a/__init__.py b/gazelle/python/testdata/clear_out_deps/a/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/a/__init__.py
diff --git a/gazelle/python/testdata/clear_out_deps/b/BUILD.in b/gazelle/python/testdata/clear_out_deps/b/BUILD.in
new file mode 100644
index 0000000..14cce87
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/b/BUILD.in
@@ -0,0 +1,9 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "b",
+ srcs = ["__init__.py"],
+ pyi_deps = ["//a"],
+ visibility = ["//:__subpackages__"],
+ deps = ["//a"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/b/BUILD.out b/gazelle/python/testdata/clear_out_deps/b/BUILD.out
new file mode 100644
index 0000000..7305850
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/b/BUILD.out
@@ -0,0 +1,7 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "b",
+ srcs = ["__init__.py"],
+ visibility = ["//:__subpackages__"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/b/__init__.py b/gazelle/python/testdata/clear_out_deps/b/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/b/__init__.py
diff --git a/gazelle/python/testdata/clear_out_deps/c/BUILD.in b/gazelle/python/testdata/clear_out_deps/c/BUILD.in
new file mode 100644
index 0000000..10ace67
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/c/BUILD.in
@@ -0,0 +1,9 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "c",
+ srcs = ["__init__.py"],
+ pyi_deps = ["//a", "//b"],
+ visibility = ["//:__subpackages__"],
+ deps = ["//a", "//b"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/c/BUILD.out b/gazelle/python/testdata/clear_out_deps/c/BUILD.out
new file mode 100644
index 0000000..d1aa97e
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/c/BUILD.out
@@ -0,0 +1,9 @@
+load("@rules_python//python:defs.bzl", "py_library")
+
+py_library(
+ name = "c",
+ srcs = ["__init__.py"],
+ pyi_deps = ["//b"],
+ visibility = ["//:__subpackages__"],
+ deps = ["//a"],
+)
diff --git a/gazelle/python/testdata/clear_out_deps/c/__init__.py b/gazelle/python/testdata/clear_out_deps/c/__init__.py
new file mode 100644
index 0000000..32d017f
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/c/__init__.py
@@ -0,0 +1,6 @@
+from typing import TYPE_CHECKING
+
+import a
+
+if TYPE_CHECKING:
+ import b
diff --git a/gazelle/python/testdata/clear_out_deps/test.yaml b/gazelle/python/testdata/clear_out_deps/test.yaml
new file mode 100644
index 0000000..88a0cbf
--- /dev/null
+++ b/gazelle/python/testdata/clear_out_deps/test.yaml
@@ -0,0 +1,2 @@
+
+---