diff --git a/docs/flatten.md b/docs/flatten.md index 9606a49f68..ffc10f312a 100644 --- a/docs/flatten.md +++ b/docs/flatten.md @@ -1721,6 +1721,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js | :------------- | :------------- | | deps| String | | proc_macro_deps| String | +| crate| String | **ATTRIBUTES** diff --git a/docs/rust_analyzer.md b/docs/rust_analyzer.md index f6b2a5e196..8678da8629 100644 --- a/docs/rust_analyzer.md +++ b/docs/rust_analyzer.md @@ -129,6 +129,7 @@ Annotates rust rules with RustAnalyzerInfo later used to build a rust-project.js | :------------- | :------------- | | deps| String | | proc_macro_deps| String | +| crate| String | **ATTRIBUTES** diff --git a/rust/private/rust_analyzer.bzl b/rust/private/rust_analyzer.bzl index 15156f1ae9..3b16dcd574 100644 --- a/rust/private/rust_analyzer.bzl +++ b/rust/private/rust_analyzer.bzl @@ -66,6 +66,9 @@ def _rust_analyzer_aspect_impl(target, ctx): 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"): + dep_infos.append(ctx.rule.attr.crate[RustAnalyzerInfo]) + transitive_deps = depset(direct = dep_infos, order = "postorder", transitive = [dep.transitive_deps for dep in dep_infos]) crate_info = target[rust_common.crate_info] @@ -102,7 +105,7 @@ def find_proc_macro_dylib_path(toolchain, target): return None rust_analyzer_aspect = aspect( - attr_aspects = ["deps", "proc_macro_deps"], + attr_aspects = ["deps", "proc_macro_deps", "crate"], implementation = _rust_analyzer_aspect_impl, toolchains = [str(Label("//rust:toolchain"))], incompatible_use_toolchain_transition = True, diff --git a/test/rust_analyzer/BUILD.bazel b/test/rust_analyzer/BUILD.bazel new file mode 100644 index 0000000000..c120cc24e2 --- /dev/null +++ b/test/rust_analyzer/BUILD.bazel @@ -0,0 +1,50 @@ +load("//rust:defs.bzl", "rust_analyzer", "rust_library", "rust_proc_macro", "rust_test") + +rust_library( + name = "mylib", + srcs = ["mylib.rs"], + proc_macro_deps = [":proc_macro_dep"], + deps = [":lib_dep"], +) + +rust_library( + name = "lib_dep", + srcs = ["lib_dep.rs"], +) + +rust_proc_macro( + name = "proc_macro_dep", + srcs = ["proc_macro_dep.rs"], +) + +rust_test( + name = "mylib_test", + crate = ":mylib", + proc_macro_deps = [":extra_proc_macro_dep"], + deps = [":extra_test_dep"], +) + +rust_library( + name = "extra_test_dep", + srcs = ["extra_test_dep.rs"], +) + +rust_proc_macro( + name = "extra_proc_macro_dep", + srcs = ["extra_proc_macro_dep.rs"], +) + +rust_analyzer( + name = "rust_analyzer", + testonly = True, + targets = [":mylib_test"], +) + +rust_test( + name = "rust_project_json_test", + srcs = ["rust_project_json_test.rs"], + data = [":rust-project.json"], + edition = "2018", + use_libtest_harness = False, + deps = ["//tools/runfiles"], +) diff --git a/test/rust_analyzer/extra_proc_macro_dep.rs b/test/rust_analyzer/extra_proc_macro_dep.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/rust_analyzer/extra_proc_macro_dep.rs @@ -0,0 +1 @@ + diff --git a/test/rust_analyzer/extra_test_dep.rs b/test/rust_analyzer/extra_test_dep.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/rust_analyzer/extra_test_dep.rs @@ -0,0 +1 @@ + diff --git a/test/rust_analyzer/lib_dep.rs b/test/rust_analyzer/lib_dep.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/rust_analyzer/lib_dep.rs @@ -0,0 +1 @@ + diff --git a/test/rust_analyzer/mylib.rs b/test/rust_analyzer/mylib.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/rust_analyzer/mylib.rs @@ -0,0 +1 @@ + diff --git a/test/rust_analyzer/proc_macro_dep.rs b/test/rust_analyzer/proc_macro_dep.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/test/rust_analyzer/proc_macro_dep.rs @@ -0,0 +1 @@ + diff --git a/test/rust_analyzer/rust_project_json_test.rs b/test/rust_analyzer/rust_project_json_test.rs new file mode 100644 index 0000000000..758adee4b1 --- /dev/null +++ b/test/rust_analyzer/rust_project_json_test.rs @@ -0,0 +1,20 @@ +use runfiles::Runfiles; + +fn main() { + let r = Runfiles::create().unwrap(); + let rust_project_path = r.rlocation("rules_rust/test/rust_analyzer/rust-project.json"); + + let content = std::fs::read_to_string(&rust_project_path) + .expect(&format!("couldn't open {:?}", &rust_project_path)); + + for dep in &[ + "lib_dep", + "extra_test_dep", + "proc_macro_dep", + "extra_proc_macro_dep", + ] { + if !content.contains(dep) { + panic!("expected rust-project.json to contain {}.", dep); + } + } +}