Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/rust-analyzer/src/cli/flags.rs1
-rw-r--r--xtask/src/dist.rs21
-rw-r--r--xtask/src/flags.rs143
-rw-r--r--xtask/src/install.rs16
4 files changed, 110 insertions, 71 deletions
diff --git a/crates/rust-analyzer/src/cli/flags.rs b/crates/rust-analyzer/src/cli/flags.rs
index 3f68c5d053..b3b8ab9a40 100644
--- a/crates/rust-analyzer/src/cli/flags.rs
+++ b/crates/rust-analyzer/src/cli/flags.rs
@@ -235,6 +235,7 @@ pub struct RunTests {
#[derive(Debug)]
pub struct RustcTests {
pub rustc_repo: PathBuf,
+
pub filter: Option<String>,
}
diff --git a/xtask/src/dist.rs b/xtask/src/dist.rs
index 7e54d19fe4..2fe9db98cf 100644
--- a/xtask/src/dist.rs
+++ b/xtask/src/dist.rs
@@ -10,7 +10,11 @@ use time::OffsetDateTime;
use xshell::{cmd, Shell};
use zip::{write::FileOptions, DateTime, ZipWriter};
-use crate::{date_iso, flags, project_root};
+use crate::{
+ date_iso,
+ flags::{self, Malloc},
+ project_root,
+};
const VERSION_STABLE: &str = "0.3";
const VERSION_NIGHTLY: &str = "0.4";
@@ -22,6 +26,7 @@ impl flags::Dist {
let project_root = project_root();
let target = Target::get(&project_root);
+ let allocator = self.allocator();
let dist = project_root.join("dist");
sh.remove_path(&dist)?;
sh.create_dir(&dist)?;
@@ -33,11 +38,11 @@ impl flags::Dist {
// A hack to make VS Code prefer nightly over stable.
format!("{VERSION_NIGHTLY}.{patch_version}")
};
- dist_server(sh, &format!("{version}-standalone"), &target)?;
+ dist_server(sh, &format!("{version}-standalone"), &target, allocator)?;
let release_tag = if stable { date_iso(sh)? } else { "nightly".to_owned() };
dist_client(sh, &version, &release_tag, &target)?;
} else {
- dist_server(sh, "0.0.0-standalone", &target)?;
+ dist_server(sh, "0.0.0-standalone", &target, allocator)?;
}
Ok(())
}
@@ -73,7 +78,12 @@ fn dist_client(
Ok(())
}
-fn dist_server(sh: &Shell, release: &str, target: &Target) -> anyhow::Result<()> {
+fn dist_server(
+ sh: &Shell,
+ release: &str,
+ target: &Target,
+ allocator: Malloc,
+) -> anyhow::Result<()> {
let _e = sh.push_env("CFG_RELEASE", release);
let _e = sh.push_env("CARGO_PROFILE_RELEASE_LTO", "thin");
@@ -87,7 +97,8 @@ fn dist_server(sh: &Shell, release: &str, target: &Target) -> anyhow::Result<()>
}
let target_name = &target.name;
- cmd!(sh, "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --target {target_name} --release").run()?;
+ let features = allocator.to_features();
+ cmd!(sh, "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --target {target_name} {features...} --release").run()?;
let dst = Path::new("dist").join(&target.artifact_name);
gzip(&target.server_path, &dst.with_extension("gz"))?;
diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs
index f7ae0eb1b4..9066545920 100644
--- a/xtask/src/flags.rs
+++ b/xtask/src/flags.rs
@@ -2,7 +2,7 @@
use std::str::FromStr;
-use crate::install::{ClientOpt, Malloc, ServerOpt};
+use crate::install::{ClientOpt, ServerOpt};
xflags::xflags! {
src "./src/flags.rs"
@@ -36,6 +36,10 @@ xflags::xflags! {
optional --dry-run
}
cmd dist {
+ /// Use mimalloc allocator for server
+ optional --mimalloc
+ /// Use jemalloc allocator for server
+ optional --jemalloc
optional --client-patch-version version: String
}
/// Read a changelog AsciiDoc file and update the GitHub Releases entry in Markdown.
@@ -82,35 +86,6 @@ pub enum XtaskCmd {
}
#[derive(Debug)]
-pub struct Codegen {
- pub check: bool,
- pub codegen_type: Option<CodegenType>,
-}
-
-#[derive(Debug, Default)]
-pub enum CodegenType {
- #[default]
- All,
- Grammar,
- AssistsDocTests,
- DiagnosticsDocs,
- LintDefinitions,
-}
-
-impl FromStr for CodegenType {
- type Err = String;
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- match s {
- "all" => Ok(Self::All),
- "grammar" => Ok(Self::Grammar),
- "assists-doc-tests" => Ok(Self::AssistsDocTests),
- "diagnostics-docs" => Ok(Self::DiagnosticsDocs),
- "lints-definitions" => Ok(Self::LintDefinitions),
- _ => Err("Invalid option".to_owned()),
- }
- }
-}
-#[derive(Debug)]
pub struct Install {
pub client: bool,
pub code_bin: Option<String>,
@@ -135,6 +110,8 @@ pub struct Promote {
#[derive(Debug)]
pub struct Dist {
+ pub mimalloc: bool,
+ pub jemalloc: bool,
pub client_patch_version: Option<String>,
}
@@ -146,6 +123,65 @@ pub struct PublishReleaseNotes {
}
#[derive(Debug)]
+pub struct Metrics {
+ pub measurement_type: Option<MeasurementType>,
+}
+
+#[derive(Debug)]
+pub struct Bb {
+ pub suffix: String,
+}
+
+#[derive(Debug)]
+pub struct Codegen {
+ pub codegen_type: Option<CodegenType>,
+
+ pub check: bool,
+}
+
+impl Xtask {
+ #[allow(dead_code)]
+ pub fn from_env_or_exit() -> Self {
+ Self::from_env_or_exit_()
+ }
+
+ #[allow(dead_code)]
+ pub fn from_env() -> xflags::Result<Self> {
+ Self::from_env_()
+ }
+
+ #[allow(dead_code)]
+ pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> {
+ Self::from_vec_(args)
+ }
+}
+// generated end
+
+#[derive(Debug, Default)]
+pub enum CodegenType {
+ #[default]
+ All,
+ Grammar,
+ AssistsDocTests,
+ DiagnosticsDocs,
+ LintDefinitions,
+}
+
+impl FromStr for CodegenType {
+ type Err = String;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ match s {
+ "all" => Ok(Self::All),
+ "grammar" => Ok(Self::Grammar),
+ "assists-doc-tests" => Ok(Self::AssistsDocTests),
+ "diagnostics-docs" => Ok(Self::DiagnosticsDocs),
+ "lints-definitions" => Ok(Self::LintDefinitions),
+ _ => Err("Invalid option".to_owned()),
+ }
+ }
+}
+
+#[derive(Debug)]
pub enum MeasurementType {
Build,
RustcTests,
@@ -185,33 +221,22 @@ impl AsRef<str> for MeasurementType {
}
}
-#[derive(Debug)]
-pub struct Metrics {
- pub measurement_type: Option<MeasurementType>,
-}
-
-#[derive(Debug)]
-pub struct Bb {
- pub suffix: String,
+#[derive(Clone, Copy, Debug)]
+pub(crate) enum Malloc {
+ System,
+ Mimalloc,
+ Jemalloc,
}
-impl Xtask {
- #[allow(dead_code)]
- pub fn from_env_or_exit() -> Self {
- Self::from_env_or_exit_()
- }
-
- #[allow(dead_code)]
- pub fn from_env() -> xflags::Result<Self> {
- Self::from_env_()
- }
-
- #[allow(dead_code)]
- pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> {
- Self::from_vec_(args)
+impl Malloc {
+ pub(crate) fn to_features(self) -> &'static [&'static str] {
+ match self {
+ Malloc::System => &[][..],
+ Malloc::Mimalloc => &["--features", "mimalloc"],
+ Malloc::Jemalloc => &["--features", "jemalloc"],
+ }
}
}
-// generated end
impl Install {
pub(crate) fn server(&self) -> Option<ServerOpt> {
@@ -234,3 +259,15 @@ impl Install {
Some(ClientOpt { code_bin: self.code_bin.clone() })
}
}
+
+impl Dist {
+ pub(crate) fn allocator(&self) -> Malloc {
+ if self.mimalloc {
+ Malloc::Mimalloc
+ } else if self.jemalloc {
+ Malloc::Jemalloc
+ } else {
+ Malloc::System
+ }
+ }
+}
diff --git a/xtask/src/install.rs b/xtask/src/install.rs
index dc932da80c..72e612f9e1 100644
--- a/xtask/src/install.rs
+++ b/xtask/src/install.rs
@@ -5,7 +5,7 @@ use std::{env, path::PathBuf, str};
use anyhow::{bail, format_err, Context};
use xshell::{cmd, Shell};
-use crate::flags;
+use crate::flags::{self, Malloc};
impl flags::Install {
pub(crate) fn run(self, sh: &Shell) -> anyhow::Result<()> {
@@ -34,12 +34,6 @@ pub(crate) struct ServerOpt {
pub(crate) dev_rel: bool,
}
-pub(crate) enum Malloc {
- System,
- Mimalloc,
- Jemalloc,
-}
-
fn fix_path_for_mac(sh: &Shell) -> anyhow::Result<()> {
let mut vscode_path: Vec<PathBuf> = {
const COMMON_APP_PATH: &str =
@@ -122,7 +116,7 @@ fn install_client(sh: &Shell, client_opt: ClientOpt) -> anyhow::Result<()> {
if !installed_extensions.contains("rust-analyzer") {
bail!(
"Could not install the Visual Studio Code extension. \
- Please make sure you have at least NodeJS 12.x together with the latest version of VS Code installed and try again. \
+ Please make sure you have at least NodeJS 16.x together with the latest version of VS Code installed and try again. \
Note that installing via xtask install does not work for VS Code Remote, instead you’ll need to install the .vsix manually."
);
}
@@ -131,11 +125,7 @@ fn install_client(sh: &Shell, client_opt: ClientOpt) -> anyhow::Result<()> {
}
fn install_server(sh: &Shell, opts: ServerOpt) -> anyhow::Result<()> {
- let features = match opts.malloc {
- Malloc::System => &[][..],
- Malloc::Mimalloc => &["--features", "mimalloc"],
- Malloc::Jemalloc => &["--features", "jemalloc"],
- };
+ let features = opts.malloc.to_features();
let profile = if opts.dev_rel { "dev-rel" } else { "release" };
let cmd = cmd!(sh, "cargo install --path crates/rust-analyzer --profile={profile} --locked --force --features force-always-assert {features...}");