Skip to content

Commit d122bd4

Browse files
committed
simplify expression that checks the offset
1 parent 4f018d8 commit d122bd4

File tree

3 files changed

+30
-36
lines changed

3 files changed

+30
-36
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ use syntax::{
77
match_ast, ted,
88
};
99

10-
use crate::{
11-
AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder,
12-
utils::get_struct_definition_from_context,
13-
};
10+
use crate::{AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder};
1411

1512
// Assist: convert_named_struct_to_tuple_struct
1613
//
@@ -59,25 +56,34 @@ pub(crate) fn convert_named_struct_to_tuple_struct(
5956
// XXX: We don't currently provide this assist for struct definitions inside macros, but if we
6057
// are to lift this limitation, don't forget to make `edit_struct_def()` consider macro files
6158
// too.
62-
let strukt = get_struct_definition_from_context(ctx)?;
63-
let field_list = strukt.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
59+
let strukt_or_variant = ctx
60+
.find_node_at_offset::<ast::Struct>()
61+
.map(Either::Left)
62+
.or_else(|| ctx.find_node_at_offset::<ast::Variant>().map(Either::Right))?;
63+
let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
64+
65+
if ctx.offset() > field_list.syntax().text_range().start() {
66+
// Assist could be distracting after the braces
67+
return None;
68+
}
69+
6470
let record_fields = match field_list {
6571
ast::FieldList::RecordFieldList(it) => it,
6672
ast::FieldList::TupleFieldList(_) => return None,
6773
};
68-
let strukt_def = match &strukt {
74+
let strukt_def = match &strukt_or_variant {
6975
Either::Left(s) => Either::Left(ctx.sema.to_def(s)?),
7076
Either::Right(v) => Either::Right(ctx.sema.to_def(v)?),
7177
};
7278

7379
acc.add(
7480
AssistId::refactor_rewrite("convert_named_struct_to_tuple_struct"),
7581
"Convert to tuple struct",
76-
strukt.syntax().text_range(),
82+
strukt_or_variant.syntax().text_range(),
7783
|edit| {
7884
edit_field_references(ctx, edit, record_fields.fields());
7985
edit_struct_references(ctx, edit, strukt_def);
80-
edit_struct_def(ctx, edit, &strukt, record_fields);
86+
edit_struct_def(ctx, edit, &strukt_or_variant, record_fields);
8187
},
8288
)
8389
}

src/tools/rust-analyzer/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ use syntax::{
66
match_ast, ted,
77
};
88

9-
use crate::{
10-
AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder,
11-
utils::get_struct_definition_from_context,
12-
};
9+
use crate::{AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder};
1310

1411
// Assist: convert_tuple_struct_to_named_struct
1512
//
@@ -54,17 +51,26 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
5451
acc: &mut Assists,
5552
ctx: &AssistContext<'_>,
5653
) -> Option<()> {
57-
let strukt = get_struct_definition_from_context(ctx)?;
58-
let field_list = strukt.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
54+
let strukt_or_variant = ctx
55+
.find_node_at_offset::<ast::Struct>()
56+
.map(Either::Left)
57+
.or_else(|| ctx.find_node_at_offset::<ast::Variant>().map(Either::Right))?;
58+
let field_list = strukt_or_variant.as_ref().either(|s| s.field_list(), |v| v.field_list())?;
59+
60+
if ctx.offset() > field_list.syntax().text_range().start() {
61+
// Assist could be distracting after the braces
62+
return None;
63+
}
64+
5965
let tuple_fields = match field_list {
6066
ast::FieldList::TupleFieldList(it) => it,
6167
ast::FieldList::RecordFieldList(_) => return None,
6268
};
63-
let strukt_def = match &strukt {
69+
let strukt_def = match &strukt_or_variant {
6470
Either::Left(s) => Either::Left(ctx.sema.to_def(s)?),
6571
Either::Right(v) => Either::Right(ctx.sema.to_def(v)?),
6672
};
67-
let target = strukt.as_ref().either(|s| s.syntax(), |v| v.syntax()).text_range();
73+
let target = strukt_or_variant.as_ref().either(|s| s.syntax(), |v| v.syntax()).text_range();
6874

6975
acc.add(
7076
AssistId::refactor_rewrite("convert_tuple_struct_to_named_struct"),
@@ -74,7 +80,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
7480
let names = generate_names(tuple_fields.fields());
7581
edit_field_references(ctx, edit, tuple_fields.fields(), &names);
7682
edit_struct_references(ctx, edit, strukt_def, &names);
77-
edit_struct_def(ctx, edit, &strukt, tuple_fields, names);
83+
edit_struct_def(ctx, edit, &strukt_or_variant, tuple_fields, names);
7884
},
7985
)
8086
}

src/tools/rust-analyzer/crates/ide-assists/src/utils.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
//! Assorted functions shared by several assists.
22
3-
use either::Either;
4-
53
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
64
use hir::{
75
DisplayTarget, HasAttrs as HirHasAttrs, HirDisplay, InFile, ModuleDef, PathResolution,
@@ -1148,19 +1146,3 @@ pub fn is_body_const(sema: &Semantics<'_, RootDatabase>, expr: &ast::Expr) -> bo
11481146
});
11491147
is_const
11501148
}
1151-
1152-
/// Gets the struct definition from a context
1153-
pub(crate) fn get_struct_definition_from_context(
1154-
ctx: &AssistContext<'_>,
1155-
) -> Option<Either<ast::Struct, ast::Variant>> {
1156-
ctx.find_node_at_offset::<ast::Name>()
1157-
.and_then(|name| name.syntax().parent())
1158-
.or(ctx
1159-
.token_at_offset()
1160-
.find(|leaf| matches!(leaf.kind(), STRUCT_KW))
1161-
.and_then(|kw| kw.parent()))
1162-
.or(ctx
1163-
.find_node_at_offset::<ast::Visibility>()
1164-
.and_then(|visibility| visibility.syntax().parent()))
1165-
.and_then(<Either<ast::Struct, ast::Variant>>::cast)
1166-
}

0 commit comments

Comments
 (0)