Added competition for unstable features
Added xtask for download unstable book from rust repository and codegene for it. Also small changes from lint
This commit is contained in:
parent
020a40335b
commit
1a43a0f63e
@ -4,7 +4,7 @@ members = [ "crates/*", "xtask/" ]
|
|||||||
[profile.dev]
|
[profile.dev]
|
||||||
# disabling debug info speeds up builds a bunch,
|
# disabling debug info speeds up builds a bunch,
|
||||||
# and we don't rely on it for debugging that much.
|
# and we don't rely on it for debugging that much.
|
||||||
debug = 0
|
debug = 2
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
incremental = true
|
incremental = true
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! FIXME: write short doc here
|
//! Provides set of implementation for hir's objects that allows get back location in file.
|
||||||
|
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
|
@ -18,13 +18,17 @@
|
|||||||
mod complete_postfix;
|
mod complete_postfix;
|
||||||
mod complete_macro_in_item_position;
|
mod complete_macro_in_item_position;
|
||||||
mod complete_trait_impl;
|
mod complete_trait_impl;
|
||||||
|
mod unstable_feature_descriptor;
|
||||||
use ra_ide_db::RootDatabase;
|
use ra_ide_db::RootDatabase;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
completion::{
|
completion::{
|
||||||
completion_context::CompletionContext,
|
completion_context::CompletionContext,
|
||||||
completion_item::{CompletionKind, Completions},
|
completion_item::{CompletionKind, Completions},
|
||||||
|
|
||||||
|
//TODO: rework
|
||||||
|
unstable_feature_descriptor::UNSTABLE_FEATURE_DESCRIPTOR,
|
||||||
|
complete_attribute::LintCompletion,
|
||||||
},
|
},
|
||||||
FilePosition,
|
FilePosition,
|
||||||
};
|
};
|
||||||
|
@ -9,8 +9,11 @@
|
|||||||
use crate::completion::{
|
use crate::completion::{
|
||||||
completion_context::CompletionContext,
|
completion_context::CompletionContext,
|
||||||
completion_item::{CompletionItem, CompletionItemKind, CompletionKind, Completions},
|
completion_item::{CompletionItem, CompletionItemKind, CompletionKind, Completions},
|
||||||
|
unstable_feature_descriptor
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::completion::UNSTABLE_FEATURE_DESCRIPTOR;
|
||||||
|
|
||||||
pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
|
pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
|
||||||
let attribute = ctx.attribute_under_caret.as_ref()?;
|
let attribute = ctx.attribute_under_caret.as_ref()?;
|
||||||
match (attribute.path(), attribute.input()) {
|
match (attribute.path(), attribute.input()) {
|
||||||
@ -19,12 +22,17 @@ pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext)
|
|||||||
{
|
{
|
||||||
complete_derive(acc, ctx, token_tree)
|
complete_derive(acc, ctx, token_tree)
|
||||||
}
|
}
|
||||||
|
(Some(path), Some(ast::AttrInput::TokenTree(token_tree)))
|
||||||
|
if path.to_string() == "feature" =>
|
||||||
|
{
|
||||||
|
complete_lint(acc, ctx, token_tree, UNSTABLE_FEATURE_DESCRIPTOR);
|
||||||
|
}
|
||||||
(Some(path), Some(ast::AttrInput::TokenTree(token_tree)))
|
(Some(path), Some(ast::AttrInput::TokenTree(token_tree)))
|
||||||
if ["allow", "warn", "deny", "forbid"]
|
if ["allow", "warn", "deny", "forbid"]
|
||||||
.iter()
|
.iter()
|
||||||
.any(|lint_level| lint_level == &path.to_string()) =>
|
.any(|lint_level| lint_level == &path.to_string()) =>
|
||||||
{
|
{
|
||||||
complete_lint(acc, ctx, token_tree)
|
complete_lint(acc, ctx, token_tree, DEFAULT_LINT_COMPLETIONS)
|
||||||
}
|
}
|
||||||
(_, Some(ast::AttrInput::TokenTree(_token_tree))) => {}
|
(_, Some(ast::AttrInput::TokenTree(_token_tree))) => {}
|
||||||
_ => complete_attribute_start(acc, ctx, attribute),
|
_ => complete_attribute_start(acc, ctx, attribute),
|
||||||
@ -87,7 +95,7 @@ const fn attr(
|
|||||||
attr(r#"deprecated = "…""#, Some("deprecated"), Some(r#"deprecated = "${0:reason}""#)),
|
attr(r#"deprecated = "…""#, Some("deprecated"), Some(r#"deprecated = "${0:reason}""#)),
|
||||||
attr("derive(…)", Some("derive"), Some(r#"derive(${0:Debug})"#)),
|
attr("derive(…)", Some("derive"), Some(r#"derive(${0:Debug})"#)),
|
||||||
attr(r#"doc = "…""#, Some("doc"), Some(r#"doc = "${0:docs}""#)),
|
attr(r#"doc = "…""#, Some("doc"), Some(r#"doc = "${0:docs}""#)),
|
||||||
attr("feature(…)", Some("feature"), Some("feature(${0:flag})")).prefer_inner(),
|
attr("feature(…)", Some("feature"), Some("feature(${0:lint})")).prefer_inner(),
|
||||||
attr("forbid(…)", Some("forbid"), Some("forbid(${0:lint})")),
|
attr("forbid(…)", Some("forbid"), Some("forbid(${0:lint})")),
|
||||||
// FIXME: resolve through macro resolution?
|
// FIXME: resolve through macro resolution?
|
||||||
attr("global_allocator", None, None).prefer_inner(),
|
attr("global_allocator", None, None).prefer_inner(),
|
||||||
@ -164,9 +172,9 @@ fn complete_derive(acc: &mut Completions, ctx: &CompletionContext, derive_input:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn complete_lint(acc: &mut Completions, ctx: &CompletionContext, derive_input: ast::TokenTree) {
|
fn complete_lint(acc: &mut Completions, ctx: &CompletionContext, derive_input: ast::TokenTree, lints_completions: &[LintCompletion]) {
|
||||||
if let Ok(existing_lints) = parse_comma_sep_input(derive_input) {
|
if let Ok(existing_lints) = parse_comma_sep_input(derive_input) {
|
||||||
for lint_completion in DEFAULT_LINT_COMPLETIONS
|
for lint_completion in lints_completions
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|completion| !existing_lints.contains(completion.label))
|
.filter(|completion| !existing_lints.contains(completion.label))
|
||||||
{
|
{
|
||||||
@ -250,9 +258,9 @@ struct DeriveCompletion {
|
|||||||
DeriveCompletion { label: "Ord", dependencies: &["PartialOrd", "Eq", "PartialEq"] },
|
DeriveCompletion { label: "Ord", dependencies: &["PartialOrd", "Eq", "PartialEq"] },
|
||||||
];
|
];
|
||||||
|
|
||||||
struct LintCompletion {
|
pub struct LintCompletion {
|
||||||
label: &'static str,
|
pub label: &'static str,
|
||||||
description: &'static str,
|
pub description: &'static str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
|
File diff suppressed because one or more lines are too long
@ -9,6 +9,7 @@
|
|||||||
mod gen_parser_tests;
|
mod gen_parser_tests;
|
||||||
mod gen_assists_docs;
|
mod gen_assists_docs;
|
||||||
mod gen_feature_docs;
|
mod gen_feature_docs;
|
||||||
|
mod gen_unstable_future_descriptor;
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
fmt, mem,
|
fmt, mem,
|
||||||
@ -22,8 +23,12 @@
|
|||||||
gen_feature_docs::generate_feature_docs,
|
gen_feature_docs::generate_feature_docs,
|
||||||
gen_parser_tests::generate_parser_tests,
|
gen_parser_tests::generate_parser_tests,
|
||||||
gen_syntax::generate_syntax,
|
gen_syntax::generate_syntax,
|
||||||
|
gen_unstable_future_descriptor::generate_unstable_future_descriptor,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Directory used by xtask
|
||||||
|
const STORAGE: &str = ".xtask";
|
||||||
|
|
||||||
const GRAMMAR_DIR: &str = "crates/ra_parser/src/grammar";
|
const GRAMMAR_DIR: &str = "crates/ra_parser/src/grammar";
|
||||||
const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/test_data/parser/inline/ok";
|
const OK_INLINE_TESTS_DIR: &str = "crates/ra_syntax/test_data/parser/inline/ok";
|
||||||
const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/test_data/parser/inline/err";
|
const ERR_INLINE_TESTS_DIR: &str = "crates/ra_syntax/test_data/parser/inline/err";
|
||||||
@ -35,6 +40,9 @@
|
|||||||
const ASSISTS_DIR: &str = "crates/ra_assists/src/handlers";
|
const ASSISTS_DIR: &str = "crates/ra_assists/src/handlers";
|
||||||
const ASSISTS_TESTS: &str = "crates/ra_assists/src/tests/generated.rs";
|
const ASSISTS_TESTS: &str = "crates/ra_assists/src/tests/generated.rs";
|
||||||
|
|
||||||
|
const REPOSITORY_URL: &str = "https://github.com/rust-lang/rust";
|
||||||
|
const UNSTABLE_FEATURE: &str = "crates/ra_ide/src/completion/unstable_feature_descriptor.rs";
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||||
pub enum Mode {
|
pub enum Mode {
|
||||||
Overwrite,
|
Overwrite,
|
||||||
|
55
xtask/src/codegen/gen_unstable_future_descriptor.rs
Normal file
55
xtask/src/codegen/gen_unstable_future_descriptor.rs
Normal file
@ -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::<Vec<_>>();
|
||||||
|
|
||||||
|
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::<Vec<_>>();
|
||||||
|
|
||||||
|
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(())
|
||||||
|
}
|
@ -76,6 +76,7 @@ fn main() -> Result<()> {
|
|||||||
"codegen" => {
|
"codegen" => {
|
||||||
args.finish()?;
|
args.finish()?;
|
||||||
codegen::generate_syntax(Mode::Overwrite)?;
|
codegen::generate_syntax(Mode::Overwrite)?;
|
||||||
|
codegen::generate_unstable_future_descriptor(Mode::Overwrite)?;
|
||||||
codegen::generate_parser_tests(Mode::Overwrite)?;
|
codegen::generate_parser_tests(Mode::Overwrite)?;
|
||||||
codegen::generate_assists_tests(Mode::Overwrite)?;
|
codegen::generate_assists_tests(Mode::Overwrite)?;
|
||||||
codegen::generate_assists_docs(Mode::Overwrite)?;
|
codegen::generate_assists_docs(Mode::Overwrite)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user