From 0f6f458cc1b460076093efda903bf1a1b9062697 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 16:35:27 +0300 Subject: Make working with codegen less annoying We probably should look into removing `xtask codegen` altogether. The test workflow works perfectly for package.json config. There are two things preventing that: * Lint completions are generated on demand. * Docs are not committed to the repository. --- xtask/src/codegen.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'xtask/src/codegen.rs') diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index 2f56c5ad0..e3f9ccada 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -32,7 +32,7 @@ pub(crate) use self::{ #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub(crate) enum Mode { Overwrite, - Verify, + Ensure, } impl flags::Codegen { @@ -59,12 +59,19 @@ fn update(path: &Path, contents: &str, mode: Mode) -> Result<()> { } _ => (), } - if mode == Mode::Verify { - anyhow::bail!("`{}` is not up-to-date", path.display()); - } + let return_error = match mode { + Mode::Overwrite => false, + Mode::Ensure => true, + }; eprintln!("updating {}", path.display()); write_file(path, contents)?; - return Ok(()); + + return if return_error { + let path = path.strip_prefix(&project_root()).unwrap_or(path); + anyhow::bail!("`{}` was not up-to-date, updating", path.display()); + } else { + Ok(()) + }; fn normalize(s: &str) -> String { s.replace("\r\n", "\n") -- cgit v1.2.3 From 1eb61203b725684fd2c7e25ac7e2d53eef10c64c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 21:13:15 +0300 Subject: Make `code generation` just work Contributors don't need to learn about `cargo xtask codegen` if `cargo test` just does the right thing. --- xtask/src/codegen.rs | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) (limited to 'xtask/src/codegen.rs') diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index e3f9ccada..7cdd8f251 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -7,9 +7,9 @@ mod gen_syntax; mod gen_parser_tests; +mod gen_lint_completions; mod gen_assists_docs; mod gen_feature_docs; -mod gen_lint_completions; mod gen_diagnostic_docs; use std::{ @@ -18,38 +18,35 @@ use std::{ }; use xshell::{cmd, pushenv, read_file, write_file}; -use crate::{ensure_rustfmt, flags, project_root, Result}; +use crate::{ensure_rustfmt, project_root, Result}; pub(crate) use self::{ - gen_assists_docs::{generate_assists_docs, generate_assists_tests}, - gen_diagnostic_docs::generate_diagnostic_docs, - gen_feature_docs::generate_feature_docs, - gen_lint_completions::generate_lint_completions, - gen_parser_tests::generate_parser_tests, - gen_syntax::generate_syntax, + gen_assists_docs::generate_assists_tests, gen_lint_completions::generate_lint_completions, + gen_parser_tests::generate_parser_tests, gen_syntax::generate_syntax, }; +pub(crate) fn docs() -> Result<()> { + // We don't commit docs to the repo, so we can just overwrite them. + gen_assists_docs::generate_assists_docs(Mode::Overwrite)?; + gen_feature_docs::generate_feature_docs(Mode::Overwrite)?; + gen_diagnostic_docs::generate_diagnostic_docs(Mode::Overwrite)?; + Ok(()) +} + +#[allow(unused)] +fn used() { + generate_parser_tests(Mode::Overwrite); + generate_assists_tests(Mode::Overwrite); + generate_syntax(Mode::Overwrite); + generate_lint_completions(Mode::Overwrite); +} + #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub(crate) enum Mode { Overwrite, Ensure, } -impl flags::Codegen { - pub(crate) fn run(self) -> Result<()> { - if self.features { - generate_lint_completions(Mode::Overwrite)?; - } - generate_syntax(Mode::Overwrite)?; - generate_parser_tests(Mode::Overwrite)?; - generate_assists_tests(Mode::Overwrite)?; - generate_assists_docs(Mode::Overwrite)?; - generate_feature_docs(Mode::Overwrite)?; - generate_diagnostic_docs(Mode::Overwrite)?; - Ok(()) - } -} - /// A helper to update file on disk if it has changed. /// With verify = false, fn update(path: &Path, contents: &str, mode: Mode) -> Result<()> { -- cgit v1.2.3 From 095b9110b5e4e166c86501a1f0603cf626a48127 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 21:25:44 +0300 Subject: Unused params --- xtask/src/codegen.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'xtask/src/codegen.rs') diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index 7cdd8f251..2248a079f 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -27,9 +27,9 @@ pub(crate) use self::{ pub(crate) fn docs() -> Result<()> { // We don't commit docs to the repo, so we can just overwrite them. - gen_assists_docs::generate_assists_docs(Mode::Overwrite)?; - gen_feature_docs::generate_feature_docs(Mode::Overwrite)?; - gen_diagnostic_docs::generate_diagnostic_docs(Mode::Overwrite)?; + gen_assists_docs::generate_assists_docs()?; + gen_feature_docs::generate_feature_docs()?; + gen_diagnostic_docs::generate_diagnostic_docs()?; Ok(()) } -- cgit v1.2.3 From e89c0e39613e381da45b6a774c6666dcc3e632a2 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 21:39:09 +0300 Subject: Remove now dead code --- xtask/src/codegen.rs | 60 +++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 33 deletions(-) (limited to 'xtask/src/codegen.rs') diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index 2248a079f..e43d4fa73 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -16,7 +16,7 @@ use std::{ fmt, mem, path::{Path, PathBuf}, }; -use xshell::{cmd, pushenv, read_file, write_file}; +use xshell::{cmd, pushenv}; use crate::{ensure_rustfmt, project_root, Result}; @@ -35,44 +35,38 @@ pub(crate) fn docs() -> Result<()> { #[allow(unused)] fn used() { - generate_parser_tests(Mode::Overwrite); - generate_assists_tests(Mode::Overwrite); - generate_syntax(Mode::Overwrite); - generate_lint_completions(Mode::Overwrite); + generate_parser_tests(); + generate_assists_tests(); + generate_syntax(); + generate_lint_completions(); } -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub(crate) enum Mode { - Overwrite, - Ensure, -} - -/// A helper to update file on disk if it has changed. -/// With verify = false, -fn update(path: &Path, contents: &str, mode: Mode) -> Result<()> { - match read_file(path) { - Ok(old_contents) if normalize(&old_contents) == normalize(contents) => { - return Ok(()); +/// Checks that the `file` has the specified `contents`. If that is not the +/// case, updates the file and then fails the test. +pub(crate) fn ensure_file_contents(file: &Path, contents: &str) -> Result<()> { + match std::fs::read_to_string(file) { + Ok(old_contents) if normalize_newlines(&old_contents) == normalize_newlines(contents) => { + return Ok(()) } _ => (), } - let return_error = match mode { - Mode::Overwrite => false, - Mode::Ensure => true, - }; - eprintln!("updating {}", path.display()); - write_file(path, contents)?; - - return if return_error { - let path = path.strip_prefix(&project_root()).unwrap_or(path); - anyhow::bail!("`{}` was not up-to-date, updating", path.display()); - } else { - Ok(()) - }; - - fn normalize(s: &str) -> String { - s.replace("\r\n", "\n") + let display_path = file.strip_prefix(&project_root()).unwrap_or(file); + eprintln!( + "\n\x1b[31;1merror\x1b[0m: {} was not up-to-date, updating\n", + display_path.display() + ); + if std::env::var("CI").is_ok() { + eprintln!("\n NOTE: run `cargo test` locally and commit the updated files\n"); + } + if let Some(parent) = file.parent() { + let _ = std::fs::create_dir_all(parent); } + std::fs::write(file, contents).unwrap(); + anyhow::bail!("some file were not up to date") +} + +fn normalize_newlines(s: &str) -> String { + s.replace("\r\n", "\n") } const PREAMBLE: &str = "Generated file, do not edit by hand, see `xtask/src/codegen`"; -- cgit v1.2.3 From c0943f84fdb67025662dbcfc011e415870ee80a6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 21:41:45 +0300 Subject: Cleanup the error message --- xtask/src/codegen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'xtask/src/codegen.rs') diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs index e43d4fa73..2cf3c6fdc 100644 --- a/xtask/src/codegen.rs +++ b/xtask/src/codegen.rs @@ -56,7 +56,7 @@ pub(crate) fn ensure_file_contents(file: &Path, contents: &str) -> Result<()> { display_path.display() ); if std::env::var("CI").is_ok() { - eprintln!("\n NOTE: run `cargo test` locally and commit the updated files\n"); + eprintln!(" NOTE: run `cargo test` locally and commit the updated files\n"); } if let Some(parent) = file.parent() { let _ = std::fs::create_dir_all(parent); -- cgit v1.2.3