Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit ce5859e

Browse files
committed
Lift out PathKind variant fields into structs
1 parent 5c69df9 commit ce5859e

File tree

9 files changed

+86
-91
lines changed

9 files changed

+86
-91
lines changed

crates/ide-completion/src/completions/attribute.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use syntax::{
1818

1919
use crate::{
2020
completions::module_or_attr,
21-
context::{CompletionContext, PathCompletionCtx, PathKind, Qualified},
21+
context::{AttrCtx, CompletionContext, PathCompletionCtx, PathKind, Qualified},
2222
item::CompletionItem,
2323
Completions,
2424
};
@@ -76,7 +76,7 @@ pub(crate) fn complete_attribute(
7676
) {
7777
let (qualified, is_inner, annotated_item_kind) = match path_ctx {
7878
&PathCompletionCtx {
79-
kind: PathKind::Attr { kind, annotated_item_kind },
79+
kind: PathKind::Attr { attr_ctx: AttrCtx { kind, annotated_item_kind } },
8080
ref qualified,
8181
..
8282
} => (qualified, kind == AttrKind::Inner, annotated_item_kind),

crates/ide-completion/src/completions/dot.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use ide_db::FxHashSet;
44

55
use crate::{
66
context::{
7-
CompletionContext, DotAccess, DotAccessKind, PathCompletionCtx, PathKind, Qualified,
7+
CompletionContext, DotAccess, DotAccessKind, ExprCtx, PathCompletionCtx, PathKind,
8+
Qualified,
89
},
910
CompletionItem, CompletionItemKind, Completions,
1011
};
@@ -49,7 +50,7 @@ pub(crate) fn complete_undotted_self(
4950
let self_param = match path_ctx {
5051
PathCompletionCtx {
5152
qualified: Qualified::No,
52-
kind: PathKind::Expr { self_param: Some(self_param), .. },
53+
kind: PathKind::Expr { expr_ctx: ExprCtx { self_param: Some(self_param), .. } },
5354
..
5455
} if path_ctx.is_trivial_path() && ctx.qualifier_ctx.none() => self_param,
5556
_ => return,

crates/ide-completion/src/completions/expr.rs

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use hir::ScopeDef;
44
use ide_db::FxHashSet;
55

66
use crate::{
7-
context::{PathCompletionCtx, PathKind, Qualified},
7+
context::{ExprCtx, PathCompletionCtx, PathKind, Qualified},
88
CompletionContext, Completions,
99
};
1010

@@ -19,47 +19,28 @@ pub(crate) fn complete_expr_path(
1919
}
2020
let (
2121
qualified,
22-
in_block_expr,
23-
in_loop_body,
24-
is_func_update,
25-
after_if_expr,
26-
wants_mut_token,
27-
in_condition,
28-
ty,
29-
incomplete_let,
30-
impl_,
31-
) = match path_ctx {
32-
&PathCompletionCtx {
33-
kind:
34-
PathKind::Expr {
35-
in_block_expr,
36-
in_loop_body,
37-
after_if_expr,
38-
in_condition,
39-
incomplete_let,
40-
ref ref_expr_parent,
41-
ref is_func_update,
42-
ref innermost_ret_ty,
43-
ref impl_,
44-
..
45-
},
46-
ref qualified,
47-
..
48-
} => (
49-
qualified,
22+
&ExprCtx {
5023
in_block_expr,
5124
in_loop_body,
52-
is_func_update.is_some(),
5325
after_if_expr,
54-
ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false),
5526
in_condition,
56-
innermost_ret_ty,
5727
incomplete_let,
58-
impl_,
59-
),
28+
ref ref_expr_parent,
29+
ref is_func_update,
30+
ref innermost_ret_ty,
31+
ref impl_,
32+
..
33+
},
34+
) = match path_ctx {
35+
PathCompletionCtx { kind: PathKind::Expr { expr_ctx }, qualified, .. } => {
36+
(qualified, expr_ctx)
37+
}
6038
_ => return,
6139
};
6240

41+
let wants_mut_token =
42+
ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false);
43+
6344
let scope_def_applicable = |def| {
6445
use hir::{GenericParam::*, ModuleDef::*};
6546
match def {
@@ -230,7 +211,7 @@ pub(crate) fn complete_expr_path(
230211
}
231212
});
232213

233-
if !is_func_update {
214+
if is_func_update.is_none() {
234215
let mut add_keyword =
235216
|kw, snippet| acc.add_keyword_snippet_expr(ctx, kw, snippet, incomplete_let);
236217

@@ -270,7 +251,7 @@ pub(crate) fn complete_expr_path(
270251
}
271252
}
272253

273-
if let Some(ty) = ty {
254+
if let Some(ty) = innermost_ret_ty {
274255
add_keyword(
275256
"return",
276257
match (in_block_expr, ty.is_unit()) {

crates/ide-completion/src/completions/item_list.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use crate::{
44
completions::module_or_fn_macro,
5-
context::{ItemListKind, PathCompletionCtx, PathKind, Qualified},
5+
context::{ExprCtx, ItemListKind, PathCompletionCtx, PathKind, Qualified},
66
CompletionContext, Completions,
77
};
88

@@ -21,9 +21,10 @@ pub(crate) fn complete_item_list(
2121
}
2222
qualified
2323
}
24-
PathCompletionCtx { kind: PathKind::Expr { in_block_expr: true, .. }, .. }
25-
if path_ctx.is_trivial_path() =>
26-
{
24+
PathCompletionCtx {
25+
kind: PathKind::Expr { expr_ctx: ExprCtx { in_block_expr: true, .. } },
26+
..
27+
} if path_ctx.is_trivial_path() => {
2728
add_keywords(acc, ctx, None);
2829
return;
2930
}

crates/ide-completion/src/completions/record.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use syntax::{
66
};
77

88
use crate::{
9-
context::{PathCompletionCtx, PathKind, PatternContext, Qualified},
9+
context::{ExprCtx, PathCompletionCtx, PathKind, PatternContext, Qualified},
1010
CompletionContext, CompletionItem, CompletionItemKind, CompletionRelevance,
1111
CompletionRelevancePostfixMatch, Completions,
1212
};
@@ -87,7 +87,7 @@ pub(crate) fn complete_record_expr_func_update(
8787
path_ctx: &PathCompletionCtx,
8888
) {
8989
if let PathCompletionCtx {
90-
kind: PathKind::Expr { is_func_update: Some(record_expr), .. },
90+
kind: PathKind::Expr { expr_ctx: ExprCtx { is_func_update: Some(record_expr), .. } },
9191
qualified: Qualified::No,
9292
..
9393
} = path_ctx

crates/ide-completion/src/completions/snippet.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use hir::Documentation;
44
use ide_db::{imports::insert_use::ImportScope, SnippetCap};
55

66
use crate::{
7-
context::{ItemListKind, PathCompletionCtx, PathKind, Qualified},
7+
context::{ExprCtx, ItemListKind, PathCompletionCtx, PathKind, Qualified},
88
item::Builder,
99
CompletionContext, CompletionItem, CompletionItemKind, Completions, SnippetScope,
1010
};
@@ -23,7 +23,7 @@ pub(crate) fn complete_expr_snippet(
2323
let &can_be_stmt = match path_ctx {
2424
PathCompletionCtx {
2525
qualified: Qualified::No,
26-
kind: PathKind::Expr { in_block_expr, .. },
26+
kind: PathKind::Expr { expr_ctx: ExprCtx { in_block_expr, .. } },
2727
..
2828
} => in_block_expr,
2929
_ => return,
@@ -52,7 +52,9 @@ pub(crate) fn complete_item_snippet(
5252
let path_kind = match path_ctx {
5353
PathCompletionCtx {
5454
qualified: Qualified::No,
55-
kind: kind @ (PathKind::Item { .. } | PathKind::Expr { in_block_expr: true, .. }),
55+
kind:
56+
kind @ (PathKind::Item { .. }
57+
| PathKind::Expr { expr_ctx: ExprCtx { in_block_expr: true, .. }, .. }),
5658
..
5759
} => kind,
5860
_ => return,

crates/ide-completion/src/context.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,24 +88,13 @@ impl PathCompletionCtx {
8888
#[derive(Debug, PartialEq, Eq)]
8989
pub(super) enum PathKind {
9090
Expr {
91-
in_block_expr: bool,
92-
in_loop_body: bool,
93-
after_if_expr: bool,
94-
/// Whether this expression is the direct condition of an if or while expression
95-
in_condition: bool,
96-
incomplete_let: bool,
97-
ref_expr_parent: Option<ast::RefExpr>,
98-
is_func_update: Option<ast::RecordExpr>,
99-
self_param: Option<hir::SelfParam>,
100-
innermost_ret_ty: Option<hir::Type>,
101-
impl_: Option<ast::Impl>,
91+
expr_ctx: ExprCtx,
10292
},
10393
Type {
10494
location: TypeLocation,
10595
},
10696
Attr {
107-
kind: AttrKind,
108-
annotated_item_kind: Option<SyntaxKind>,
97+
attr_ctx: AttrCtx,
10998
},
11099
Derive {
111100
existing_derives: FxHashSet<hir::Macro>,
@@ -122,6 +111,26 @@ pub(super) enum PathKind {
122111
},
123112
Use,
124113
}
114+
#[derive(Debug, PartialEq, Eq)]
115+
pub(crate) struct AttrCtx {
116+
pub(crate) kind: AttrKind,
117+
pub(crate) annotated_item_kind: Option<SyntaxKind>,
118+
}
119+
120+
#[derive(Debug, PartialEq, Eq)]
121+
pub(crate) struct ExprCtx {
122+
pub(crate) in_block_expr: bool,
123+
pub(crate) in_loop_body: bool,
124+
pub(crate) after_if_expr: bool,
125+
/// Whether this expression is the direct condition of an if or while expression
126+
pub(crate) in_condition: bool,
127+
pub(crate) incomplete_let: bool,
128+
pub(crate) ref_expr_parent: Option<ast::RefExpr>,
129+
pub(crate) is_func_update: Option<ast::RecordExpr>,
130+
pub(crate) self_param: Option<hir::SelfParam>,
131+
pub(crate) innermost_ret_ty: Option<hir::Type>,
132+
pub(crate) impl_: Option<ast::Impl>,
133+
}
125134

126135
/// Original file ast nodes
127136
#[derive(Clone, Debug, PartialEq, Eq)]

crates/ide-completion/src/context/analysis.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ use syntax::{
1111
};
1212

1313
use crate::context::{
14-
CompletionContext, DotAccess, DotAccessKind, IdentContext, ItemListKind, LifetimeContext,
15-
LifetimeKind, NameContext, NameKind, NameRefContext, NameRefKind, ParamKind, PathCompletionCtx,
16-
PathKind, PatternContext, PatternRefutability, Qualified, QualifierCtx, TypeAscriptionTarget,
17-
TypeLocation, COMPLETION_MARKER,
14+
AttrCtx, CompletionContext, DotAccess, DotAccessKind, ExprCtx, IdentContext, ItemListKind,
15+
LifetimeContext, LifetimeKind, NameContext, NameKind, NameRefContext, NameRefKind, ParamKind,
16+
PathCompletionCtx, PathKind, PatternContext, PatternRefutability, Qualified, QualifierCtx,
17+
TypeAscriptionTarget, TypeLocation, COMPLETION_MARKER,
1818
};
1919

2020
impl<'a> CompletionContext<'a> {
@@ -765,16 +765,18 @@ impl<'a> CompletionContext<'a> {
765765
let impl_ = fetch_immediate_impl(sema, original_file, expr.syntax());
766766

767767
PathKind::Expr {
768-
in_block_expr,
769-
in_loop_body,
770-
after_if_expr,
771-
in_condition,
772-
ref_expr_parent,
773-
is_func_update,
774-
innermost_ret_ty,
775-
self_param,
776-
incomplete_let,
777-
impl_,
768+
expr_ctx: ExprCtx {
769+
in_block_expr,
770+
in_loop_body,
771+
after_if_expr,
772+
in_condition,
773+
ref_expr_parent,
774+
is_func_update,
775+
innermost_ret_ty,
776+
self_param,
777+
incomplete_let,
778+
impl_,
779+
},
778780
}
779781
};
780782
let make_path_kind_type = |ty: ast::Type| {
@@ -858,8 +860,10 @@ impl<'a> CompletionContext<'a> {
858860
Some(attached.kind())
859861
};
860862
PathKind::Attr {
861-
kind,
862-
annotated_item_kind,
863+
attr_ctx: AttrCtx {
864+
kind,
865+
annotated_item_kind,
866+
}
863867
}
864868
},
865869
ast::Visibility(it) => PathKind::Vis { has_in_token: it.in_token().is_some() },
@@ -914,7 +918,7 @@ impl<'a> CompletionContext<'a> {
914918
if path_ctx.is_trivial_path() {
915919
// fetch the full expression that may have qualifiers attached to it
916920
let top_node = match path_ctx.kind {
917-
PathKind::Expr { in_block_expr: true, .. } => {
921+
PathKind::Expr { expr_ctx: ExprCtx { in_block_expr: true, .. } } => {
918922
parent.ancestors().find(|it| ast::PathExpr::can_cast(it.kind())).and_then(|p| {
919923
let parent = p.parent()?;
920924
if ast::StmtList::can_cast(parent.kind()) {

crates/ide-completion/src/lib.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,13 @@ pub fn completions(
165165
{
166166
let acc = &mut completions;
167167

168+
let mut complete_patterns = |pattern_ctx| {
169+
completions::flyimport::import_on_the_fly_pat(acc, ctx, pattern_ctx);
170+
completions::fn_param::complete_fn_param(acc, ctx, pattern_ctx);
171+
completions::pattern::complete_pattern(acc, ctx, pattern_ctx);
172+
completions::record::complete_record_pattern_fields(acc, ctx, pattern_ctx);
173+
};
174+
168175
match &ctx.ident_ctx {
169176
IdentContext::Name(NameContext { name, kind }) => match kind {
170177
NameKind::Const => {
@@ -173,12 +180,7 @@ pub fn completions(
173180
NameKind::Function => {
174181
completions::item_list::trait_impl::complete_trait_impl_fn(acc, ctx, name);
175182
}
176-
NameKind::IdentPat(pattern_ctx) => {
177-
completions::flyimport::import_on_the_fly_pat(acc, ctx, pattern_ctx);
178-
completions::fn_param::complete_fn_param(acc, ctx, pattern_ctx);
179-
completions::pattern::complete_pattern(acc, ctx, pattern_ctx);
180-
completions::record::complete_record_pattern_fields(acc, ctx, pattern_ctx);
181-
}
183+
NameKind::IdentPat(pattern_ctx) => complete_patterns(pattern_ctx),
182184
NameKind::Module(mod_under_caret) => {
183185
completions::mod_::complete_mod(acc, ctx, mod_under_caret);
184186
}
@@ -239,12 +241,7 @@ pub fn completions(
239241
record_expr,
240242
);
241243
}
242-
NameRefKind::Pattern(pattern_ctx) => {
243-
completions::flyimport::import_on_the_fly_pat(acc, ctx, pattern_ctx);
244-
completions::fn_param::complete_fn_param(acc, ctx, pattern_ctx);
245-
completions::pattern::complete_pattern(acc, ctx, pattern_ctx);
246-
completions::record::complete_record_pattern_fields(acc, ctx, pattern_ctx);
247-
}
244+
NameRefKind::Pattern(pattern_ctx) => complete_patterns(pattern_ctx),
248245
},
249246
IdentContext::Lifetime(lifetime_ctx) => {
250247
completions::lifetime::complete_label(acc, ctx, lifetime_ctx);

0 commit comments

Comments
 (0)