mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 21:54:42 +00:00
Auto merge of #13359 - feniljain:feat-must-use-option, r=Veykril
feat: add config for inserting must_use in `generate_enum_as_method` Should fix #13312 Didn't add a test because I was not sure on how to add test for a specific configuration option, tried to look for the usages for other `AssistConfig` variants but couldn't find any in `tests`. If there is a way to test this, do point me towards it. I tried to extract the formatting string as a common `template_string` and only have if-else for that, but it didn't compile :( Also it seems these tests are failing: ``` test config::tests::generate_config_documentation ... FAILED test config::tests::generate_package_json_config ... FAILED ``` Can you also point me to how to correct these 😅 ( I guess there is some command to automatically generate these? )
This commit is contained in:
commit
af1f48deab
6 changed files with 32 additions and 4 deletions
|
@ -14,4 +14,5 @@ pub struct AssistConfig {
|
||||||
pub allowed: Option<Vec<AssistKind>>,
|
pub allowed: Option<Vec<AssistKind>>,
|
||||||
pub insert_use: InsertUseConfig,
|
pub insert_use: InsertUseConfig,
|
||||||
pub prefer_no_std: bool,
|
pub prefer_no_std: bool,
|
||||||
|
pub assist_emit_must_use: bool,
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,6 +124,7 @@ fn generate_enum_projection_method(
|
||||||
happy_case,
|
happy_case,
|
||||||
sad_case,
|
sad_case,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
let variant = ctx.find_node_at_offset::<ast::Variant>()?;
|
let variant = ctx.find_node_at_offset::<ast::Variant>()?;
|
||||||
let variant_name = variant.name()?;
|
let variant_name = variant.name()?;
|
||||||
let parent_enum = ast::Adt::Enum(variant.parent_enum());
|
let parent_enum = ast::Adt::Enum(variant.parent_enum());
|
||||||
|
@ -144,7 +145,7 @@ fn generate_enum_projection_method(
|
||||||
ast::StructKind::Unit => return None,
|
ast::StructKind::Unit => return None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let fn_name = format!("{}_{}", fn_name_prefix, &to_lower_snake_case(&variant_name.text()));
|
let fn_name = format!("{fn_name_prefix}_{}", &to_lower_snake_case(&variant_name.text()));
|
||||||
|
|
||||||
// Return early if we've found an existing new fn
|
// Return early if we've found an existing new fn
|
||||||
let impl_def = find_struct_impl(ctx, &parent_enum, &[fn_name.clone()])?;
|
let impl_def = find_struct_impl(ctx, &parent_enum, &[fn_name.clone()])?;
|
||||||
|
@ -156,15 +157,25 @@ fn generate_enum_projection_method(
|
||||||
assist_description,
|
assist_description,
|
||||||
target,
|
target,
|
||||||
|builder| {
|
|builder| {
|
||||||
let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{v} "));
|
let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v));
|
||||||
|
|
||||||
|
let field_type_syntax = field_type.syntax();
|
||||||
|
|
||||||
|
let must_use = if ctx.config.assist_emit_must_use {
|
||||||
|
"#[must_use]\n "
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
|
|
||||||
let method = format!(
|
let method = format!(
|
||||||
" {vis}fn {fn_name}({self_param}) -> {return_prefix}{field_type}{return_suffix} {{
|
" {must_use}{vis}fn {fn_name}({self_param}) -> {return_prefix}{field_type_syntax}{return_suffix} {{
|
||||||
if let Self::{variant_name}{pattern_suffix} = self {{
|
if let Self::{variant_name}{pattern_suffix} = self {{
|
||||||
{happy_case}({bound_name})
|
{happy_case}({bound_name})
|
||||||
}} else {{
|
}} else {{
|
||||||
{sad_case}
|
{sad_case}
|
||||||
}}
|
}}
|
||||||
}}");
|
}}"
|
||||||
|
);
|
||||||
|
|
||||||
add_method_to_adt(builder, &parent_enum, impl_def, &method);
|
add_method_to_adt(builder, &parent_enum, impl_def, &method);
|
||||||
},
|
},
|
||||||
|
|
|
@ -30,6 +30,7 @@ pub(crate) const TEST_CONFIG: AssistConfig = AssistConfig {
|
||||||
skip_glob_imports: true,
|
skip_glob_imports: true,
|
||||||
},
|
},
|
||||||
prefer_no_std: false,
|
prefer_no_std: false,
|
||||||
|
assist_emit_must_use: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) {
|
pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) {
|
||||||
|
|
|
@ -56,6 +56,9 @@ mod patch_old_style;
|
||||||
// parsing the old name.
|
// parsing the old name.
|
||||||
config_data! {
|
config_data! {
|
||||||
struct ConfigData {
|
struct ConfigData {
|
||||||
|
/// Whether to insert #[must_use] when generating `as_` methods
|
||||||
|
/// for enum variants.
|
||||||
|
assist_emitMustUse: bool = "false",
|
||||||
/// Placeholder expression to use for missing expressions in assists.
|
/// Placeholder expression to use for missing expressions in assists.
|
||||||
assist_expressionFillDefault: ExprFillDefaultDef = "\"todo\"",
|
assist_expressionFillDefault: ExprFillDefaultDef = "\"todo\"",
|
||||||
|
|
||||||
|
@ -1276,6 +1279,7 @@ impl Config {
|
||||||
allowed: None,
|
allowed: None,
|
||||||
insert_use: self.insert_use_config(),
|
insert_use: self.insert_use_config(),
|
||||||
prefer_no_std: self.data.imports_prefer_no_std,
|
prefer_no_std: self.data.imports_prefer_no_std,
|
||||||
|
assist_emit_must_use: self.data.assist_emitMustUse,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
[[rust-analyzer.assist.emitMustUse]]rust-analyzer.assist.emitMustUse (default: `false`)::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
Whether to insert #[must_use] when generating `as_` methods
|
||||||
|
for enum variants.
|
||||||
|
--
|
||||||
[[rust-analyzer.assist.expressionFillDefault]]rust-analyzer.assist.expressionFillDefault (default: `"todo"`)::
|
[[rust-analyzer.assist.expressionFillDefault]]rust-analyzer.assist.expressionFillDefault (default: `"todo"`)::
|
||||||
+
|
+
|
||||||
--
|
--
|
||||||
|
|
|
@ -397,6 +397,11 @@
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
},
|
},
|
||||||
"$generated-start": {},
|
"$generated-start": {},
|
||||||
|
"rust-analyzer.assist.emitMustUse": {
|
||||||
|
"markdownDescription": "Whether to insert #[must_use] when generating `as_` methods\nfor enum variants.",
|
||||||
|
"default": false,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"rust-analyzer.assist.expressionFillDefault": {
|
"rust-analyzer.assist.expressionFillDefault": {
|
||||||
"markdownDescription": "Placeholder expression to use for missing expressions in assists.",
|
"markdownDescription": "Placeholder expression to use for missing expressions in assists.",
|
||||||
"default": "todo",
|
"default": "todo",
|
||||||
|
|
Loading…
Reference in a new issue