simplify expression that checks the offset
This commit is contained in:
parent
4f018d84a9
commit
d122bd43da
3 changed files with 30 additions and 36 deletions
|
|
@ -7,10 +7,7 @@ use syntax::{
|
|||
match_ast, ted,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder,
|
||||
utils::get_struct_definition_from_context,
|
||||
};
|
||||
use crate::{AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder};
|
||||
|
||||
// Assist: convert_named_struct_to_tuple_struct
|
||||
//
|
||||
|
|
@ -59,13 +56,22 @@ pub(crate) fn convert_named_struct_to_tuple_struct(
|
|||
// XXX: We don't currently provide this assist for struct definitions inside macros, but if we
|
||||
// are to lift this limitation, don't forget to make `edit_struct_def()` consider macro files
|
||||
// too.
|
||||
let strukt = get_struct_definition_from_context(ctx)?;
|
||||
let field_list = strukt.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
|
||||
let strukt_or_variant = ctx
|
||||
.find_node_at_offset::<ast::Struct>()
|
||||
.map(Either::Left)
|
||||
.or_else(|| ctx.find_node_at_offset::<ast::Variant>().map(Either::Right))?;
|
||||
let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
|
||||
|
||||
if ctx.offset() > field_list.syntax().text_range().start() {
|
||||
// Assist could be distracting after the braces
|
||||
return None;
|
||||
}
|
||||
|
||||
let record_fields = match field_list {
|
||||
ast::FieldList::RecordFieldList(it) => it,
|
||||
ast::FieldList::TupleFieldList(_) => return None,
|
||||
};
|
||||
let strukt_def = match &strukt {
|
||||
let strukt_def = match &strukt_or_variant {
|
||||
Either::Left(s) => Either::Left(ctx.sema.to_def(s)?),
|
||||
Either::Right(v) => Either::Right(ctx.sema.to_def(v)?),
|
||||
};
|
||||
|
|
@ -73,11 +79,11 @@ pub(crate) fn convert_named_struct_to_tuple_struct(
|
|||
acc.add(
|
||||
AssistId::refactor_rewrite("convert_named_struct_to_tuple_struct"),
|
||||
"Convert to tuple struct",
|
||||
strukt.syntax().text_range(),
|
||||
strukt_or_variant.syntax().text_range(),
|
||||
|edit| {
|
||||
edit_field_references(ctx, edit, record_fields.fields());
|
||||
edit_struct_references(ctx, edit, strukt_def);
|
||||
edit_struct_def(ctx, edit, &strukt, record_fields);
|
||||
edit_struct_def(ctx, edit, &strukt_or_variant, record_fields);
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,7 @@ use syntax::{
|
|||
match_ast, ted,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder,
|
||||
utils::get_struct_definition_from_context,
|
||||
};
|
||||
use crate::{AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder};
|
||||
|
||||
// Assist: convert_tuple_struct_to_named_struct
|
||||
//
|
||||
|
|
@ -54,17 +51,26 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
|
|||
acc: &mut Assists,
|
||||
ctx: &AssistContext<'_>,
|
||||
) -> Option<()> {
|
||||
let strukt = get_struct_definition_from_context(ctx)?;
|
||||
let field_list = strukt.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
|
||||
let strukt_or_variant = ctx
|
||||
.find_node_at_offset::<ast::Struct>()
|
||||
.map(Either::Left)
|
||||
.or_else(|| ctx.find_node_at_offset::<ast::Variant>().map(Either::Right))?;
|
||||
let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
|
||||
|
||||
if ctx.offset() > field_list.syntax().text_range().start() {
|
||||
// Assist could be distracting after the braces
|
||||
return None;
|
||||
}
|
||||
|
||||
let tuple_fields = match field_list {
|
||||
ast::FieldList::TupleFieldList(it) => it,
|
||||
ast::FieldList::RecordFieldList(_) => return None,
|
||||
};
|
||||
let strukt_def = match &strukt {
|
||||
let strukt_def = match &strukt_or_variant {
|
||||
Either::Left(s) => Either::Left(ctx.sema.to_def(s)?),
|
||||
Either::Right(v) => Either::Right(ctx.sema.to_def(v)?),
|
||||
};
|
||||
let target = strukt.as_ref().either(|s| s.syntax(), |v| v.syntax()).text_range();
|
||||
let target = strukt_or_variant.as_ref().either(|s| s.syntax(), |v| v.syntax()).text_range();
|
||||
|
||||
acc.add(
|
||||
AssistId::refactor_rewrite("convert_tuple_struct_to_named_struct"),
|
||||
|
|
@ -74,7 +80,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
|
|||
let names = generate_names(tuple_fields.fields());
|
||||
edit_field_references(ctx, edit, tuple_fields.fields(), &names);
|
||||
edit_struct_references(ctx, edit, strukt_def, &names);
|
||||
edit_struct_def(ctx, edit, &strukt, tuple_fields, names);
|
||||
edit_struct_def(ctx, edit, &strukt_or_variant, tuple_fields, names);
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
//! Assorted functions shared by several assists.
|
||||
|
||||
use either::Either;
|
||||
|
||||
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
|
||||
use hir::{
|
||||
DisplayTarget, HasAttrs as HirHasAttrs, HirDisplay, InFile, ModuleDef, PathResolution,
|
||||
|
|
@ -1148,19 +1146,3 @@ pub fn is_body_const(sema: &Semantics<'_, RootDatabase>, expr: &ast::Expr) -> bo
|
|||
});
|
||||
is_const
|
||||
}
|
||||
|
||||
/// Gets the struct definition from a context
|
||||
pub(crate) fn get_struct_definition_from_context(
|
||||
ctx: &AssistContext<'_>,
|
||||
) -> Option<Either<ast::Struct, ast::Variant>> {
|
||||
ctx.find_node_at_offset::<ast::Name>()
|
||||
.and_then(|name| name.syntax().parent())
|
||||
.or(ctx
|
||||
.token_at_offset()
|
||||
.find(|leaf| matches!(leaf.kind(), STRUCT_KW))
|
||||
.and_then(|kw| kw.parent()))
|
||||
.or(ctx
|
||||
.find_node_at_offset::<ast::Visibility>()
|
||||
.and_then(|visibility| visibility.syntax().parent()))
|
||||
.and_then(<Either<ast::Struct, ast::Variant>>::cast)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue