Skip to content

Commit 73b9848

Browse files
committed
add setup step for generating rust-project.json
Signed-off-by: onur-ozkan <[email protected]>
1 parent e46ac21 commit 73b9848

File tree

4 files changed

+76
-17
lines changed

4 files changed

+76
-17
lines changed

src/bootstrap/src/core/build_steps/setup.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::core::builder::{Builder, RunConfig, ShouldRun, Step};
22
use crate::t;
33
use crate::utils::change_tracker::CONFIG_CHANGE_HISTORY;
44
use crate::utils::helpers::hex_encode;
5+
use crate::utils::ra_project::RustAnalyzerProject;
56
use crate::Config;
67
use sha2::Digest;
78
use std::env::consts::EXE_SUFFIX;
@@ -624,3 +625,54 @@ fn create_vscode_settings_maybe(config: &Config) -> io::Result<bool> {
624625
}
625626
Ok(should_create)
626627
}
628+
629+
/// Sets up `rust-project.json`
630+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
631+
pub struct RustProjectJson;
632+
633+
impl Step for RustProjectJson {
634+
type Output = ();
635+
const DEFAULT: bool = true;
636+
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
637+
run.alias("rust-project")
638+
}
639+
fn make_run(run: RunConfig<'_>) {
640+
if run.builder.config.dry_run() {
641+
return;
642+
}
643+
644+
if let [cmd] = &run.paths[..] {
645+
if cmd.assert_single_path().path.as_path().as_os_str() == "rust-project" {
646+
run.builder.ensure(RustProjectJson);
647+
}
648+
}
649+
}
650+
fn run(self, builder: &Builder<'_>) -> Self::Output {
651+
let config = &builder.config;
652+
if config.dry_run() {
653+
return;
654+
}
655+
656+
while !t!(create_ra_project_json_maybe(&config)) {}
657+
}
658+
}
659+
660+
fn create_ra_project_json_maybe(config: &Config) -> io::Result<bool> {
661+
println!("\nx.py can automatically generate `rust-project.json` file for rust-analyzer");
662+
663+
let should_create = match prompt_user("Would you like to create rust-project.json?: [y/N]")? {
664+
Some(PromptResult::Yes) => true,
665+
_ => {
666+
println!("Ok, skipping rust-project.json!");
667+
return Ok(true);
668+
}
669+
};
670+
671+
if should_create {
672+
let ra_project = RustAnalyzerProject::collect_ra_project_data(&config);
673+
ra_project.generate_file(&config.src.join("rust-project.json"))?;
674+
println!("Created `rust-project.json`");
675+
}
676+
677+
Ok(should_create)
678+
}

src/bootstrap/src/core/builder.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,13 @@ impl<'a> Builder<'a> {
880880
run::GenerateWindowsSys,
881881
run::GenerateCompletions,
882882
),
883-
Kind::Setup => describe!(setup::Profile, setup::Hook, setup::Link, setup::Vscode),
883+
Kind::Setup => describe!(
884+
setup::Profile,
885+
setup::Hook,
886+
setup::Link,
887+
setup::Vscode,
888+
setup::RustProjectJson
889+
),
884890
Kind::Clean => describe!(clean::CleanAll, clean::Rustc, clean::Std),
885891
// special-cased in Build::build()
886892
Kind::Format | Kind::Suggest => vec![],

src/bootstrap/src/core/metadata.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde_derive::Deserialize;
55

66
use crate::utils::cache::INTERNER;
77
use crate::utils::helpers::output;
8-
use crate::{t, Build, Crate};
8+
use crate::{t, Build, Config, Crate};
99

1010
/// For more information, see the output of
1111
/// <https://doc.rust-lang.org/nightly/cargo/commands/cargo-metadata.html>
@@ -45,7 +45,7 @@ pub(crate) struct Target {
4545
/// Collects and stores package metadata of each workspace members into `build`,
4646
/// by executing `cargo metadata` commands.
4747
pub fn build(build: &mut Build) {
48-
for package in workspace_members(build) {
48+
for package in workspace_members(&build.config) {
4949
if package.source.is_none() {
5050
let name = INTERNER.intern_string(package.name);
5151
let mut path = PathBuf::from(package.manifest_path);
@@ -74,9 +74,9 @@ pub fn build(build: &mut Build) {
7474
///
7575
/// Note that `src/tools/cargo` is no longer a workspace member but we still
7676
/// treat it as one here, by invoking an additional `cargo metadata` command.
77-
pub(crate) fn workspace_members(build: &Build) -> impl Iterator<Item = Package> {
77+
pub(crate) fn workspace_members(config: &Config) -> impl Iterator<Item = Package> {
7878
let collect_metadata = |manifest_path| {
79-
let mut cargo = Command::new(&build.initial_cargo);
79+
let mut cargo = Command::new(&config.initial_cargo);
8080
cargo
8181
// Will read the libstd Cargo.toml
8282
// which uses the unstable `public-dependency` feature.
@@ -86,7 +86,7 @@ pub(crate) fn workspace_members(build: &Build) -> impl Iterator<Item = Package>
8686
.arg("1")
8787
.arg("--no-deps")
8888
.arg("--manifest-path")
89-
.arg(build.src.join(manifest_path));
89+
.arg(config.src.join(manifest_path));
9090
let metadata_output = output(&mut cargo);
9191
let Output { packages, .. } = t!(serde_json::from_str(&metadata_output));
9292
packages
@@ -105,9 +105,9 @@ pub(crate) fn workspace_members(build: &Build) -> impl Iterator<Item = Package>
105105
}
106106

107107
/// Invokes `cargo metadata` to get package metadata of whole workspace including the dependencies.
108-
pub(crate) fn project_metadata(build: &Build) -> impl Iterator<Item = Package> {
108+
pub(crate) fn project_metadata(config: &Config) -> impl Iterator<Item = Package> {
109109
let collect_metadata = |manifest_path| {
110-
let mut cargo = Command::new(&build.initial_cargo);
110+
let mut cargo = Command::new(&config.initial_cargo);
111111
cargo
112112
// Will read the libstd Cargo.toml
113113
// which uses the unstable `public-dependency` feature.
@@ -116,7 +116,7 @@ pub(crate) fn project_metadata(build: &Build) -> impl Iterator<Item = Package> {
116116
.arg("--format-version")
117117
.arg("1")
118118
.arg("--manifest-path")
119-
.arg(build.src.join(manifest_path));
119+
.arg(config.src.join(manifest_path));
120120
let metadata_output = output(&mut cargo);
121121
let Output { packages, .. } = t!(serde_json::from_str(&metadata_output));
122122
packages

src/bootstrap/src/utils/ra_project.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ use std::io;
1515
use std::path::Path;
1616

1717
use crate::core::metadata::{project_metadata, workspace_members, Dependency};
18-
use crate::Build;
18+
use crate::Config;
1919

2020
#[derive(Debug, Deserialize, Serialize)]
2121
/// FIXME(before-merge): doc-comment
22-
struct RustAnalyzerProject {
22+
pub(crate) struct RustAnalyzerProject {
2323
crates: Vec<Crate>,
2424
sysroot: String,
2525
sysroot_src: String,
@@ -33,6 +33,7 @@ struct Crate {
3333
edition: String,
3434
env: BTreeMap<String, String>,
3535
is_proc_macro: bool,
36+
#[serde(skip_serializing_if = "Option::is_none")]
3637
proc_macro_dylib_path: Option<String>,
3738
is_workspace_member: bool,
3839
root_module: String,
@@ -47,15 +48,15 @@ struct Dep {
4748

4849
impl RustAnalyzerProject {
4950
#[allow(dead_code)] // FIXME(before-merge): remove this
50-
pub(crate) fn collect_ra_project_data(build: &mut Build) -> Self {
51+
pub(crate) fn collect_ra_project_data(config: &Config) -> Self {
5152
let mut ra_project = RustAnalyzerProject {
5253
crates: vec![],
53-
sysroot: format!("{}", build.out.join("host").join("stage0").display()),
54-
sysroot_src: format!("{}", build.src.join("library").display()),
54+
sysroot: format!("{}", config.out.join("host").join("stage0").display()),
55+
sysroot_src: format!("{}", config.src.join("library").display()),
5556
};
5657

57-
let packages: Vec<_> = project_metadata(build).collect();
58-
let workspace_members: Vec<_> = workspace_members(build).collect();
58+
let packages: Vec<_> = project_metadata(config).collect();
59+
let workspace_members: Vec<_> = workspace_members(config).collect();
5960

6061
for package in &packages {
6162
let is_not_indirect_dependency = packages
@@ -94,7 +95,7 @@ impl RustAnalyzerProject {
9495

9596
if target
9697
.src_path
97-
.starts_with(&build.src.join("library").to_string_lossy().to_string())
98+
.starts_with(&config.src.join("library").to_string_lossy().to_string())
9899
{
99100
krate.cfg.push("bootstrap".into());
100101
}

0 commit comments

Comments
 (0)