diff options
| author | Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> | 2021-12-31 16:11:17 +0100 |
|---|---|---|
| committer | Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> | 2021-12-31 16:29:08 +0100 |
| commit | df6fa50f92af1232df5c044b8fe223817588ec8b (patch) | |
| tree | 63ec4a2200a1d693a717a4daa3683fe87a0528b9 | |
| parent | 0435463439471a81477ccdc0313f312abb14331e (diff) | |
| download | rust-df6fa50f92af1232df5c044b8fe223817588ec8b.tar.gz rust-df6fa50f92af1232df5c044b8fe223817588ec8b.zip | |
feat(diagnostics): add new config to fill default expression
Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com>
| -rw-r--r-- | crates/ide/src/lib.rs | 2 | ||||
| -rw-r--r-- | crates/ide_diagnostics/src/handlers/missing_fields.rs | 23 | ||||
| -rw-r--r-- | crates/ide_diagnostics/src/lib.rs | 12 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/config.rs | 27 | ||||
| -rw-r--r-- | docs/user/generated_config.adoc | 5 | ||||
| -rw-r--r-- | editors/code/package.json | 15 |
6 files changed, 70 insertions, 14 deletions
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs index 16a2b4a1130..b8482d0222b 100644 --- a/crates/ide/src/lib.rs +++ b/crates/ide/src/lib.rs @@ -118,7 +118,7 @@ pub use ide_db::{ symbol_index::Query, RootDatabase, SymbolKind, }; -pub use ide_diagnostics::{Diagnostic, DiagnosticsConfig, Severity}; +pub use ide_diagnostics::{Diagnostic, DiagnosticsConfig, ExprFillDefaultMode, Severity}; pub use ide_ssr::SsrError; pub use syntax::{TextRange, TextSize}; pub use text_edit::{Indel, TextEdit}; diff --git a/crates/ide_diagnostics/src/handlers/missing_fields.rs b/crates/ide_diagnostics/src/handlers/missing_fields.rs index 715ac8f9740..b5860fb8587 100644 --- a/crates/ide_diagnostics/src/handlers/missing_fields.rs +++ b/crates/ide_diagnostics/src/handlers/missing_fields.rs @@ -64,15 +64,18 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass }); let missing_fields = ctx.sema.record_literal_missing_fields(&field_list_parent); - let generate_default_expr = |ty: &Type| { - let krate = ctx.sema.to_module_def(d.file.original_file(ctx.sema.db))?.krate(); - let default_trait = FamousDefs(&ctx.sema, Some(krate)).core_default_Default(); - - match default_trait { - Some(default_trait) if ty.impls_trait(ctx.sema.db, default_trait, &[]) => { - Some(make::ext::expr_default()) + let generate_fill_expr = |ty: &Type| match ctx.config.expr_fill_default { + crate::ExprFillDefaultMode::Todo => Some(make::ext::expr_todo()), + crate::ExprFillDefaultMode::DefaultImpl => { + let krate = ctx.sema.to_module_def(d.file.original_file(ctx.sema.db))?.krate(); + let default_trait = FamousDefs(&ctx.sema, Some(krate)).core_default_Default(); + + match default_trait { + Some(default_trait) if ty.impls_trait(ctx.sema.db, default_trait, &[]) => { + Some(make::ext::expr_default()) + } + _ => Some(make::ext::expr_todo()), } - _ => Some(make::ext::expr_todo()), } }; @@ -83,10 +86,10 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::MissingFields) -> Option<Vec<Ass if ty.could_unify_with(ctx.sema.db, &candidate_ty) { None } else { - generate_default_expr(ty) + generate_fill_expr(ty) } } else { - generate_default_expr(ty) + generate_fill_expr(ty) }; let field = make::record_expr_field(make::name_ref(&f.name(ctx.sema.db).to_smol_str()), field_expr) diff --git a/crates/ide_diagnostics/src/lib.rs b/crates/ide_diagnostics/src/lib.rs index c921d989bd3..f4c613840e3 100644 --- a/crates/ide_diagnostics/src/lib.rs +++ b/crates/ide_diagnostics/src/lib.rs @@ -129,10 +129,22 @@ pub enum Severity { WeakWarning, } +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum ExprFillDefaultMode { + Todo, + DefaultImpl, +} +impl Default for ExprFillDefaultMode { + fn default() -> Self { + Self::Todo + } +} + #[derive(Default, Debug, Clone)] pub struct DiagnosticsConfig { pub disable_experimental: bool, pub disabled: FxHashSet<String>, + pub expr_fill_default: ExprFillDefaultMode, } struct DiagnosticsContext<'a> { diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 867f2bd1f0e..9cef5584576 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -11,8 +11,8 @@ use std::{ffi::OsString, iter, path::PathBuf}; use flycheck::FlycheckConfig; use ide::{ - AssistConfig, CompletionConfig, DiagnosticsConfig, HighlightRelatedConfig, HoverConfig, - HoverDocFormat, InlayHintsConfig, JoinLinesConfig, Snippet, SnippetScope, + AssistConfig, CompletionConfig, DiagnosticsConfig, ExprFillDefaultMode, HighlightRelatedConfig, + HoverConfig, HoverDocFormat, InlayHintsConfig, JoinLinesConfig, Snippet, SnippetScope, }; use ide_db::helpers::{ insert_use::{ImportGranularity, InsertUseConfig, PrefixKind}, @@ -45,6 +45,8 @@ use crate::{ // parsing the old name. config_data! { struct ConfigData { + /// How assists will fill missing elements in an expression. + assist_exprFillDefault: ExprFillDefaultDef = "\"todo\"", /// How imports should be grouped into use statements. assist_importGranularity | assist_importMergeBehavior | @@ -694,6 +696,10 @@ impl Config { DiagnosticsConfig { disable_experimental: !self.data.diagnostics_enableExperimental, disabled: self.data.diagnostics_disabled.clone(), + expr_fill_default: match self.data.assist_exprFillDefault { + ExprFillDefaultDef::Todo => ExprFillDefaultMode::Todo, + ExprFillDefaultDef::DefaultImpl => ExprFillDefaultMode::DefaultImpl, + }, } } pub fn diagnostics_map(&self) -> DiagnosticsMapConfig { @@ -1061,6 +1067,15 @@ enum ManifestOrProjectJson { #[derive(Deserialize, Debug, Clone)] #[serde(rename_all = "snake_case")] +pub enum ExprFillDefaultDef { + #[serde(alias = "todo")] + Todo, + #[serde(alias = "defaultImpl")] + DefaultImpl, +} + +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] enum ImportGranularityDef { Preserve, #[serde(alias = "none")] @@ -1253,6 +1268,14 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json "Merge imports from the same module into a single `use` statement." ], }, + "ExprFillDefaultDef" => set! { + "type": "string", + "enum": ["todo", "defaultImpl"], + "enumDescriptions": [ + "Fill missing elements with 'todo' macro", + "Fill missing elements with Default::default()" + ], + }, "ImportGranularityDef" => set! { "type": "string", "enum": ["preserve", "crate", "module", "item"], diff --git a/docs/user/generated_config.adoc b/docs/user/generated_config.adoc index 494051b3060..28350374d13 100644 --- a/docs/user/generated_config.adoc +++ b/docs/user/generated_config.adoc @@ -1,3 +1,8 @@ +[[rust-analyzer.assist.exprFillDefault]]rust-analyzer.assist.exprFillDefault (default: `"todo"`):: ++ +-- +How assists will fill missing elements in an expression. +-- [[rust-analyzer.assist.importGranularity]]rust-analyzer.assist.importGranularity (default: `"crate"`):: + -- diff --git a/editors/code/package.json b/editors/code/package.json index 550b28e1cdb..cbe9bf54427 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -378,6 +378,19 @@ "markdownDescription": "Optional settings passed to the debug engine. Example: `{ \"lldb\": { \"terminal\":\"external\"} }`" }, "$generated-start": {}, + "rust-analyzer.assist.exprFillDefault": { + "markdownDescription": "How assists will fill missing elements in an expression.", + "default": "todo", + "type": "string", + "enum": [ + "todo", + "defaultImpl" + ], + "enumDescriptions": [ + "Fill missing elements with 'todo' macro", + "Fill missing elements with Default::default()" + ] + }, "rust-analyzer.assist.importGranularity": { "markdownDescription": "How imports should be grouped into use statements.", "default": "crate", @@ -1494,4 +1507,4 @@ ] } } -} +} \ No newline at end of file |
