Skip to content

Commit

Permalink
Traverse custom alias-like rules in the rust analyzer aspect (#1190)
Browse files Browse the repository at this point in the history
  • Loading branch information
hlopko committed Mar 15, 2022
1 parent 4504983 commit a665447
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/flatten.md
Original file line number Diff line number Diff line change
Expand Up @@ -1740,6 +1740,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js
| deps| String |
| proc_macro_deps| String |
| crate| String |
| actual| String |


**ATTRIBUTES**
Expand Down
1 change: 1 addition & 0 deletions docs/rust_analyzer.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js
| deps| String |
| proc_macro_deps| String |
| crate| String |
| actual| String |


**ATTRIBUTES**
Expand Down
16 changes: 10 additions & 6 deletions rust/private/rust_analyzer.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,21 @@ def _rust_analyzer_aspect_impl(target, ctx):
if hasattr(ctx.rule.attr, "rustc_flags"):
cfgs += [f[6:] for f in ctx.rule.attr.rustc_flags if f.startswith("--cfg ") or f.startswith("--cfg=")]

# Save BuildInfo if we find any (for build script output)
build_info = None
for dep in ctx.rule.attr.deps:
if BuildInfo in dep:
build_info = dep[BuildInfo]
dep_infos = []
if hasattr(ctx.rule.attr, "deps"):
for dep in ctx.rule.attr.deps:
# Save BuildInfo if we find any (for build script output)
if BuildInfo in dep:
build_info = dep[BuildInfo]
dep_infos = [dep[RustAnalyzerInfo] for dep in ctx.rule.attr.deps if RustAnalyzerInfo in dep]

dep_infos = [dep[RustAnalyzerInfo] for dep in ctx.rule.attr.deps if RustAnalyzerInfo in dep]
if hasattr(ctx.rule.attr, "proc_macro_deps"):
dep_infos += [dep[RustAnalyzerInfo] for dep in ctx.rule.attr.proc_macro_deps if RustAnalyzerInfo in dep]
if hasattr(ctx.rule.attr, "crate") and ctx.rule.attr.crate != None:
dep_infos.append(ctx.rule.attr.crate[RustAnalyzerInfo])
if hasattr(ctx.rule.attr, "actual") and ctx.rule.attr.actual != None and RustAnalyzerInfo in ctx.rule.attr.actual:
dep_infos.append(ctx.rule.attr.actual[RustAnalyzerInfo])

crate_spec = ctx.actions.declare_file(ctx.label.name + ".rust_analyzer_crate_spec")

Expand Down Expand Up @@ -111,7 +115,7 @@ def find_proc_macro_dylib_path(toolchain, target):
return None

rust_analyzer_aspect = aspect(
attr_aspects = ["deps", "proc_macro_deps", "crate"],
attr_aspects = ["deps", "proc_macro_deps", "crate", "actual"],
implementation = _rust_analyzer_aspect_impl,
toolchains = [str(Label("//rust:toolchain"))],
incompatible_use_toolchain_transition = True,
Expand Down
18 changes: 18 additions & 0 deletions test/rust_analyzer/aspect_traversal_test/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_proc_macro", "rust_test")
load(":custom_alias.bzl", "custom_alias")

rust_library(
name = "mylib",
srcs = ["mylib.rs"],
proc_macro_deps = [":proc_macro_dep"],
deps = [
":alias_dep",
":custom_alias_dep",
":lib_dep",
],
)
Expand All @@ -31,6 +33,22 @@ rust_library(
srcs = ["dep_of_aliased_dep.rs"],
)

custom_alias(
name = "custom_alias_dep",
actual = ":custom_actual_dep",
)

rust_library(
name = "custom_actual_dep",
srcs = ["custom_actual_dep.rs"],
deps = [":dep_of_custom_aliased_dep"],
)

rust_library(
name = "dep_of_custom_aliased_dep",
srcs = ["dep_of_custom_aliased_dep.rs"],
)

rust_proc_macro(
name = "proc_macro_dep",
srcs = ["proc_macro_dep.rs"],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

17 changes: 17 additions & 0 deletions test/rust_analyzer/aspect_traversal_test/custom_alias.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Alias-like rule for testing."""

load("@rules_rust//rust:defs.bzl", "rust_common")

def _custom_alias_impl(ctx):
actual = ctx.attr.actual
return [actual[rust_common.crate_info], actual[rust_common.dep_info]]

custom_alias = rule(
implementation = _custom_alias_impl,
attrs = {
"actual": attr.label(
allow_single_file = True,
mandatory = True,
),
},
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ mod tests {
"lib_dep",
"actual_dep",
"dep_of_aliased_dep",
"custom_actual_dep",
"dep_of_custom_aliased_dep",
"extra_test_dep",
"proc_macro_dep",
"extra_proc_macro_dep",
Expand Down

0 comments on commit a665447

Please sign in to comment.