From 1a43a0f63e0008787225abb6fb2baef97b6a39e0 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 9 Aug 2020 20:33:47 +0700 Subject: Added competition for unstable features Added xtask for download unstable book from rust repository and codegene for it. Also small changes from lint --- .../src/codegen/gen_unstable_future_descriptor.rs | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 xtask/src/codegen/gen_unstable_future_descriptor.rs (limited to 'xtask/src/codegen') diff --git a/xtask/src/codegen/gen_unstable_future_descriptor.rs b/xtask/src/codegen/gen_unstable_future_descriptor.rs new file mode 100644 index 000000000..09c4f61f2 --- /dev/null +++ b/xtask/src/codegen/gen_unstable_future_descriptor.rs @@ -0,0 +1,55 @@ +//! Generates descriptors structure for unstable feature from Unstable Book + +use crate::{ + codegen::{self, project_root, Mode, Result}, +}; +use std::process::Command; +use std::fs; +use std::path::{Path, PathBuf}; +use walkdir::{DirEntry, WalkDir}; +use quote::{format_ident, quote}; +use crate::codegen::update; + +pub fn generate_unstable_future_descriptor(mode: Mode) -> Result<()> { + let path = project_root().join(codegen::STORAGE); + fs::create_dir_all(path.clone())?; + + Command::new("git").current_dir(path.clone()).arg("init").output()?; + Command::new("git").current_dir(path.clone()).args(&["remote", "add", "-f", "origin", codegen::REPOSITORY_URL]).output()?; + Command::new("git").current_dir(path.clone()).args(&["sparse-checkout", "set", "/src/doc/unstable-book/src/"]).output()?; + Command::new("git").current_dir(path.clone()).args(&["pull", "origin", "master"]).output()?; + //TODO: check git, and do pull + + let src_dir = path.join("src/doc/unstable-book/src"); + let files = WalkDir::new(src_dir.join("language-features")) + .into_iter() + .chain(WalkDir::new(src_dir.join("library-features"))) + .filter_map(|e| e.ok()) + .filter(|entry| { + // Get all `.md ` files + entry.file_type().is_file() && entry.path().extension().map(|ext| ext == "md").unwrap_or(false) + }) + .collect::>(); + + let definitions = files.iter().map(|entry| { + let path = entry.path(); + let feature_ident = format!("{}", path.file_stem().unwrap().to_str().unwrap().replace("-", "_")); + let doc = format!("{}", std::fs::read_to_string(path).unwrap() ); + + quote!{ LintCompletion { label: #feature_ident, description: #doc } } + }).collect::>(); + + let ts = quote! { + use crate::completion::LintCompletion; + + const UNSTABLE_FEATURE_DESCRIPTOR: &[LintCompletion] = &[ + #(#definitions),* + ]; + }; + + let destination = project_root().join(codegen::UNSTABLE_FEATURE); + let contents = crate::reformat(ts.to_string())?; + update(destination.as_path(), &contents, mode)?; + + Ok(()) +} \ No newline at end of file -- cgit v1.2.3