From e1829d8959d9f48302fec42d64216c158db13744 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 30 May 2020 23:57:16 +0200 Subject: minor --- xtask/src/codegen/gen_assists_docs.rs | 144 +++++++++++++++++----------------- 1 file changed, 73 insertions(+), 71 deletions(-) (limited to 'xtask/src/codegen/gen_assists_docs.rs') diff --git a/xtask/src/codegen/gen_assists_docs.rs b/xtask/src/codegen/gen_assists_docs.rs index 4bd6b5f0c..20dcde820 100644 --- a/xtask/src/codegen/gen_assists_docs.rs +++ b/xtask/src/codegen/gen_assists_docs.rs @@ -8,7 +8,7 @@ use crate::{ }; pub fn generate_assists_docs(mode: Mode) -> Result<()> { - let assists = collect_assists()?; + let assists = Assist::collect()?; generate_tests(&assists, mode)?; generate_docs(&assists, mode)?; Ok(()) @@ -22,81 +22,61 @@ struct Assist { after: String, } -fn hide_hash_comments(text: &str) -> String { - text.split('\n') // want final newline - .filter(|&it| !(it.starts_with("# ") || it == "#")) - .map(|it| format!("{}\n", it)) - .collect() -} - -fn reveal_hash_comments(text: &str) -> String { - text.split('\n') // want final newline - .map(|it| { - if it.starts_with("# ") { - &it[2..] - } else if it == "#" { - "" - } else { - it - } - }) - .map(|it| format!("{}\n", it)) - .collect() -} - -fn collect_assists() -> Result> { - let mut res = Vec::new(); - for path in rust_files(&project_root().join(codegen::ASSISTS_DIR)) { - collect_file(&mut res, path.as_path())?; - } - res.sort_by(|lhs, rhs| lhs.id.cmp(&rhs.id)); - return Ok(res); - - fn collect_file(acc: &mut Vec, path: &Path) -> Result<()> { - let text = fs::read_to_string(path)?; - let comment_blocks = extract_comment_blocks_with_empty_lines(&text); - - for block in comment_blocks { - // FIXME: doesn't support blank lines yet, need to tweak - // `extract_comment_blocks` for that. - let mut lines = block.iter(); - let first_line = lines.next().unwrap(); - if !first_line.starts_with("Assist: ") { - continue; - } - let id = first_line["Assist: ".len()..].to_string(); - assert!( - id.chars().all(|it| it.is_ascii_lowercase() || it == '_'), - "invalid assist id: {:?}", - id - ); - - let doc = take_until(lines.by_ref(), "```").trim().to_string(); - assert!( - doc.chars().next().unwrap().is_ascii_uppercase() && doc.ends_with('.'), - "\n\n{}: assist docs should be proper sentences, with capitalization and a full stop at the end.\n\n{}\n\n", - id, doc, - ); - - let before = take_until(lines.by_ref(), "```"); - - assert_eq!(lines.next().unwrap().as_str(), "->"); - assert_eq!(lines.next().unwrap().as_str(), "```"); - let after = take_until(lines.by_ref(), "```"); - acc.push(Assist { id, doc, before, after }) +impl Assist { + fn collect() -> Result> { + let mut res = Vec::new(); + for path in rust_files(&project_root().join(codegen::ASSISTS_DIR)) { + collect_file(&mut res, path.as_path())?; } + res.sort_by(|lhs, rhs| lhs.id.cmp(&rhs.id)); + return Ok(res); + + fn collect_file(acc: &mut Vec, path: &Path) -> Result<()> { + let text = fs::read_to_string(path)?; + let comment_blocks = extract_comment_blocks_with_empty_lines(&text); + + for block in comment_blocks { + // FIXME: doesn't support blank lines yet, need to tweak + // `extract_comment_blocks` for that. + let mut lines = block.iter(); + let first_line = lines.next().unwrap(); + if !first_line.starts_with("Assist: ") { + continue; + } + let id = first_line["Assist: ".len()..].to_string(); + assert!( + id.chars().all(|it| it.is_ascii_lowercase() || it == '_'), + "invalid assist id: {:?}", + id + ); + + let doc = take_until(lines.by_ref(), "```").trim().to_string(); + assert!( + doc.chars().next().unwrap().is_ascii_uppercase() && doc.ends_with('.'), + "\n\n{}: assist docs should be proper sentences, with capitalization and a full stop at the end.\n\n{}\n\n", + id, doc, + ); + + let before = take_until(lines.by_ref(), "```"); + + assert_eq!(lines.next().unwrap().as_str(), "->"); + assert_eq!(lines.next().unwrap().as_str(), "```"); + let after = take_until(lines.by_ref(), "```"); + acc.push(Assist { id, doc, before, after }) + } - fn take_until<'a>(lines: impl Iterator, marker: &str) -> String { - let mut buf = Vec::new(); - for line in lines { - if line == marker { - break; + fn take_until<'a>(lines: impl Iterator, marker: &str) -> String { + let mut buf = Vec::new(); + for line in lines { + if line == marker { + break; + } + buf.push(line.clone()); } - buf.push(line.clone()); + buf.join("\n") } - buf.join("\n") + Ok(()) } - Ok(()) } } @@ -157,3 +137,25 @@ fn generate_docs(assists: &[Assist], mode: Mode) -> Result<()> { codegen::update(&project_root().join(codegen::ASSISTS_DOCS), &buf, mode) } + +fn hide_hash_comments(text: &str) -> String { + text.split('\n') // want final newline + .filter(|&it| !(it.starts_with("# ") || it == "#")) + .map(|it| format!("{}\n", it)) + .collect() +} + +fn reveal_hash_comments(text: &str) -> String { + text.split('\n') // want final newline + .map(|it| { + if it.starts_with("# ") { + &it[2..] + } else if it == "#" { + "" + } else { + it + } + }) + .map(|it| format!("{}\n", it)) + .collect() +} -- cgit v1.2.3