Skip to content

Commit

Permalink
Gazelle now handles imports from @bazel_tools
Browse files Browse the repository at this point in the history
`@bazel_tools` is tricky since it is effectively a part of the standard
library that can not have a `bzl_library` attached to it. As a simple
fix for this, `bzl_library` can have a srcs dependency on it so that it
includes the transitive closure of all of its dependencies.

`@bazel_tools` imports are rewritten into the `srcs` attribute since
they are `exports_files`ed from the @bazel_tools.
  • Loading branch information
achew22 committed Sep 16, 2020
1 parent 2a89db4 commit a71dc18
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 14 deletions.
39 changes: 25 additions & 14 deletions gazelle/bzl/gazelle.go
Expand Up @@ -161,26 +161,37 @@ func (*bzlLibraryLang) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo
// the index only contains absolute labels, not relative
impLabel = impLabel.Abs(from.Repo, from.Pkg)

if impLabel.Repo == "bazel_tools" {
// The @bazel_tools repo is tricky because it is a part of the "shipped
// with bazel" core library for interacting with the outside world.
// This means that it can not depend on skylib. Fortunately there is a
// fairly simple workaround for this, which is that you can add those
// bzl files as `deps` entries.
deps = append(deps, imp)
continue
}

if impLabel.Repo != "" || !c.IndexLibraries {
// This is a dependency that is external to the current repo, or indexing
// is disabled so take a guess at what hte target name should be.
deps = append(deps, strings.TrimSuffix(imp, fileType))
} else {
res := resolve.ImportSpec{
Lang: languageName,
Imp: impLabel.String(),
}
matches := ix.FindRulesByImport(res, languageName)
continue
}

if len(matches) == 0 {
log.Printf("%s: %q (%s) was not found in dependency index. Skipping. This may result in an incomplete deps section and require manual BUILD file intervention.\n", from.String(), imp, impLabel.String())
}
res := resolve.ImportSpec{
Lang: languageName,
Imp: impLabel.String(),
}
matches := ix.FindRulesByImport(res, languageName)

for _, m := range matches {
depLabel := m.Label
depLabel = depLabel.Rel(from.Repo, from.Pkg)
deps = append(deps, depLabel.String())
}
if len(matches) == 0 {
log.Printf("%s: %q (%s) was not found in dependency index. Skipping. This may result in an incomplete deps section and require manual BUILD file intervention.\n", from.String(), imp, impLabel.String())
}

for _, m := range matches {
depLabel := m.Label
depLabel = depLabel.Rel(from.Repo, from.Pkg)
deps = append(deps, depLabel.String())
}
}

Expand Down
6 changes: 6 additions & 0 deletions gazelle/bzl/testdata/bazel_tools/BUILD.in
@@ -0,0 +1,6 @@
# Some comment to be preserved

filegroup(
name = "allfiles",
srcs = glob(["**"]),
)
15 changes: 15 additions & 0 deletions gazelle/bzl/testdata/bazel_tools/BUILD.out
@@ -0,0 +1,15 @@
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")

# Some comment to be preserved

filegroup(
name = "allfiles",
srcs = glob(["**"]),
)

bzl_library(
name = "foo",
srcs = ["foo.bzl"],
visibility = ["//visibility:public"],
deps = ["@bazel_tools//tools/build_defs/repo:http.bzl"],
)
Empty file.
10 changes: 10 additions & 0 deletions gazelle/bzl/testdata/bazel_tools/foo.bzl
@@ -0,0 +1,10 @@
"""
Doc string
"""

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

def wrapped_http_archive(**kwargs):
http_archive(
**kwargs
)

0 comments on commit a71dc18

Please sign in to comment.