From faf4196e98a63ab5c5395360e92cae2d069ade59 Mon Sep 17 00:00:00 2001 From: Ulan Degenbaev Date: Tue, 24 Oct 2023 14:49:42 +0000 Subject: [PATCH 1/4] Fix handling of proc macro deps with multiple kinds A proc macro dependency may have multiple kinds such as build and normal. Due to a bug in filtering predicate, such dependencies are considered only as build dependency. This PR fixes the bug and adds a regression test. Issue: #2210 --- crate_universe/src/metadata/dependency.rs | 19 ++++++++++++++++++- crate_universe/src/test.rs | 8 ++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/crate_universe/src/metadata/dependency.rs b/crate_universe/src/metadata/dependency.rs index fcc058bffd..9e68d578b0 100644 --- a/crate_universe/src/metadata/dependency.rs +++ b/crate_universe/src/metadata/dependency.rs @@ -59,7 +59,7 @@ impl DependencySet { // Do not track workspace members as dependencies. Users are expected to maintain those connections .filter(|dep| !is_workspace_member(dep, metadata)) .filter(|dep| is_proc_macro_package(&metadata[&dep.pkg])) - .filter(|dep| !is_build_dependency(dep)) + .filter(|dep| is_normal_dependency(dep) || is_dev_dependency(dep)) .partition(|dep| is_dev_dependency(dep)); ( @@ -604,6 +604,23 @@ mod test { ); } + #[test] + fn multi_kind_proc_macro_dep() { + let metadata = metadata::multi_kind_proc_macro_dep(); + + let node = find_metadata_node("multi-kind-proc-macro-dep", &metadata); + let dependencies = DependencySet::new_for_node(node, &metadata); + + let result: Vec<_> = dependencies + .proc_macro_deps + .get_iter(None) + .unwrap() + .map(|dep| dep.target_name.clone()) + .collect(); + + assert_eq!(result, vec!["paste"]); + } + #[test] fn optional_deps_disabled() { let metadata = metadata::optional_deps_disabled(); diff --git a/crate_universe/src/test.rs b/crate_universe/src/test.rs index e97e20b654..cdb38ce5f7 100644 --- a/crate_universe/src/test.rs +++ b/crate_universe/src/test.rs @@ -75,6 +75,14 @@ pub mod metadata { .unwrap() } + pub fn multi_kind_proc_macro_dep() -> cargo_metadata::Metadata { + serde_json::from_str(include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/test_data/metadata/multi_kind_proc_macro_dep/metadata.json" + ))) + .unwrap() + } + pub fn no_deps() -> cargo_metadata::Metadata { serde_json::from_str(include_str!(concat!( env!("CARGO_MANIFEST_DIR"), From 00ebad1b242ab6e6381512ec7759fa05e52f50c7 Mon Sep 17 00:00:00 2001 From: Ulan Degenbaev Date: Tue, 24 Oct 2023 14:56:09 +0000 Subject: [PATCH 2/4] Add missing test files --- .../multi_kind_proc_macro_dep/Cargo.lock | 16 + .../multi_kind_proc_macro_dep/Cargo.toml | 17 + .../multi_kind_proc_macro_dep/metadata.json | 297 ++++++++++++++++++ 3 files changed, 330 insertions(+) create mode 100644 crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.lock create mode 100644 crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml create mode 100644 crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json diff --git a/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.lock b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.lock new file mode 100644 index 0000000000..df2652de8a --- /dev/null +++ b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "multi-kind-proc-macro-dep" +version = "0.1.0" +dependencies = [ + "paste", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" diff --git a/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml new file mode 100644 index 0000000000..dc5ede1169 --- /dev/null +++ b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "multi-kind-proc-macro-dep" +version = "0.1.0" +edition = "2018" + +# Required to satisfy cargo but no `lib.rs` is expected to +# exist within test data. +[lib] +path = "lib.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +paste = "=1.0.14" + +[build-dependencies] +paste = "=1.0.14" diff --git a/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json new file mode 100644 index 0000000000..524e0722d9 --- /dev/null +++ b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json @@ -0,0 +1,297 @@ +{ + "packages": [ + { + "name": "multi-kind-proc-macro-dep", + "version": "0.1.0", + "id": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)", + "license": null, + "license_file": null, + "description": null, + "source": null, + "dependencies": [ + { + "name": "paste", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "req": "=1.0.14", + "kind": null, + "rename": null, + "optional": false, + "uses_default_features": true, + "features": [], + "target": null, + "registry": null + }, + { + "name": "paste", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "req": "=1.0.14", + "kind": "build", + "rename": null, + "optional": false, + "uses_default_features": true, + "features": [], + "target": null, + "registry": null + } + ], + "targets": [ + { + "kind": [ + "lib" + ], + "crate_types": [ + "lib" + ], + "name": "multi-kind-proc-macro-dep", + "src_path": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/lib.rs", + "edition": "2018", + "doc": true, + "doctest": true, + "test": true + } + ], + "features": {}, + "manifest_path": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml", + "metadata": null, + "publish": null, + "authors": [], + "categories": [], + "keywords": [], + "readme": null, + "repository": null, + "homepage": null, + "documentation": null, + "edition": "2018", + "links": null, + "default_run": null, + "rust_version": null + }, + { + "name": "paste", + "version": "1.0.14", + "id": "paste 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "license": "MIT OR Apache-2.0", + "license_file": null, + "description": "Macros for all your token pasting needs", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "dependencies": [ + { + "name": "paste-test-suite", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "req": "^0", + "kind": "dev", + "rename": null, + "optional": false, + "uses_default_features": true, + "features": [], + "target": null, + "registry": null + }, + { + "name": "rustversion", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "req": "^1.0", + "kind": "dev", + "rename": null, + "optional": false, + "uses_default_features": true, + "features": [], + "target": null, + "registry": null + }, + { + "name": "trybuild", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "req": "^1.0.49", + "kind": "dev", + "rename": null, + "optional": false, + "uses_default_features": true, + "features": [ + "diff" + ], + "target": null, + "registry": null + } + ], + "targets": [ + { + "kind": [ + "proc-macro" + ], + "crate_types": [ + "proc-macro" + ], + "name": "paste", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/src/lib.rs", + "edition": "2018", + "doc": true, + "doctest": true, + "test": true + }, + { + "kind": [ + "test" + ], + "crate_types": [ + "bin" + ], + "name": "test_doc", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_doc.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": true + }, + { + "kind": [ + "test" + ], + "crate_types": [ + "bin" + ], + "name": "test_item", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_item.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": true + }, + { + "kind": [ + "test" + ], + "crate_types": [ + "bin" + ], + "name": "test_attr", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_attr.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": true + }, + { + "kind": [ + "test" + ], + "crate_types": [ + "bin" + ], + "name": "test_expr", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_expr.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": true + }, + { + "kind": [ + "test" + ], + "crate_types": [ + "bin" + ], + "name": "compiletest", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/compiletest.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": true + }, + { + "kind": [ + "custom-build" + ], + "crate_types": [ + "bin" + ], + "name": "build-script-build", + "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/build.rs", + "edition": "2018", + "doc": false, + "doctest": false, + "test": false + } + ], + "features": {}, + "manifest_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/Cargo.toml", + "metadata": { + "docs": { + "rs": { + "rustdoc-args": [ + "--generate-link-to-definition" + ], + "targets": [ + "x86_64-unknown-linux-gnu" + ] + } + } + }, + "publish": null, + "authors": [ + "David Tolnay " + ], + "categories": [ + "development-tools", + "no-std", + "no-std::no-alloc" + ], + "keywords": [ + "macros" + ], + "readme": "README.md", + "repository": "https://github.com/dtolnay/paste", + "homepage": null, + "documentation": null, + "edition": "2018", + "links": null, + "default_run": null, + "rust_version": "1.31" + } + ], + "workspace_members": [ + "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + ], + "workspace_default_members": [ + "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + ], + "resolve": { + "nodes": [ + { + "id": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)", + "dependencies": [ + "paste 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" + ], + "deps": [ + { + "name": "paste", + "pkg": "paste 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "dep_kinds": [ + { + "kind": null, + "target": null + }, + { + "kind": "build", + "target": null + } + ] + } + ], + "features": [] + }, + { + "id": "paste 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "dependencies": [], + "deps": [], + "features": [] + } + ], + "root": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + }, + "target_directory": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/target", + "version": 1, + "workspace_root": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep", + "metadata": null +} From 27943716a854f54b07f89ae10b1966e3d432b165 Mon Sep 17 00:00:00 2001 From: Ulan Degenbaev Date: Tue, 24 Oct 2023 14:59:29 +0000 Subject: [PATCH 3/4] Remove reference to local dirs --- .../multi_kind_proc_macro_dep/metadata.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json index 524e0722d9..0c95a7469b 100644 --- a/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json +++ b/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/metadata.json @@ -3,7 +3,7 @@ { "name": "multi-kind-proc-macro-dep", "version": "0.1.0", - "id": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)", + "id": "multi-kind-proc-macro-dep 0.1.0 (path+file://{TMP_DIR}/multi_kind_proc_macro_dep)", "license": null, "license_file": null, "description": null, @@ -43,7 +43,7 @@ "lib" ], "name": "multi-kind-proc-macro-dep", - "src_path": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/lib.rs", + "src_path": "{TMP_DIR}/multi_kind_proc_macro_dep/lib.rs", "edition": "2018", "doc": true, "doctest": true, @@ -51,7 +51,7 @@ } ], "features": {}, - "manifest_path": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/Cargo.toml", + "manifest_path": "{TMP_DIR}/multi_kind_proc_macro_dep/Cargo.toml", "metadata": null, "publish": null, "authors": [], @@ -123,7 +123,7 @@ "proc-macro" ], "name": "paste", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/src/lib.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/src/lib.rs", "edition": "2018", "doc": true, "doctest": true, @@ -137,7 +137,7 @@ "bin" ], "name": "test_doc", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_doc.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_doc.rs", "edition": "2018", "doc": false, "doctest": false, @@ -151,7 +151,7 @@ "bin" ], "name": "test_item", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_item.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_item.rs", "edition": "2018", "doc": false, "doctest": false, @@ -165,7 +165,7 @@ "bin" ], "name": "test_attr", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_attr.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_attr.rs", "edition": "2018", "doc": false, "doctest": false, @@ -179,7 +179,7 @@ "bin" ], "name": "test_expr", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_expr.rs", + "src_path": "{CARGO_HOME}registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/test_expr.rs", "edition": "2018", "doc": false, "doctest": false, @@ -193,7 +193,7 @@ "bin" ], "name": "compiletest", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/compiletest.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/tests/compiletest.rs", "edition": "2018", "doc": false, "doctest": false, @@ -207,7 +207,7 @@ "bin" ], "name": "build-script-build", - "src_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/build.rs", + "src_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/build.rs", "edition": "2018", "doc": false, "doctest": false, @@ -215,7 +215,7 @@ } ], "features": {}, - "manifest_path": "/home/ulan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/Cargo.toml", + "manifest_path": "{CARGO_HOME}/registry/src/index.crates.io-6f17d22bba15001f/paste-1.0.14/Cargo.toml", "metadata": { "docs": { "rs": { @@ -251,15 +251,15 @@ } ], "workspace_members": [ - "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + "multi-kind-proc-macro-dep 0.1.0 (path+file://{TMP_DIR}/multi_kind_proc_macro_dep)" ], "workspace_default_members": [ - "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + "multi-kind-proc-macro-dep 0.1.0 (path+file://{TMP_DIR}/multi_kind_proc_macro_dep)" ], "resolve": { "nodes": [ { - "id": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)", + "id": "multi-kind-proc-macro-dep 0.1.0 (path+file://{TMP_DIR}/multi_kind_proc_macro_dep)", "dependencies": [ "paste 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" ], @@ -288,10 +288,10 @@ "features": [] } ], - "root": "multi-kind-proc-macro-dep 0.1.0 (path+file:///home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep)" + "root": "multi-kind-proc-macro-dep 0.1.0 (path+file://{TMP_DIR}/multi_kind_proc_macro_dep)" }, - "target_directory": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep/target", + "target_directory": "{TMP_DIR}/multi_kind_proc_macro_dep/target", "version": 1, - "workspace_root": "/home/ulan/rules_rust/crate_universe/test_data/metadata/multi_kind_proc_macro_dep", + "workspace_root": "{TMP_DIR}/multi_kind_proc_macro_dep", "metadata": null -} +} \ No newline at end of file From 920acb7e0499251d509695346dbe838c15137a2e Mon Sep 17 00:00:00 2001 From: Ulan Degenbaev Date: Wed, 25 Oct 2023 08:09:04 +0000 Subject: [PATCH 4/4] Add an assertion about build script deps --- crate_universe/src/metadata/dependency.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crate_universe/src/metadata/dependency.rs b/crate_universe/src/metadata/dependency.rs index 9e68d578b0..77b197e3cc 100644 --- a/crate_universe/src/metadata/dependency.rs +++ b/crate_universe/src/metadata/dependency.rs @@ -611,14 +611,21 @@ mod test { let node = find_metadata_node("multi-kind-proc-macro-dep", &metadata); let dependencies = DependencySet::new_for_node(node, &metadata); - let result: Vec<_> = dependencies + let lib_deps: Vec<_> = dependencies .proc_macro_deps .get_iter(None) .unwrap() .map(|dep| dep.target_name.clone()) .collect(); + assert_eq!(lib_deps, vec!["paste"]); - assert_eq!(result, vec!["paste"]); + let build_deps: Vec<_> = dependencies + .build_proc_macro_deps + .get_iter(None) + .unwrap() + .map(|dep| dep.target_name.clone()) + .collect(); + assert_eq!(build_deps, vec!["paste"]); } #[test]