Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'xtask/src/codegen.rs')
-rw-r--r--xtask/src/codegen.rs53
1 files changed, 17 insertions, 36 deletions
diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs
index b23d700263..acaa65129d 100644
--- a/xtask/src/codegen.rs
+++ b/xtask/src/codegen.rs
@@ -5,12 +5,17 @@ use std::{
use xshell::{cmd, Shell};
-use crate::{flags, project_root};
+use crate::{
+ flags::{self, CodegenType},
+ project_root,
+};
pub(crate) mod assists_doc_tests;
pub(crate) mod diagnostics_docs;
+pub(crate) mod feature_docs;
mod grammar;
mod lints;
+mod parser_inline_tests;
impl flags::Codegen {
pub(crate) fn run(self, _sh: &Shell) -> anyhow::Result<()> {
@@ -18,6 +23,8 @@ impl flags::Codegen {
flags::CodegenType::All => {
diagnostics_docs::generate(self.check);
assists_doc_tests::generate(self.check);
+ parser_inline_tests::generate(self.check);
+ // diagnostics_docs::generate(self.check) doesn't generate any tests
// lints::generate(self.check) Updating clones the rust repo, so don't run it unless
// explicitly asked for
}
@@ -25,41 +32,13 @@ impl flags::Codegen {
flags::CodegenType::AssistsDocTests => assists_doc_tests::generate(self.check),
flags::CodegenType::DiagnosticsDocs => diagnostics_docs::generate(self.check),
flags::CodegenType::LintDefinitions => lints::generate(self.check),
+ flags::CodegenType::ParserTests => parser_inline_tests::generate(self.check),
+ flags::CodegenType::FeatureDocs => feature_docs::generate(self.check),
}
Ok(())
}
}
-fn list_rust_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = list_files(dir);
- res.retain(|it| {
- it.file_name().unwrap_or_default().to_str().unwrap_or_default().ends_with(".rs")
- });
- res
-}
-
-fn list_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = Vec::new();
- let mut work = vec![dir.to_path_buf()];
- while let Some(dir) = work.pop() {
- for entry in dir.read_dir().unwrap() {
- let entry = entry.unwrap();
- let file_type = entry.file_type().unwrap();
- let path = entry.path();
- let is_hidden =
- path.file_name().unwrap_or_default().to_str().unwrap_or_default().starts_with('.');
- if !is_hidden {
- if file_type.is_dir() {
- work.push(path);
- } else if file_type.is_file() {
- res.push(path);
- }
- }
- }
- }
- res
-}
-
#[derive(Clone)]
pub(crate) struct CommentBlock {
pub(crate) id: String,
@@ -174,8 +153,8 @@ fn reformat(text: String) -> String {
stdout
}
-fn add_preamble(generator: &'static str, mut text: String) -> String {
- let preamble = format!("//! Generated by `{generator}`, do not edit by hand.\n\n");
+fn add_preamble(cg: CodegenType, mut text: String) -> String {
+ let preamble = format!("//! Generated by `cargo codegen {cg}`, do not edit by hand.\n\n");
text.insert_str(0, &preamble);
text
}
@@ -183,7 +162,7 @@ fn add_preamble(generator: &'static str, mut text: String) -> String {
/// Checks that the `file` has the specified `contents`. If that is not the
/// case, updates the file and then fails the test.
#[allow(clippy::print_stderr)]
-fn ensure_file_contents(file: &Path, contents: &str, check: bool) {
+fn ensure_file_contents(cg: CodegenType, file: &Path, contents: &str, check: bool) {
if let Ok(old_contents) = fs::read_to_string(file) {
if normalize_newlines(&old_contents) == normalize_newlines(contents) {
// File is already up to date.
@@ -197,9 +176,11 @@ fn ensure_file_contents(file: &Path, contents: &str, check: bool) {
"{} was not up-to-date{}",
file.display(),
if std::env::var("CI").is_ok() {
- "\n NOTE: run `cargo codegen` locally and commit the updated files\n"
+ format!(
+ "\n NOTE: run `cargo codegen {cg}` locally and commit the updated files\n"
+ )
} else {
- ""
+ "".to_owned()
}
);
} else {