`cargo clippy --fix`
diff --git a/crates/cfg/src/cfg_expr.rs b/crates/cfg/src/cfg_expr.rs
index aed00aa..f83c21e 100644
--- a/crates/cfg/src/cfg_expr.rs
+++ b/crates/cfg/src/cfg_expr.rs
@@ -134,10 +134,10 @@
};
// Eat comma separator
- if let Some(TtElement::Leaf(tt::Leaf::Punct(punct))) = it.peek() {
- if punct.char == ',' {
- it.next();
- }
+ if let Some(TtElement::Leaf(tt::Leaf::Punct(punct))) = it.peek()
+ && punct.char == ','
+ {
+ it.next();
}
Some(ret)
}
diff --git a/crates/hir-def/src/attr.rs b/crates/hir-def/src/attr.rs
index b509e69..5325051 100644
--- a/crates/hir-def/src/attr.rs
+++ b/crates/hir-def/src/attr.rs
@@ -377,10 +377,10 @@
let mut align = None;
if let Some(TtElement::Subtree(_, mut tt_iter)) = tts.peek() {
tts.next();
- if let Some(TtElement::Leaf(tt::Leaf::Literal(lit))) = tt_iter.next() {
- if let Ok(a) = lit.symbol.as_str().parse() {
- align = Align::from_bytes(a).ok();
- }
+ if let Some(TtElement::Leaf(tt::Leaf::Literal(lit))) = tt_iter.next()
+ && let Ok(a) = lit.symbol.as_str().parse()
+ {
+ align = Align::from_bytes(a).ok();
}
}
ReprOptions { align, ..Default::default() }
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs
index abd1382..3b9281f 100644
--- a/crates/hir-def/src/expr_store/lower.rs
+++ b/crates/hir-def/src/expr_store/lower.rs
@@ -1487,13 +1487,13 @@
ast::Expr::UnderscoreExpr(_) => self.alloc_pat_from_expr(Pat::Wild, syntax_ptr),
ast::Expr::ParenExpr(e) => {
// We special-case `(..)` for consistency with patterns.
- if let Some(ast::Expr::RangeExpr(range)) = e.expr() {
- if range.is_range_full() {
- return Some(self.alloc_pat_from_expr(
- Pat::Tuple { args: Box::default(), ellipsis: Some(0) },
- syntax_ptr,
- ));
- }
+ if let Some(ast::Expr::RangeExpr(range)) = e.expr()
+ && range.is_range_full()
+ {
+ return Some(self.alloc_pat_from_expr(
+ Pat::Tuple { args: Box::default(), ellipsis: Some(0) },
+ syntax_ptr,
+ ));
}
return e.expr().and_then(|expr| self.maybe_collect_expr_as_pat(&expr));
}
@@ -2569,19 +2569,18 @@
}
}
RibKind::MacroDef(macro_id) => {
- if let Some((parent_ctx, label_macro_id)) = hygiene_info {
- if label_macro_id == **macro_id {
- // A macro is allowed to refer to labels from before its declaration.
- // Therefore, if we got to the rib of its declaration, give up its hygiene
- // and use its parent expansion.
+ if let Some((parent_ctx, label_macro_id)) = hygiene_info
+ && label_macro_id == **macro_id
+ {
+ // A macro is allowed to refer to labels from before its declaration.
+ // Therefore, if we got to the rib of its declaration, give up its hygiene
+ // and use its parent expansion.
- hygiene_id =
- HygieneId::new(parent_ctx.opaque_and_semitransparent(self.db));
- hygiene_info = parent_ctx.outer_expn(self.db).map(|expansion| {
- let expansion = self.db.lookup_intern_macro_call(expansion.into());
- (parent_ctx.parent(self.db), expansion.def)
- });
- }
+ hygiene_id = HygieneId::new(parent_ctx.opaque_and_semitransparent(self.db));
+ hygiene_info = parent_ctx.outer_expn(self.db).map(|expansion| {
+ let expansion = self.db.lookup_intern_macro_call(expansion.into());
+ (parent_ctx.parent(self.db), expansion.def)
+ });
}
}
_ => {}
diff --git a/crates/hir-def/src/expr_store/lower/asm.rs b/crates/hir-def/src/expr_store/lower/asm.rs
index 3bc4afb..230d1c9 100644
--- a/crates/hir-def/src/expr_store/lower/asm.rs
+++ b/crates/hir-def/src/expr_store/lower/asm.rs
@@ -259,10 +259,10 @@
}
};
- if let Some(operand_idx) = operand_idx {
- if let Some(position_span) = to_span(arg.position_span) {
- mappings.push((position_span, operand_idx));
- }
+ if let Some(operand_idx) = operand_idx
+ && let Some(position_span) = to_span(arg.position_span)
+ {
+ mappings.push((position_span, operand_idx));
}
}
}
diff --git a/crates/hir-def/src/expr_store/lower/path.rs b/crates/hir-def/src/expr_store/lower/path.rs
index be006c9..579465e 100644
--- a/crates/hir-def/src/expr_store/lower/path.rs
+++ b/crates/hir-def/src/expr_store/lower/path.rs
@@ -211,16 +211,17 @@
// Basically, even in rustc it is quite hacky:
// https://github.com/rust-lang/rust/blob/614f273e9388ddd7804d5cbc80b8865068a3744e/src/librustc_resolve/macros.rs#L456
// We follow what it did anyway :)
- if segments.len() == 1 && kind == PathKind::Plain {
- if let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) {
- let syn_ctxt = collector.expander.ctx_for_range(path.segment()?.syntax().text_range());
- if let Some(macro_call_id) = syn_ctxt.outer_expn(collector.db) {
- if collector.db.lookup_intern_macro_call(macro_call_id.into()).def.local_inner {
- kind = match resolve_crate_root(collector.db, syn_ctxt) {
- Some(crate_root) => PathKind::DollarCrate(crate_root),
- None => PathKind::Crate,
- }
- }
+ if segments.len() == 1
+ && kind == PathKind::Plain
+ && let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast)
+ {
+ let syn_ctxt = collector.expander.ctx_for_range(path.segment()?.syntax().text_range());
+ if let Some(macro_call_id) = syn_ctxt.outer_expn(collector.db)
+ && collector.db.lookup_intern_macro_call(macro_call_id.into()).def.local_inner
+ {
+ kind = match resolve_crate_root(collector.db, syn_ctxt) {
+ Some(crate_root) => PathKind::DollarCrate(crate_root),
+ None => PathKind::Crate,
}
}
}
diff --git a/crates/hir-def/src/expr_store/pretty.rs b/crates/hir-def/src/expr_store/pretty.rs
index f1b0113..b81dcc1 100644
--- a/crates/hir-def/src/expr_store/pretty.rs
+++ b/crates/hir-def/src/expr_store/pretty.rs
@@ -900,14 +900,12 @@
let field_name = arg.name.display(self.db, edition).to_string();
let mut same_name = false;
- if let Pat::Bind { id, subpat: None } = &self.store[arg.pat] {
- if let Binding { name, mode: BindingAnnotation::Unannotated, .. } =
+ if let Pat::Bind { id, subpat: None } = &self.store[arg.pat]
+ && let Binding { name, mode: BindingAnnotation::Unannotated, .. } =
&self.store.assert_expr_only().bindings[*id]
- {
- if name.as_str() == field_name {
- same_name = true;
- }
- }
+ && name.as_str() == field_name
+ {
+ same_name = true;
}
w!(p, "{}", field_name);
diff --git a/crates/hir-def/src/find_path.rs b/crates/hir-def/src/find_path.rs
index dccfff0..faa0ef8 100644
--- a/crates/hir-def/src/find_path.rs
+++ b/crates/hir-def/src/find_path.rs
@@ -107,11 +107,11 @@
/// Attempts to find a path to refer to the given `item` visible from the `from` ModuleId
fn find_path_inner(ctx: &FindPathCtx<'_>, item: ItemInNs, max_len: usize) -> Option<ModPath> {
// - if the item is a module, jump straight to module search
- if !ctx.is_std_item {
- if let ItemInNs::Types(ModuleDefId::ModuleId(module_id)) = item {
- return find_path_for_module(ctx, &mut FxHashSet::default(), module_id, true, max_len)
- .map(|choice| choice.path);
- }
+ if !ctx.is_std_item
+ && let ItemInNs::Types(ModuleDefId::ModuleId(module_id)) = item
+ {
+ return find_path_for_module(ctx, &mut FxHashSet::default(), module_id, true, max_len)
+ .map(|choice| choice.path);
}
let may_be_in_scope = match ctx.prefix {
@@ -226,15 +226,15 @@
}
// - if the module can be referenced as self, super or crate, do that
- if let Some(kind) = is_kw_kind_relative_to_from(ctx.from_def_map, module_id, ctx.from) {
- if ctx.prefix != PrefixKind::ByCrate || kind == PathKind::Crate {
- return Some(Choice {
- path: ModPath::from_segments(kind, None),
- path_text_len: path_kind_len(kind),
- stability: Stable,
- prefer_due_to_prelude: false,
- });
- }
+ if let Some(kind) = is_kw_kind_relative_to_from(ctx.from_def_map, module_id, ctx.from)
+ && (ctx.prefix != PrefixKind::ByCrate || kind == PathKind::Crate)
+ {
+ return Some(Choice {
+ path: ModPath::from_segments(kind, None),
+ path_text_len: path_kind_len(kind),
+ stability: Stable,
+ prefer_due_to_prelude: false,
+ });
}
// - if the module is in the prelude, return it by that path
@@ -604,29 +604,29 @@
&def_map[module.local_id]
};
- if let Some((name, vis, declared)) = data.scope.name_of(item) {
- if vis.is_visible_from(db, from) {
- let is_pub_or_explicit = match vis {
- Visibility::Module(_, VisibilityExplicitness::Explicit) => {
- cov_mark::hit!(explicit_private_imports);
- true
- }
- Visibility::Module(_, VisibilityExplicitness::Implicit) => {
- cov_mark::hit!(discount_private_imports);
- false
- }
- Visibility::PubCrate(_) => true,
- Visibility::Public => true,
- };
-
- // Ignore private imports unless they are explicit. these could be used if we are
- // in a submodule of this module, but that's usually not
- // what the user wants; and if this module can import
- // the item and we're a submodule of it, so can we.
- // Also this keeps the cached data smaller.
- if declared || is_pub_or_explicit {
- cb(visited_modules, name, module);
+ if let Some((name, vis, declared)) = data.scope.name_of(item)
+ && vis.is_visible_from(db, from)
+ {
+ let is_pub_or_explicit = match vis {
+ Visibility::Module(_, VisibilityExplicitness::Explicit) => {
+ cov_mark::hit!(explicit_private_imports);
+ true
}
+ Visibility::Module(_, VisibilityExplicitness::Implicit) => {
+ cov_mark::hit!(discount_private_imports);
+ false
+ }
+ Visibility::PubCrate(_) => true,
+ Visibility::Public => true,
+ };
+
+ // Ignore private imports unless they are explicit. these could be used if we are
+ // in a submodule of this module, but that's usually not
+ // what the user wants; and if this module can import
+ // the item and we're a submodule of it, so can we.
+ // Also this keeps the cached data smaller.
+ if declared || is_pub_or_explicit {
+ cb(visited_modules, name, module);
}
}
diff --git a/crates/hir-def/src/item_scope.rs b/crates/hir-def/src/item_scope.rs
index efa4399..8f526d1 100644
--- a/crates/hir-def/src/item_scope.rs
+++ b/crates/hir-def/src/item_scope.rs
@@ -510,12 +510,11 @@
id: AttrId,
idx: usize,
) {
- if let Some(derives) = self.derive_macros.get_mut(&adt) {
- if let Some(DeriveMacroInvocation { derive_call_ids, .. }) =
+ if let Some(derives) = self.derive_macros.get_mut(&adt)
+ && let Some(DeriveMacroInvocation { derive_call_ids, .. }) =
derives.iter_mut().find(|&&mut DeriveMacroInvocation { attr_id, .. }| id == attr_id)
- {
- derive_call_ids[idx] = Some(call);
- }
+ {
+ derive_call_ids[idx] = Some(call);
}
}
diff --git a/crates/hir-def/src/item_tree/lower.rs b/crates/hir-def/src/item_tree/lower.rs
index 5ab61c8..032b287 100644
--- a/crates/hir-def/src/item_tree/lower.rs
+++ b/crates/hir-def/src/item_tree/lower.rs
@@ -83,12 +83,12 @@
.flat_map(|item| self.lower_mod_item(&item))
.collect();
- if let Some(ast::Expr::MacroExpr(tail_macro)) = stmts.expr() {
- if let Some(call) = tail_macro.macro_call() {
- cov_mark::hit!(macro_stmt_with_trailing_macro_expr);
- if let Some(mod_item) = self.lower_mod_item(&call.into()) {
- self.top_level.push(mod_item);
- }
+ if let Some(ast::Expr::MacroExpr(tail_macro)) = stmts.expr()
+ && let Some(call) = tail_macro.macro_call()
+ {
+ cov_mark::hit!(macro_stmt_with_trailing_macro_expr);
+ if let Some(mod_item) = self.lower_mod_item(&call.into()) {
+ self.top_level.push(mod_item);
}
}
@@ -112,12 +112,11 @@
_ => None,
})
.collect();
- if let Some(ast::Expr::MacroExpr(expr)) = block.tail_expr() {
- if let Some(call) = expr.macro_call() {
- if let Some(mod_item) = self.lower_mod_item(&call.into()) {
- self.top_level.push(mod_item);
- }
- }
+ if let Some(ast::Expr::MacroExpr(expr)) = block.tail_expr()
+ && let Some(call) = expr.macro_call()
+ && let Some(mod_item) = self.lower_mod_item(&call.into())
+ {
+ self.top_level.push(mod_item);
}
self.tree.vis.arena = self.visibilities.into_iter().collect();
self.tree.top_level = self.top_level.into_boxed_slice();
diff --git a/crates/hir-def/src/lang_item.rs b/crates/hir-def/src/lang_item.rs
index 7503080..d431f21 100644
--- a/crates/hir-def/src/lang_item.rs
+++ b/crates/hir-def/src/lang_item.rs
@@ -218,10 +218,10 @@
for (_, module_data) in crate_def_map.modules() {
for def in module_data.scope.declarations() {
- if let ModuleDefId::TraitId(trait_) = def {
- if db.attrs(trait_.into()).has_doc_notable_trait() {
- traits.push(trait_);
- }
+ if let ModuleDefId::TraitId(trait_) = def
+ && db.attrs(trait_.into()).has_doc_notable_trait()
+ {
+ traits.push(trait_);
}
}
}
diff --git a/crates/hir-def/src/macro_expansion_tests/mod.rs b/crates/hir-def/src/macro_expansion_tests/mod.rs
index 5e95b061..e8ae499 100644
--- a/crates/hir-def/src/macro_expansion_tests/mod.rs
+++ b/crates/hir-def/src/macro_expansion_tests/mod.rs
@@ -221,46 +221,42 @@
_ => None,
};
- if let Some(src) = src {
- if let Some(file_id) = src.file_id.macro_file() {
- if let MacroKind::Derive
- | MacroKind::DeriveBuiltIn
- | MacroKind::Attr
- | MacroKind::AttrBuiltIn = file_id.kind(&db)
- {
- let call = file_id.call_node(&db);
- let mut show_spans = false;
- let mut show_ctxt = false;
- for comment in
- call.value.children_with_tokens().filter(|it| it.kind() == COMMENT)
- {
- show_spans |= comment.to_string().contains("+spans");
- show_ctxt |= comment.to_string().contains("+syntaxctxt");
- }
- let pp = pretty_print_macro_expansion(
- src.value,
- db.span_map(src.file_id).as_ref(),
- show_spans,
- show_ctxt,
- );
- format_to!(expanded_text, "\n{}", pp)
- }
+ if let Some(src) = src
+ && let Some(file_id) = src.file_id.macro_file()
+ && let MacroKind::Derive
+ | MacroKind::DeriveBuiltIn
+ | MacroKind::Attr
+ | MacroKind::AttrBuiltIn = file_id.kind(&db)
+ {
+ let call = file_id.call_node(&db);
+ let mut show_spans = false;
+ let mut show_ctxt = false;
+ for comment in call.value.children_with_tokens().filter(|it| it.kind() == COMMENT) {
+ show_spans |= comment.to_string().contains("+spans");
+ show_ctxt |= comment.to_string().contains("+syntaxctxt");
}
+ let pp = pretty_print_macro_expansion(
+ src.value,
+ db.span_map(src.file_id).as_ref(),
+ show_spans,
+ show_ctxt,
+ );
+ format_to!(expanded_text, "\n{}", pp)
}
}
for impl_id in def_map[local_id].scope.impls() {
let src = impl_id.lookup(&db).source(&db);
- if let Some(macro_file) = src.file_id.macro_file() {
- if let MacroKind::DeriveBuiltIn | MacroKind::Derive = macro_file.kind(&db) {
- let pp = pretty_print_macro_expansion(
- src.value.syntax().clone(),
- db.span_map(macro_file.into()).as_ref(),
- false,
- false,
- );
- format_to!(expanded_text, "\n{}", pp)
- }
+ if let Some(macro_file) = src.file_id.macro_file()
+ && let MacroKind::DeriveBuiltIn | MacroKind::Derive = macro_file.kind(&db)
+ {
+ let pp = pretty_print_macro_expansion(
+ src.value.syntax().clone(),
+ db.span_map(macro_file.into()).as_ref(),
+ false,
+ false,
+ );
+ format_to!(expanded_text, "\n{}", pp)
}
}
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 0c3274d..267c445 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -261,20 +261,20 @@
// Process other crate-level attributes.
for attr in &*attrs {
- if let Some(cfg) = attr.cfg() {
- if self.cfg_options.check(&cfg) == Some(false) {
- process = false;
- break;
- }
+ if let Some(cfg) = attr.cfg()
+ && self.cfg_options.check(&cfg) == Some(false)
+ {
+ process = false;
+ break;
}
let Some(attr_name) = attr.path.as_ident() else { continue };
match () {
() if *attr_name == sym::recursion_limit => {
- if let Some(limit) = attr.string_value() {
- if let Ok(limit) = limit.as_str().parse() {
- crate_data.recursion_limit = Some(limit);
- }
+ if let Some(limit) = attr.string_value()
+ && let Ok(limit) = limit.as_str().parse()
+ {
+ crate_data.recursion_limit = Some(limit);
}
}
() if *attr_name == sym::crate_type => {
@@ -1188,56 +1188,44 @@
// Multiple globs may import the same item and they may override visibility from
// previously resolved globs. Handle overrides here and leave the rest to
// `ItemScope::push_res_with_import()`.
- if let Some(def) = defs.types {
- if let Some(prev_def) = prev_defs.types {
- if def.def == prev_def.def
- && self.from_glob_import.contains_type(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // This import is being handled here, don't pass it down to
- // `ItemScope::push_res_with_import()`.
- defs.types = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_types(name, def.vis);
- }
- }
+ if let Some(def) = defs.types
+ && let Some(prev_def) = prev_defs.types
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_type(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // This import is being handled here, don't pass it down to
+ // `ItemScope::push_res_with_import()`.
+ defs.types = None;
+ self.def_map.modules[module_id].scope.update_visibility_types(name, def.vis);
}
- if let Some(def) = defs.values {
- if let Some(prev_def) = prev_defs.values {
- if def.def == prev_def.def
- && self.from_glob_import.contains_value(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // See comment above.
- defs.values = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_values(name, def.vis);
- }
- }
+ if let Some(def) = defs.values
+ && let Some(prev_def) = prev_defs.values
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_value(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // See comment above.
+ defs.values = None;
+ self.def_map.modules[module_id].scope.update_visibility_values(name, def.vis);
}
- if let Some(def) = defs.macros {
- if let Some(prev_def) = prev_defs.macros {
- if def.def == prev_def.def
- && self.from_glob_import.contains_macro(module_id, name.clone())
- && def.vis != prev_def.vis
- && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
- {
- changed = true;
- // See comment above.
- defs.macros = None;
- self.def_map.modules[module_id]
- .scope
- .update_visibility_macros(name, def.vis);
- }
- }
+ if let Some(def) = defs.macros
+ && let Some(prev_def) = prev_defs.macros
+ && def.def == prev_def.def
+ && self.from_glob_import.contains_macro(module_id, name.clone())
+ && def.vis != prev_def.vis
+ && def.vis.max(prev_def.vis, &self.def_map) == Some(def.vis)
+ {
+ changed = true;
+ // See comment above.
+ defs.macros = None;
+ self.def_map.modules[module_id].scope.update_visibility_macros(name, def.vis);
}
}
@@ -1392,15 +1380,14 @@
Resolved::Yes
};
- if let Some(ident) = path.as_ident() {
- if let Some(helpers) = self.def_map.derive_helpers_in_scope.get(&ast_id) {
- if helpers.iter().any(|(it, ..)| it == ident) {
- cov_mark::hit!(resolved_derive_helper);
- // Resolved to derive helper. Collect the item's attributes again,
- // starting after the derive helper.
- return recollect_without(self);
- }
- }
+ if let Some(ident) = path.as_ident()
+ && let Some(helpers) = self.def_map.derive_helpers_in_scope.get(&ast_id)
+ && helpers.iter().any(|(it, ..)| it == ident)
+ {
+ cov_mark::hit!(resolved_derive_helper);
+ // Resolved to derive helper. Collect the item's attributes again,
+ // starting after the derive helper.
+ return recollect_without(self);
}
let def = match resolver_def_id(path) {
@@ -1729,12 +1716,12 @@
let mut process_mod_item = |item: ModItemId| {
let attrs = self.item_tree.attrs(db, krate, item.ast_id());
- if let Some(cfg) = attrs.cfg() {
- if !self.is_cfg_enabled(&cfg) {
- let ast_id = item.ast_id().erase();
- self.emit_unconfigured_diagnostic(InFile::new(self.file_id(), ast_id), &cfg);
- return;
- }
+ if let Some(cfg) = attrs.cfg()
+ && !self.is_cfg_enabled(&cfg)
+ {
+ let ast_id = item.ast_id().erase();
+ self.emit_unconfigured_diagnostic(InFile::new(self.file_id(), ast_id), &cfg);
+ return;
}
if let Err(()) = self.resolve_attributes(&attrs, item, container) {
@@ -1871,14 +1858,13 @@
if self.def_collector.def_map.block.is_none()
&& self.def_collector.is_proc_macro
&& self.module_id == DefMap::ROOT
+ && let Some(proc_macro) = attrs.parse_proc_macro_decl(&it.name)
{
- if let Some(proc_macro) = attrs.parse_proc_macro_decl(&it.name) {
- self.def_collector.export_proc_macro(
- proc_macro,
- InFile::new(self.file_id(), id),
- fn_id,
- );
- }
+ self.def_collector.export_proc_macro(
+ proc_macro,
+ InFile::new(self.file_id(), id),
+ fn_id,
+ );
}
update_def(self.def_collector, fn_id.into(), &it.name, vis, false);
@@ -2419,13 +2405,13 @@
macro_id,
&self.item_tree[mac.visibility],
);
- if let Some(helpers) = helpers_opt {
- if self.def_collector.def_map.block.is_none() {
- Arc::get_mut(&mut self.def_collector.def_map.data)
- .unwrap()
- .exported_derives
- .insert(macro_id.into(), helpers);
- }
+ if let Some(helpers) = helpers_opt
+ && self.def_collector.def_map.block.is_none()
+ {
+ Arc::get_mut(&mut self.def_collector.def_map.data)
+ .unwrap()
+ .exported_derives
+ .insert(macro_id.into(), helpers);
}
}
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs
index 316ad5d..a10990e 100644
--- a/crates/hir-def/src/resolver.rs
+++ b/crates/hir-def/src/resolver.rs
@@ -228,15 +228,15 @@
ResolvePathResultPrefixInfo::default(),
));
}
- } else if let &GenericDefId::AdtId(adt) = def {
- if *first_name == sym::Self_ {
- return Some((
- TypeNs::AdtSelfType(adt),
- remaining_idx(),
- None,
- ResolvePathResultPrefixInfo::default(),
- ));
- }
+ } else if let &GenericDefId::AdtId(adt) = def
+ && *first_name == sym::Self_
+ {
+ return Some((
+ TypeNs::AdtSelfType(adt),
+ remaining_idx(),
+ None,
+ ResolvePathResultPrefixInfo::default(),
+ ));
}
if let Some(id) = params.find_type_by_name(first_name, *def) {
return Some((
@@ -401,13 +401,13 @@
handle_macro_def_scope(db, &mut hygiene_id, &mut hygiene_info, macro_id)
}
Scope::GenericParams { params, def } => {
- if let &GenericDefId::ImplId(impl_) = def {
- if *first_name == sym::Self_ {
- return Some((
- ResolveValueResult::ValueNs(ValueNs::ImplSelf(impl_), None),
- ResolvePathResultPrefixInfo::default(),
- ));
- }
+ if let &GenericDefId::ImplId(impl_) = def
+ && *first_name == sym::Self_
+ {
+ return Some((
+ ResolveValueResult::ValueNs(ValueNs::ImplSelf(impl_), None),
+ ResolvePathResultPrefixInfo::default(),
+ ));
}
if let Some(id) = params.find_const_by_name(first_name, *def) {
let val = ValueNs::GenericParam(id);
@@ -436,14 +436,14 @@
ResolvePathResultPrefixInfo::default(),
));
}
- } else if let &GenericDefId::AdtId(adt) = def {
- if *first_name == sym::Self_ {
- let ty = TypeNs::AdtSelfType(adt);
- return Some((
- ResolveValueResult::Partial(ty, 1, None),
- ResolvePathResultPrefixInfo::default(),
- ));
- }
+ } else if let &GenericDefId::AdtId(adt) = def
+ && *first_name == sym::Self_
+ {
+ let ty = TypeNs::AdtSelfType(adt);
+ return Some((
+ ResolveValueResult::Partial(ty, 1, None),
+ ResolvePathResultPrefixInfo::default(),
+ ));
}
if let Some(id) = params.find_type_by_name(first_name, *def) {
let ty = TypeNs::GenericParam(id);
@@ -469,13 +469,14 @@
// If a path of the shape `u16::from_le_bytes` failed to resolve at all, then we fall back
// to resolving to the primitive type, to allow this to still work in the presence of
// `use core::u16;`.
- if path.kind == PathKind::Plain && n_segments > 1 {
- if let Some(builtin) = BuiltinType::by_name(first_name) {
- return Some((
- ResolveValueResult::Partial(TypeNs::BuiltinType(builtin), 1, None),
- ResolvePathResultPrefixInfo::default(),
- ));
- }
+ if path.kind == PathKind::Plain
+ && n_segments > 1
+ && let Some(builtin) = BuiltinType::by_name(first_name)
+ {
+ return Some((
+ ResolveValueResult::Partial(TypeNs::BuiltinType(builtin), 1, None),
+ ResolvePathResultPrefixInfo::default(),
+ ));
}
None
@@ -660,12 +661,11 @@
Scope::BlockScope(m) => traits.extend(m.def_map[m.module_id].scope.traits()),
&Scope::GenericParams { def: GenericDefId::ImplId(impl_), .. } => {
let impl_data = db.impl_signature(impl_);
- if let Some(target_trait) = impl_data.target_trait {
- if let Some(TypeNs::TraitId(trait_)) = self
+ if let Some(target_trait) = impl_data.target_trait
+ && let Some(TypeNs::TraitId(trait_)) = self
.resolve_path_in_type_ns_fully(db, &impl_data.store[target_trait.path])
- {
- traits.insert(trait_);
- }
+ {
+ traits.insert(trait_);
}
}
_ => (),
@@ -918,17 +918,17 @@
hygiene_info: &mut Option<(SyntaxContext, MacroDefId)>,
macro_id: &MacroDefId,
) {
- if let Some((parent_ctx, label_macro_id)) = hygiene_info {
- if label_macro_id == macro_id {
- // A macro is allowed to refer to variables from before its declaration.
- // Therefore, if we got to the rib of its declaration, give up its hygiene
- // and use its parent expansion.
- *hygiene_id = HygieneId::new(parent_ctx.opaque_and_semitransparent(db));
- *hygiene_info = parent_ctx.outer_expn(db).map(|expansion| {
- let expansion = db.lookup_intern_macro_call(expansion.into());
- (parent_ctx.parent(db), expansion.def)
- });
- }
+ if let Some((parent_ctx, label_macro_id)) = hygiene_info
+ && label_macro_id == macro_id
+ {
+ // A macro is allowed to refer to variables from before its declaration.
+ // Therefore, if we got to the rib of its declaration, give up its hygiene
+ // and use its parent expansion.
+ *hygiene_id = HygieneId::new(parent_ctx.opaque_and_semitransparent(db));
+ *hygiene_info = parent_ctx.outer_expn(db).map(|expansion| {
+ let expansion = db.lookup_intern_macro_call(expansion.into());
+ (parent_ctx.parent(db), expansion.def)
+ });
}
}
diff --git a/crates/hir-expand/src/builtin/fn_macro.rs b/crates/hir-expand/src/builtin/fn_macro.rs
index 4a9af01..58ab7f4 100644
--- a/crates/hir-expand/src/builtin/fn_macro.rs
+++ b/crates/hir-expand/src/builtin/fn_macro.rs
@@ -555,12 +555,11 @@
// FIXME: hack on top of a hack: `$e:expr` captures get surrounded in parentheses
// to ensure the right parsing order, so skip the parentheses here. Ideally we'd
// implement rustc's model. cc https://github.com/rust-lang/rust-analyzer/pull/10623
- if let TtElement::Subtree(subtree, subtree_iter) = &t {
- if let [tt::TokenTree::Leaf(tt)] = subtree_iter.remaining().flat_tokens() {
- if subtree.delimiter.kind == tt::DelimiterKind::Parenthesis {
- t = TtElement::Leaf(tt);
- }
- }
+ if let TtElement::Subtree(subtree, subtree_iter) = &t
+ && let [tt::TokenTree::Leaf(tt)] = subtree_iter.remaining().flat_tokens()
+ && subtree.delimiter.kind == tt::DelimiterKind::Parenthesis
+ {
+ t = TtElement::Leaf(tt);
}
match t {
TtElement::Leaf(tt::Leaf::Literal(it)) if i % 2 == 0 => {
diff --git a/crates/hir-expand/src/cfg_process.rs b/crates/hir-expand/src/cfg_process.rs
index c6ea4a3..d5ebd6e 100644
--- a/crates/hir-expand/src/cfg_process.rs
+++ b/crates/hir-expand/src/cfg_process.rs
@@ -334,10 +334,10 @@
_ => Some(CfgExpr::Atom(CfgAtom::Flag(name))),
},
};
- if let Some(NodeOrToken::Token(element)) = iter.peek() {
- if element.kind() == syntax::T![,] {
- iter.next();
- }
+ if let Some(NodeOrToken::Token(element)) = iter.peek()
+ && element.kind() == syntax::T![,]
+ {
+ iter.next();
}
result
}
diff --git a/crates/hir-expand/src/fixup.rs b/crates/hir-expand/src/fixup.rs
index 4a4a3e5..fe77e15 100644
--- a/crates/hir-expand/src/fixup.rs
+++ b/crates/hir-expand/src/fixup.rs
@@ -280,8 +280,8 @@
}
},
ast::RecordExprField(it) => {
- if let Some(colon) = it.colon_token() {
- if it.name_ref().is_some() && it.expr().is_none() {
+ if let Some(colon) = it.colon_token()
+ && it.name_ref().is_some() && it.expr().is_none() {
append.insert(colon.into(), vec![
Leaf::Ident(Ident {
sym: sym::__ra_fixup,
@@ -290,11 +290,10 @@
})
]);
}
- }
},
ast::Path(it) => {
- if let Some(colon) = it.coloncolon_token() {
- if it.segment().is_none() {
+ if let Some(colon) = it.coloncolon_token()
+ && it.segment().is_none() {
append.insert(colon.into(), vec![
Leaf::Ident(Ident {
sym: sym::__ra_fixup,
@@ -303,7 +302,6 @@
})
]);
}
- }
},
ast::ClosureExpr(it) => {
if it.body().is_none() {
diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs
index ac61b22..472ec83 100644
--- a/crates/hir-expand/src/lib.rs
+++ b/crates/hir-expand/src/lib.rs
@@ -365,12 +365,11 @@
HirFileId::FileId(id) => break id,
HirFileId::MacroFile(file) => {
let loc = db.lookup_intern_macro_call(file);
- if loc.def.is_include() {
- if let MacroCallKind::FnLike { eager: Some(eager), .. } = &loc.kind {
- if let Ok(it) = include_input_to_file_id(db, file, &eager.arg) {
- break it;
- }
- }
+ if loc.def.is_include()
+ && let MacroCallKind::FnLike { eager: Some(eager), .. } = &loc.kind
+ && let Ok(it) = include_input_to_file_id(db, file, &eager.arg)
+ {
+ break it;
}
self = loc.kind.file_id();
}
@@ -648,12 +647,11 @@
db: &dyn ExpandDatabase,
macro_call_id: MacroCallId,
) -> Option<EditionedFileId> {
- if self.def.is_include() {
- if let MacroCallKind::FnLike { eager: Some(eager), .. } = &self.kind {
- if let Ok(it) = include_input_to_file_id(db, macro_call_id, &eager.arg) {
- return Some(it);
- }
- }
+ if self.def.is_include()
+ && let MacroCallKind::FnLike { eager: Some(eager), .. } = &self.kind
+ && let Ok(it) = include_input_to_file_id(db, macro_call_id, &eager.arg)
+ {
+ return Some(it);
}
None
diff --git a/crates/hir-expand/src/mod_path.rs b/crates/hir-expand/src/mod_path.rs
index 9f1e387..d84d978 100644
--- a/crates/hir-expand/src/mod_path.rs
+++ b/crates/hir-expand/src/mod_path.rs
@@ -273,16 +273,17 @@
// Basically, even in rustc it is quite hacky:
// https://github.com/rust-lang/rust/blob/614f273e9388ddd7804d5cbc80b8865068a3744e/src/librustc_resolve/macros.rs#L456
// We follow what it did anyway :)
- if mod_path.segments.len() == 1 && mod_path.kind == PathKind::Plain {
- if let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) {
- let syn_ctx = span_for_range(segment.syntax().text_range());
- if let Some(macro_call_id) = syn_ctx.outer_expn(db) {
- if db.lookup_intern_macro_call(macro_call_id.into()).def.local_inner {
- mod_path.kind = match resolve_crate_root(db, syn_ctx) {
- Some(crate_root) => PathKind::DollarCrate(crate_root),
- None => PathKind::Crate,
- }
- }
+ if mod_path.segments.len() == 1
+ && mod_path.kind == PathKind::Plain
+ && let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast)
+ {
+ let syn_ctx = span_for_range(segment.syntax().text_range());
+ if let Some(macro_call_id) = syn_ctx.outer_expn(db)
+ && db.lookup_intern_macro_call(macro_call_id.into()).def.local_inner
+ {
+ mod_path.kind = match resolve_crate_root(db, syn_ctx) {
+ Some(crate_root) => PathKind::DollarCrate(crate_root),
+ None => PathKind::Crate,
}
}
}
diff --git a/crates/hir-ty/src/autoderef.rs b/crates/hir-ty/src/autoderef.rs
index cc8f7bf..26ca7fb 100644
--- a/crates/hir-ty/src/autoderef.rs
+++ b/crates/hir-ty/src/autoderef.rs
@@ -197,10 +197,11 @@
// effectively bump the MSRV of rust-analyzer to 1.84 due to 1.83 and below lacking the
// blanked impl on `Deref`.
#[expect(clippy::overly_complex_bool_expr)]
- if use_receiver_trait && false {
- if let Some(receiver) = LangItem::Receiver.resolve_trait(db, table.trait_env.krate) {
- return Some(receiver);
- }
+ if use_receiver_trait
+ && false
+ && let Some(receiver) = LangItem::Receiver.resolve_trait(db, table.trait_env.krate)
+ {
+ return Some(receiver);
}
// Old rustc versions might not have `Receiver` trait.
// Fallback to `Deref` if they don't
diff --git a/crates/hir-ty/src/builder.rs b/crates/hir-ty/src/builder.rs
index 77d15a7..8af8fb7 100644
--- a/crates/hir-ty/src/builder.rs
+++ b/crates/hir-ty/src/builder.rs
@@ -309,11 +309,11 @@
if let Some(defaults) = defaults.get(self.vec.len()..) {
for default_ty in defaults {
// NOTE(skip_binders): we only check if the arg type is error type.
- if let Some(x) = default_ty.skip_binders().ty(Interner) {
- if x.is_unknown() {
- self.vec.push(fallback().cast(Interner));
- continue;
- }
+ if let Some(x) = default_ty.skip_binders().ty(Interner)
+ && x.is_unknown()
+ {
+ self.vec.push(fallback().cast(Interner));
+ continue;
}
// Each default can only depend on the previous parameters.
self.vec.push(default_ty.clone().substitute(Interner, &*self.vec).cast(Interner));
diff --git a/crates/hir-ty/src/chalk_db.rs b/crates/hir-ty/src/chalk_db.rs
index 26b6352..3ba7c93 100644
--- a/crates/hir-ty/src/chalk_db.rs
+++ b/crates/hir-ty/src/chalk_db.rs
@@ -83,34 +83,34 @@
Arc::new(rust_ir::AdtRepr { c: false, packed: false, int: None })
}
fn discriminant_type(&self, ty: chalk_ir::Ty<Interner>) -> chalk_ir::Ty<Interner> {
- if let chalk_ir::TyKind::Adt(id, _) = ty.kind(Interner) {
- if let hir_def::AdtId::EnumId(e) = id.0 {
- let enum_data = self.db.enum_signature(e);
- let ty = enum_data.repr.unwrap_or_default().discr_type();
- return chalk_ir::TyKind::Scalar(match ty {
- hir_def::layout::IntegerType::Pointer(is_signed) => match is_signed {
- true => chalk_ir::Scalar::Int(chalk_ir::IntTy::Isize),
- false => chalk_ir::Scalar::Uint(chalk_ir::UintTy::Usize),
- },
- hir_def::layout::IntegerType::Fixed(size, is_signed) => match is_signed {
- true => chalk_ir::Scalar::Int(match size {
- hir_def::layout::Integer::I8 => chalk_ir::IntTy::I8,
- hir_def::layout::Integer::I16 => chalk_ir::IntTy::I16,
- hir_def::layout::Integer::I32 => chalk_ir::IntTy::I32,
- hir_def::layout::Integer::I64 => chalk_ir::IntTy::I64,
- hir_def::layout::Integer::I128 => chalk_ir::IntTy::I128,
- }),
- false => chalk_ir::Scalar::Uint(match size {
- hir_def::layout::Integer::I8 => chalk_ir::UintTy::U8,
- hir_def::layout::Integer::I16 => chalk_ir::UintTy::U16,
- hir_def::layout::Integer::I32 => chalk_ir::UintTy::U32,
- hir_def::layout::Integer::I64 => chalk_ir::UintTy::U64,
- hir_def::layout::Integer::I128 => chalk_ir::UintTy::U128,
- }),
- },
- })
- .intern(Interner);
- }
+ if let chalk_ir::TyKind::Adt(id, _) = ty.kind(Interner)
+ && let hir_def::AdtId::EnumId(e) = id.0
+ {
+ let enum_data = self.db.enum_signature(e);
+ let ty = enum_data.repr.unwrap_or_default().discr_type();
+ return chalk_ir::TyKind::Scalar(match ty {
+ hir_def::layout::IntegerType::Pointer(is_signed) => match is_signed {
+ true => chalk_ir::Scalar::Int(chalk_ir::IntTy::Isize),
+ false => chalk_ir::Scalar::Uint(chalk_ir::UintTy::Usize),
+ },
+ hir_def::layout::IntegerType::Fixed(size, is_signed) => match is_signed {
+ true => chalk_ir::Scalar::Int(match size {
+ hir_def::layout::Integer::I8 => chalk_ir::IntTy::I8,
+ hir_def::layout::Integer::I16 => chalk_ir::IntTy::I16,
+ hir_def::layout::Integer::I32 => chalk_ir::IntTy::I32,
+ hir_def::layout::Integer::I64 => chalk_ir::IntTy::I64,
+ hir_def::layout::Integer::I128 => chalk_ir::IntTy::I128,
+ }),
+ false => chalk_ir::Scalar::Uint(match size {
+ hir_def::layout::Integer::I8 => chalk_ir::UintTy::U8,
+ hir_def::layout::Integer::I16 => chalk_ir::UintTy::U16,
+ hir_def::layout::Integer::I32 => chalk_ir::UintTy::U32,
+ hir_def::layout::Integer::I64 => chalk_ir::UintTy::U64,
+ hir_def::layout::Integer::I128 => chalk_ir::UintTy::U128,
+ }),
+ },
+ })
+ .intern(Interner);
}
chalk_ir::TyKind::Scalar(chalk_ir::Scalar::Uint(chalk_ir::UintTy::U8)).intern(Interner)
}
@@ -142,10 +142,10 @@
) -> Option<chalk_ir::TyVariableKind> {
if let TyKind::BoundVar(bv) = ty.kind(Interner) {
let binders = binders.as_slice(Interner);
- if bv.debruijn == DebruijnIndex::INNERMOST {
- if let chalk_ir::VariableKind::Ty(tk) = binders[bv.index].kind {
- return Some(tk);
- }
+ if bv.debruijn == DebruijnIndex::INNERMOST
+ && let chalk_ir::VariableKind::Ty(tk) = binders[bv.index].kind
+ {
+ return Some(tk);
}
}
None
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs
index 14b9cd2..f30ec83 100644
--- a/crates/hir-ty/src/consteval.rs
+++ b/crates/hir-ty/src/consteval.rs
@@ -342,10 +342,10 @@
return c;
}
}
- if let Ok(mir_body) = lower_to_mir(ctx.db, ctx.owner, ctx.body, &infer, expr) {
- if let Ok((Ok(result), _)) = interpret_mir(db, Arc::new(mir_body), true, None) {
- return result;
- }
+ if let Ok(mir_body) = lower_to_mir(ctx.db, ctx.owner, ctx.body, &infer, expr)
+ && let Ok((Ok(result), _)) = interpret_mir(db, Arc::new(mir_body), true, None)
+ {
+ return result;
}
unknown_const(infer[expr].clone())
}
diff --git a/crates/hir-ty/src/diagnostics/decl_check.rs b/crates/hir-ty/src/diagnostics/decl_check.rs
index 40fe307..0815e62 100644
--- a/crates/hir-ty/src/diagnostics/decl_check.rs
+++ b/crates/hir-ty/src/diagnostics/decl_check.rs
@@ -657,10 +657,10 @@
}
fn is_trait_impl_container(&self, container_id: ItemContainerId) -> bool {
- if let ItemContainerId::ImplId(impl_id) = container_id {
- if self.db.impl_trait(impl_id).is_some() {
- return true;
- }
+ if let ItemContainerId::ImplId(impl_id) = container_id
+ && self.db.impl_trait(impl_id).is_some()
+ {
+ return true;
}
false
}
diff --git a/crates/hir-ty/src/diagnostics/expr.rs b/crates/hir-ty/src/diagnostics/expr.rs
index cc531f0..b26bd2b 100644
--- a/crates/hir-ty/src/diagnostics/expr.rs
+++ b/crates/hir-ty/src/diagnostics/expr.rs
@@ -528,15 +528,15 @@
return None;
}
- if *function_id == self.next_function_id? {
- if let Some(prev_filter_map_expr_id) = self.prev_filter_map_expr_id {
- let is_dyn_trait = self
- .prev_receiver_ty
- .as_ref()
- .is_some_and(|it| it.strip_references().dyn_trait().is_some());
- if *receiver_expr_id == prev_filter_map_expr_id && !is_dyn_trait {
- return Some(());
- }
+ if *function_id == self.next_function_id?
+ && let Some(prev_filter_map_expr_id) = self.prev_filter_map_expr_id
+ {
+ let is_dyn_trait = self
+ .prev_receiver_ty
+ .as_ref()
+ .is_some_and(|it| it.strip_references().dyn_trait().is_some());
+ if *receiver_expr_id == prev_filter_map_expr_id && !is_dyn_trait {
+ return Some(());
}
}
diff --git a/crates/hir-ty/src/diagnostics/match_check.rs b/crates/hir-ty/src/diagnostics/match_check.rs
index ca132fb..e803b56 100644
--- a/crates/hir-ty/src/diagnostics/match_check.rs
+++ b/crates/hir-ty/src/diagnostics/match_check.rs
@@ -382,10 +382,10 @@
let subpats = (0..num_fields).map(|i| {
WriteWith(move |f| {
let fid = LocalFieldId::from_raw((i as u32).into());
- if let Some(p) = subpatterns.get(i) {
- if p.field == fid {
- return p.pattern.hir_fmt(f);
- }
+ if let Some(p) = subpatterns.get(i)
+ && p.field == fid
+ {
+ return p.pattern.hir_fmt(f);
}
if let Some(p) = subpatterns.iter().find(|p| p.field == fid) {
p.pattern.hir_fmt(f)
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs
index f6ad3c7..827585e 100644
--- a/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -272,10 +272,10 @@
if let Some(func) = callee.as_fn_def(self.db) {
self.check_call(current, func);
}
- if let TyKind::Function(fn_ptr) = callee.kind(Interner) {
- if fn_ptr.sig.safety == chalk_ir::Safety::Unsafe {
- self.on_unsafe_op(current.into(), UnsafetyReason::UnsafeFnCall);
- }
+ if let TyKind::Function(fn_ptr) = callee.kind(Interner)
+ && fn_ptr.sig.safety == chalk_ir::Safety::Unsafe
+ {
+ self.on_unsafe_op(current.into(), UnsafetyReason::UnsafeFnCall);
}
}
Expr::Path(path) => {
@@ -346,12 +346,11 @@
Expr::Cast { .. } => self.inside_assignment = inside_assignment,
Expr::Field { .. } => {
self.inside_assignment = inside_assignment;
- if !inside_assignment {
- if let Some(Either::Left(FieldId { parent: VariantId::UnionId(_), .. })) =
+ if !inside_assignment
+ && let Some(Either::Left(FieldId { parent: VariantId::UnionId(_), .. })) =
self.infer.field_resolution(current)
- {
- self.on_unsafe_op(current.into(), UnsafetyReason::UnionField);
- }
+ {
+ self.on_unsafe_op(current.into(), UnsafetyReason::UnionField);
}
}
Expr::Unsafe { statements, .. } => {
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index f0e31eb..8f35a3c 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -608,48 +608,46 @@
// if we are projection on a type parameter, check if the projection target has bounds
// itself, if so, we render them directly as `impl Bound` instead of the less useful
// `<Param as Trait>::Assoc`
- if !f.display_kind.is_source_code() {
- if let TyKind::Placeholder(idx) = self_ty.kind(Interner) {
- if !f.bounds_formatting_ctx.contains(self) {
- let db = f.db;
- let id = from_placeholder_idx(db, *idx);
- let generics = generics(db, id.parent);
+ if !f.display_kind.is_source_code()
+ && let TyKind::Placeholder(idx) = self_ty.kind(Interner)
+ && !f.bounds_formatting_ctx.contains(self)
+ {
+ let db = f.db;
+ let id = from_placeholder_idx(db, *idx);
+ let generics = generics(db, id.parent);
- let substs = generics.placeholder_subst(db);
- let bounds = db
- .generic_predicates(id.parent)
- .iter()
- .map(|pred| pred.clone().substitute(Interner, &substs))
- .filter(|wc| {
- let ty = match wc.skip_binders() {
- WhereClause::Implemented(tr) => tr.self_type_parameter(Interner),
- WhereClause::TypeOutlives(t) => t.ty.clone(),
- // We shouldn't be here if these exist
- WhereClause::AliasEq(_) | WhereClause::LifetimeOutlives(_) => {
- return false;
- }
- };
- let TyKind::Alias(AliasTy::Projection(proj)) = ty.kind(Interner) else {
- return false;
- };
- proj == self
- })
- .collect::<Vec<_>>();
- if !bounds.is_empty() {
- return f.format_bounds_with(self.clone(), |f| {
- write_bounds_like_dyn_trait_with_prefix(
- f,
- "impl",
- Either::Left(
- &TyKind::Alias(AliasTy::Projection(self.clone()))
- .intern(Interner),
- ),
- &bounds,
- SizedByDefault::NotSized,
- )
- });
- }
- }
+ let substs = generics.placeholder_subst(db);
+ let bounds = db
+ .generic_predicates(id.parent)
+ .iter()
+ .map(|pred| pred.clone().substitute(Interner, &substs))
+ .filter(|wc| {
+ let ty = match wc.skip_binders() {
+ WhereClause::Implemented(tr) => tr.self_type_parameter(Interner),
+ WhereClause::TypeOutlives(t) => t.ty.clone(),
+ // We shouldn't be here if these exist
+ WhereClause::AliasEq(_) | WhereClause::LifetimeOutlives(_) => {
+ return false;
+ }
+ };
+ let TyKind::Alias(AliasTy::Projection(proj)) = ty.kind(Interner) else {
+ return false;
+ };
+ proj == self
+ })
+ .collect::<Vec<_>>();
+ if !bounds.is_empty() {
+ return f.format_bounds_with(self.clone(), |f| {
+ write_bounds_like_dyn_trait_with_prefix(
+ f,
+ "impl",
+ Either::Left(
+ &TyKind::Alias(AliasTy::Projection(self.clone())).intern(Interner),
+ ),
+ &bounds,
+ SizedByDefault::NotSized,
+ )
+ });
}
}
@@ -1860,18 +1858,13 @@
write!(f, "{}", f.db.trait_signature(trait_).name.display(f.db, f.edition()))?;
f.end_location_link();
if is_fn_trait {
- if let [self_, params @ ..] = trait_ref.substitution.as_slice(Interner) {
- if let Some(args) =
+ if let [self_, params @ ..] = trait_ref.substitution.as_slice(Interner)
+ && let Some(args) =
params.first().and_then(|it| it.assert_ty_ref(Interner).as_tuple())
- {
- write!(f, "(")?;
- hir_fmt_generic_arguments(
- f,
- args.as_slice(Interner),
- self_.ty(Interner),
- )?;
- write!(f, ")")?;
- }
+ {
+ write!(f, "(")?;
+ hir_fmt_generic_arguments(f, args.as_slice(Interner), self_.ty(Interner))?;
+ write!(f, ")")?;
}
} else {
let params = generic_args_sans_defaults(
@@ -1879,13 +1872,13 @@
Some(trait_.into()),
trait_ref.substitution.as_slice(Interner),
);
- if let [self_, params @ ..] = params {
- if !params.is_empty() {
- write!(f, "<")?;
- hir_fmt_generic_arguments(f, params, self_.ty(Interner))?;
- // there might be assoc type bindings, so we leave the angle brackets open
- angle_open = true;
- }
+ if let [self_, params @ ..] = params
+ && !params.is_empty()
+ {
+ write!(f, "<")?;
+ hir_fmt_generic_arguments(f, params, self_.ty(Interner))?;
+ // there might be assoc type bindings, so we leave the angle brackets open
+ angle_open = true;
}
}
}
@@ -2443,11 +2436,11 @@
generic_args.args[0].hir_fmt(f, store)?;
}
}
- if let Some(ret) = generic_args.bindings[0].type_ref {
- if !matches!(&store[ret], TypeRef::Tuple(v) if v.is_empty()) {
- write!(f, " -> ")?;
- ret.hir_fmt(f, store)?;
- }
+ if let Some(ret) = generic_args.bindings[0].type_ref
+ && !matches!(&store[ret], TypeRef::Tuple(v) if v.is_empty())
+ {
+ write!(f, " -> ")?;
+ ret.hir_fmt(f, store)?;
}
}
hir_def::expr_store::path::GenericArgsParentheses::No => {
diff --git a/crates/hir-ty/src/dyn_compatibility.rs b/crates/hir-ty/src/dyn_compatibility.rs
index 30949c8..6294d68 100644
--- a/crates/hir-ty/src/dyn_compatibility.rs
+++ b/crates/hir-ty/src/dyn_compatibility.rs
@@ -136,16 +136,15 @@
let predicates = predicates.iter().map(|p| p.skip_binders().skip_binders().clone());
elaborate_clause_supertraits(db, predicates).any(|pred| match pred {
WhereClause::Implemented(trait_ref) => {
- if from_chalk_trait_id(trait_ref.trait_id) == sized {
- if let TyKind::BoundVar(it) =
+ if from_chalk_trait_id(trait_ref.trait_id) == sized
+ && let TyKind::BoundVar(it) =
*trait_ref.self_type_parameter(Interner).kind(Interner)
- {
- // Since `generic_predicates` is `Binder<Binder<..>>`, the `DebrujinIndex` of
- // self-parameter is `1`
- return it
- .index_if_bound_at(DebruijnIndex::ONE)
- .is_some_and(|idx| idx == trait_self_param_idx);
- }
+ {
+ // Since `generic_predicates` is `Binder<Binder<..>>`, the `DebrujinIndex` of
+ // self-parameter is `1`
+ return it
+ .index_if_bound_at(DebruijnIndex::ONE)
+ .is_some_and(|idx| idx == trait_self_param_idx);
}
false
}
@@ -401,10 +400,10 @@
cb(MethodViolationCode::ReferencesSelfOutput)?;
}
- if !func_data.is_async() {
- if let Some(mvc) = contains_illegal_impl_trait_in_trait(db, &sig) {
- cb(mvc)?;
- }
+ if !func_data.is_async()
+ && let Some(mvc) = contains_illegal_impl_trait_in_trait(db, &sig)
+ {
+ cb(mvc)?;
}
let generic_params = db.generic_params(func.into());
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs
index 7c39afa..86345b2 100644
--- a/crates/hir-ty/src/infer.rs
+++ b/crates/hir-ty/src/infer.rs
@@ -902,12 +902,12 @@
return false;
}
- if let UnresolvedMethodCall { field_with_same_name, .. } = diagnostic {
- if let Some(ty) = field_with_same_name {
- *ty = table.resolve_completely(ty.clone());
- if ty.contains_unknown() {
- *field_with_same_name = None;
- }
+ if let UnresolvedMethodCall { field_with_same_name, .. } = diagnostic
+ && let Some(ty) = field_with_same_name
+ {
+ *ty = table.resolve_completely(ty.clone());
+ if ty.contains_unknown() {
+ *field_with_same_name = None;
}
}
}
@@ -1010,12 +1010,12 @@
param_tys.push(va_list_ty);
}
let mut param_tys = param_tys.into_iter().chain(iter::repeat(self.table.new_type_var()));
- if let Some(self_param) = self.body.self_param {
- if let Some(ty) = param_tys.next() {
- let ty = self.insert_type_vars(ty);
- let ty = self.normalize_associated_types_in(ty);
- self.write_binding_ty(self_param, ty);
- }
+ if let Some(self_param) = self.body.self_param
+ && let Some(ty) = param_tys.next()
+ {
+ let ty = self.insert_type_vars(ty);
+ let ty = self.normalize_associated_types_in(ty);
+ self.write_binding_ty(self_param, ty);
}
let mut tait_candidates = FxHashSet::default();
for (ty, pat) in param_tys.zip(&*self.body.params) {
@@ -1199,20 +1199,19 @@
) -> std::ops::ControlFlow<Self::BreakTy> {
let ty = self.table.resolve_ty_shallow(ty);
- if let TyKind::OpaqueType(id, _) = ty.kind(Interner) {
- if let ImplTraitId::TypeAliasImplTrait(alias_id, _) =
+ if let TyKind::OpaqueType(id, _) = ty.kind(Interner)
+ && let ImplTraitId::TypeAliasImplTrait(alias_id, _) =
self.db.lookup_intern_impl_trait_id((*id).into())
- {
- let loc = self.db.lookup_intern_type_alias(alias_id);
- match loc.container {
- ItemContainerId::ImplId(impl_id) => {
- self.assocs.insert(*id, (impl_id, ty.clone()));
- }
- ItemContainerId::ModuleId(..) | ItemContainerId::ExternBlockId(..) => {
- self.non_assocs.insert(*id, ty.clone());
- }
- _ => {}
+ {
+ let loc = self.db.lookup_intern_type_alias(alias_id);
+ match loc.container {
+ ItemContainerId::ImplId(impl_id) => {
+ self.assocs.insert(*id, (impl_id, ty.clone()));
}
+ ItemContainerId::ModuleId(..) | ItemContainerId::ExternBlockId(..) => {
+ self.non_assocs.insert(*id, ty.clone());
+ }
+ _ => {}
}
}
diff --git a/crates/hir-ty/src/infer/cast.rs b/crates/hir-ty/src/infer/cast.rs
index 4e95eca..f0a4167 100644
--- a/crates/hir-ty/src/infer/cast.rs
+++ b/crates/hir-ty/src/infer/cast.rs
@@ -233,26 +233,25 @@
F: FnMut(ExprId, Vec<Adjustment>),
{
// Mutability order is opposite to rustc. `Mut < Not`
- if m_expr <= m_cast {
- if let TyKind::Array(ety, _) = t_expr.kind(Interner) {
- // Coerce to a raw pointer so that we generate RawPtr in MIR.
- let array_ptr_type = TyKind::Raw(m_expr, t_expr.clone()).intern(Interner);
- if let Ok((adj, _)) = table.coerce(&self.expr_ty, &array_ptr_type, CoerceNever::Yes)
- {
- apply_adjustments(self.source_expr, adj);
- } else {
- never!(
- "could not cast from reference to array to pointer to array ({:?} to {:?})",
- self.expr_ty,
- array_ptr_type
- );
- }
+ if m_expr <= m_cast
+ && let TyKind::Array(ety, _) = t_expr.kind(Interner)
+ {
+ // Coerce to a raw pointer so that we generate RawPtr in MIR.
+ let array_ptr_type = TyKind::Raw(m_expr, t_expr.clone()).intern(Interner);
+ if let Ok((adj, _)) = table.coerce(&self.expr_ty, &array_ptr_type, CoerceNever::Yes) {
+ apply_adjustments(self.source_expr, adj);
+ } else {
+ never!(
+ "could not cast from reference to array to pointer to array ({:?} to {:?})",
+ self.expr_ty,
+ array_ptr_type
+ );
+ }
- // This is a less strict condition than rustc's `demand_eqtype`,
- // but false negative is better than false positive
- if table.coerce(ety, t_cast, CoerceNever::Yes).is_ok() {
- return Ok(());
- }
+ // This is a less strict condition than rustc's `demand_eqtype`,
+ // but false negative is better than false positive
+ if table.coerce(ety, t_cast, CoerceNever::Yes).is_ok() {
+ return Ok(());
}
}
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs
index c3029bf..8024c1a 100644
--- a/crates/hir-ty/src/infer/closure.rs
+++ b/crates/hir-ty/src/infer/closure.rs
@@ -176,12 +176,12 @@
}
// Deduction based on the expected `dyn Fn` is done separately.
- if let TyKind::Dyn(dyn_ty) = expected_ty.kind(Interner) {
- if let Some(sig) = self.deduce_sig_from_dyn_ty(dyn_ty) {
- let expected_sig_ty = TyKind::Function(sig).intern(Interner);
+ if let TyKind::Dyn(dyn_ty) = expected_ty.kind(Interner)
+ && let Some(sig) = self.deduce_sig_from_dyn_ty(dyn_ty)
+ {
+ let expected_sig_ty = TyKind::Function(sig).intern(Interner);
- self.unify(sig_ty, &expected_sig_ty);
- }
+ self.unify(sig_ty, &expected_sig_ty);
}
}
@@ -208,14 +208,13 @@
alias: AliasTy::Projection(projection_ty),
ty: projected_ty,
}) = bound.skip_binders()
- {
- if let Some(sig) = self.deduce_sig_from_projection(
+ && let Some(sig) = self.deduce_sig_from_projection(
closure_kind,
projection_ty,
projected_ty,
- ) {
- return Some(sig);
- }
+ )
+ {
+ return Some(sig);
}
None
});
@@ -254,55 +253,44 @@
let mut expected_kind = None;
for clause in elaborate_clause_supertraits(self.db, clauses.rev()) {
- if expected_sig.is_none() {
- if let WhereClause::AliasEq(AliasEq {
- alias: AliasTy::Projection(projection),
- ty,
- }) = &clause
- {
- let inferred_sig =
- self.deduce_sig_from_projection(closure_kind, projection, ty);
- // Make sure that we didn't infer a signature that mentions itself.
- // This can happen when we elaborate certain supertrait bounds that
- // mention projections containing the `Self` type. See rust-lang/rust#105401.
- struct MentionsTy<'a> {
- expected_ty: &'a Ty,
+ if expected_sig.is_none()
+ && let WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(projection), ty }) =
+ &clause
+ {
+ let inferred_sig = self.deduce_sig_from_projection(closure_kind, projection, ty);
+ // Make sure that we didn't infer a signature that mentions itself.
+ // This can happen when we elaborate certain supertrait bounds that
+ // mention projections containing the `Self` type. See rust-lang/rust#105401.
+ struct MentionsTy<'a> {
+ expected_ty: &'a Ty,
+ }
+ impl TypeVisitor<Interner> for MentionsTy<'_> {
+ type BreakTy = ();
+
+ fn interner(&self) -> Interner {
+ Interner
}
- impl TypeVisitor<Interner> for MentionsTy<'_> {
- type BreakTy = ();
- fn interner(&self) -> Interner {
- Interner
- }
-
- fn as_dyn(
- &mut self,
- ) -> &mut dyn TypeVisitor<Interner, BreakTy = Self::BreakTy>
- {
- self
- }
-
- fn visit_ty(
- &mut self,
- t: &Ty,
- db: chalk_ir::DebruijnIndex,
- ) -> ControlFlow<()> {
- if t == self.expected_ty {
- ControlFlow::Break(())
- } else {
- t.super_visit_with(self, db)
- }
- }
- }
- if inferred_sig
- .visit_with(
- &mut MentionsTy { expected_ty },
- chalk_ir::DebruijnIndex::INNERMOST,
- )
- .is_continue()
+ fn as_dyn(
+ &mut self,
+ ) -> &mut dyn TypeVisitor<Interner, BreakTy = Self::BreakTy>
{
- expected_sig = inferred_sig;
+ self
}
+
+ fn visit_ty(&mut self, t: &Ty, db: chalk_ir::DebruijnIndex) -> ControlFlow<()> {
+ if t == self.expected_ty {
+ ControlFlow::Break(())
+ } else {
+ t.super_visit_with(self, db)
+ }
+ }
+ }
+ if inferred_sig
+ .visit_with(&mut MentionsTy { expected_ty }, chalk_ir::DebruijnIndex::INNERMOST)
+ .is_continue()
+ {
+ expected_sig = inferred_sig;
}
}
@@ -617,11 +605,10 @@
if let CaptureKind::ByRef(BorrowKind::Mut {
kind: MutBorrowKind::Default | MutBorrowKind::TwoPhasedBorrow,
}) = current_capture
+ && self.projections[len..].contains(&ProjectionElem::Deref)
{
- if self.projections[len..].contains(&ProjectionElem::Deref) {
- current_capture =
- CaptureKind::ByRef(BorrowKind::Mut { kind: MutBorrowKind::ClosureCapture });
- }
+ current_capture =
+ CaptureKind::ByRef(BorrowKind::Mut { kind: MutBorrowKind::ClosureCapture });
}
current_capture
}
@@ -1076,12 +1063,11 @@
Mutability::Mut => CaptureKind::ByRef(BorrowKind::Mut { kind: MutBorrowKind::Default }),
Mutability::Not => CaptureKind::ByRef(BorrowKind::Shared),
};
- if let Some(place) = self.place_of_expr_without_adjust(tgt_expr) {
- if let Some(place) =
+ if let Some(place) = self.place_of_expr_without_adjust(tgt_expr)
+ && let Some(place) =
apply_adjusts_to_place(&mut self.current_capture_span_stack, place, rest)
- {
- self.add_capture(place, capture_kind);
- }
+ {
+ self.add_capture(place, capture_kind);
}
self.walk_expr_with_adjust(tgt_expr, rest);
}
@@ -1169,15 +1155,15 @@
}
}
self.walk_expr(*expr);
- if let Some(discr_place) = self.place_of_expr(*expr) {
- if self.is_upvar(&discr_place) {
- let mut capture_mode = None;
- for arm in arms.iter() {
- self.walk_pat(&mut capture_mode, arm.pat);
- }
- if let Some(c) = capture_mode {
- self.push_capture(discr_place, c);
- }
+ if let Some(discr_place) = self.place_of_expr(*expr)
+ && self.is_upvar(&discr_place)
+ {
+ let mut capture_mode = None;
+ for arm in arms.iter() {
+ self.walk_pat(&mut capture_mode, arm.pat);
+ }
+ if let Some(c) = capture_mode {
+ self.push_capture(discr_place, c);
}
}
}
@@ -1209,13 +1195,11 @@
let mutability = 'b: {
if let Some(deref_trait) =
self.resolve_lang_item(LangItem::DerefMut).and_then(|it| it.as_trait())
- {
- if let Some(deref_fn) = deref_trait
+ && let Some(deref_fn) = deref_trait
.trait_items(self.db)
.method_by_name(&Name::new_symbol_root(sym::deref_mut))
- {
- break 'b deref_fn == f;
- }
+ {
+ break 'b deref_fn == f;
}
false
};
@@ -1405,10 +1389,10 @@
fn expr_ty_after_adjustments(&self, e: ExprId) -> Ty {
let mut ty = None;
- if let Some(it) = self.result.expr_adjustments.get(&e) {
- if let Some(it) = it.last() {
- ty = Some(it.target.clone());
- }
+ if let Some(it) = self.result.expr_adjustments.get(&e)
+ && let Some(it) = it.last()
+ {
+ ty = Some(it.target.clone());
}
ty.unwrap_or_else(|| self.expr_ty(e))
}
@@ -1793,10 +1777,10 @@
}
pub(super) fn add_current_closure_dependency(&mut self, dep: ClosureId) {
- if let Some(c) = self.current_closure {
- if !dep_creates_cycle(&self.closure_dependencies, &mut FxHashSet::default(), c, dep) {
- self.closure_dependencies.entry(c).or_default().push(dep);
- }
+ if let Some(c) = self.current_closure
+ && !dep_creates_cycle(&self.closure_dependencies, &mut FxHashSet::default(), c, dep)
+ {
+ self.closure_dependencies.entry(c).or_default().push(dep);
}
fn dep_creates_cycle(
diff --git a/crates/hir-ty/src/infer/coerce.rs b/crates/hir-ty/src/infer/coerce.rs
index 39bd908..761a256 100644
--- a/crates/hir-ty/src/infer/coerce.rs
+++ b/crates/hir-ty/src/infer/coerce.rs
@@ -164,14 +164,14 @@
// - [Comment from rustc](https://github.com/rust-lang/rust/blob/5ff18d0eaefd1bd9ab8ec33dab2404a44e7631ed/compiler/rustc_hir_typeck/src/coercion.rs#L1334-L1335)
// First try to coerce the new expression to the type of the previous ones,
// but only if the new expression has no coercion already applied to it.
- if expr.is_none_or(|expr| !ctx.result.expr_adjustments.contains_key(&expr)) {
- if let Ok(res) = ctx.coerce(expr, &expr_ty, &self.merged_ty(), CoerceNever::Yes) {
- self.final_ty = Some(res);
- if let Some(expr) = expr {
- self.expressions.push(expr);
- }
- return;
+ if expr.is_none_or(|expr| !ctx.result.expr_adjustments.contains_key(&expr))
+ && let Ok(res) = ctx.coerce(expr, &expr_ty, &self.merged_ty(), CoerceNever::Yes)
+ {
+ self.final_ty = Some(res);
+ if let Some(expr) = expr {
+ self.expressions.push(expr);
}
+ return;
}
if let Ok((adjustments, res)) =
@@ -322,18 +322,13 @@
// If we are coercing into a TAIT, coerce into its proxy inference var, instead.
let mut to_ty = to_ty;
let _to;
- if let Some(tait_table) = &self.tait_coercion_table {
- if let TyKind::OpaqueType(opaque_ty_id, _) = to_ty.kind(Interner) {
- if !matches!(
- from_ty.kind(Interner),
- TyKind::InferenceVar(..) | TyKind::OpaqueType(..)
- ) {
- if let Some(ty) = tait_table.get(opaque_ty_id) {
- _to = ty.clone();
- to_ty = &_to;
- }
- }
- }
+ if let Some(tait_table) = &self.tait_coercion_table
+ && let TyKind::OpaqueType(opaque_ty_id, _) = to_ty.kind(Interner)
+ && !matches!(from_ty.kind(Interner), TyKind::InferenceVar(..) | TyKind::OpaqueType(..))
+ && let Some(ty) = tait_table.get(opaque_ty_id)
+ {
+ _to = ty.clone();
+ to_ty = &_to;
}
// Consider coercing the subtype to a DST
@@ -594,14 +589,13 @@
F: FnOnce(Ty) -> Vec<Adjustment>,
G: FnOnce(Ty) -> Vec<Adjustment>,
{
- if let TyKind::Function(to_fn_ptr) = to_ty.kind(Interner) {
- if let (chalk_ir::Safety::Safe, chalk_ir::Safety::Unsafe) =
+ if let TyKind::Function(to_fn_ptr) = to_ty.kind(Interner)
+ && let (chalk_ir::Safety::Safe, chalk_ir::Safety::Unsafe) =
(from_fn_ptr.sig.safety, to_fn_ptr.sig.safety)
- {
- let from_unsafe =
- TyKind::Function(safe_to_unsafe_fn_ty(from_fn_ptr.clone())).intern(Interner);
- return self.unify_and(&from_unsafe, to_ty, to_unsafe);
- }
+ {
+ let from_unsafe =
+ TyKind::Function(safe_to_unsafe_fn_ty(from_fn_ptr.clone())).intern(Interner);
+ return self.unify_and(&from_unsafe, to_ty, to_unsafe);
}
self.unify_and(&from_ty, to_ty, normal)
}
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index d43c99f..16fc2bf 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -653,19 +653,18 @@
// FIXME: Note down method resolution her
match op {
UnaryOp::Deref => {
- if let Some(deref_trait) = self.resolve_lang_trait(LangItem::Deref) {
- if let Some(deref_fn) = deref_trait
+ if let Some(deref_trait) = self.resolve_lang_trait(LangItem::Deref)
+ && let Some(deref_fn) = deref_trait
.trait_items(self.db)
.method_by_name(&Name::new_symbol_root(sym::deref))
- {
- // FIXME: this is wrong in multiple ways, subst is empty, and we emit it even for builtin deref (note that
- // the mutability is not wrong, and will be fixed in `self.infer_mut`).
- self.write_method_resolution(
- tgt_expr,
- deref_fn,
- Substitution::empty(Interner),
- );
- }
+ {
+ // FIXME: this is wrong in multiple ways, subst is empty, and we emit it even for builtin deref (note that
+ // the mutability is not wrong, and will be fixed in `self.infer_mut`).
+ self.write_method_resolution(
+ tgt_expr,
+ deref_fn,
+ Substitution::empty(Interner),
+ );
}
if let Some(derefed) = builtin_deref(self.table.db, &inner_ty, true) {
self.resolve_ty_shallow(derefed)
@@ -1387,28 +1386,28 @@
let ret_ty = match method_ty.callable_sig(self.db) {
Some(sig) => {
let p_left = &sig.params()[0];
- if matches!(op, BinaryOp::CmpOp(..) | BinaryOp::Assignment { .. }) {
- if let TyKind::Ref(mtbl, lt, _) = p_left.kind(Interner) {
- self.write_expr_adj(
- lhs,
- Box::new([Adjustment {
- kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
- target: p_left.clone(),
- }]),
- );
- }
+ if matches!(op, BinaryOp::CmpOp(..) | BinaryOp::Assignment { .. })
+ && let TyKind::Ref(mtbl, lt, _) = p_left.kind(Interner)
+ {
+ self.write_expr_adj(
+ lhs,
+ Box::new([Adjustment {
+ kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
+ target: p_left.clone(),
+ }]),
+ );
}
let p_right = &sig.params()[1];
- if matches!(op, BinaryOp::CmpOp(..)) {
- if let TyKind::Ref(mtbl, lt, _) = p_right.kind(Interner) {
- self.write_expr_adj(
- rhs,
- Box::new([Adjustment {
- kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
- target: p_right.clone(),
- }]),
- );
- }
+ if matches!(op, BinaryOp::CmpOp(..))
+ && let TyKind::Ref(mtbl, lt, _) = p_right.kind(Interner)
+ {
+ self.write_expr_adj(
+ rhs,
+ Box::new([Adjustment {
+ kind: Adjust::Borrow(AutoBorrow::Ref(lt.clone(), *mtbl)),
+ target: p_right.clone(),
+ }]),
+ );
}
sig.ret().clone()
}
@@ -1664,14 +1663,12 @@
Some((ty, field_id, adjustments, is_public)) => {
self.write_expr_adj(receiver, adjustments.into_boxed_slice());
self.result.field_resolutions.insert(tgt_expr, field_id);
- if !is_public {
- if let Either::Left(field) = field_id {
- // FIXME: Merge this diagnostic into UnresolvedField?
- self.push_diagnostic(InferenceDiagnostic::PrivateField {
- expr: tgt_expr,
- field,
- });
- }
+ if !is_public && let Either::Left(field) = field_id {
+ // FIXME: Merge this diagnostic into UnresolvedField?
+ self.push_diagnostic(InferenceDiagnostic::PrivateField {
+ expr: tgt_expr,
+ field,
+ });
}
ty
}
diff --git a/crates/hir-ty/src/infer/mutability.rs b/crates/hir-ty/src/infer/mutability.rs
index 3f7eba9..c798e9e 100644
--- a/crates/hir-ty/src/infer/mutability.rs
+++ b/crates/hir-ty/src/infer/mutability.rs
@@ -124,53 +124,41 @@
self.infer_mut_not_expr_iter(fields.iter().map(|it| it.expr).chain(*spread))
}
&Expr::Index { base, index } => {
- if mutability == Mutability::Mut {
- if let Some((f, _)) = self.result.method_resolutions.get_mut(&tgt_expr) {
- if let Some(index_trait) =
- LangItem::IndexMut.resolve_trait(self.db, self.table.trait_env.krate)
- {
- if let Some(index_fn) = index_trait
- .trait_items(self.db)
- .method_by_name(&Name::new_symbol_root(sym::index_mut))
- {
- *f = index_fn;
- let mut base_ty = None;
- let base_adjustments = self
- .result
- .expr_adjustments
- .get_mut(&base)
- .and_then(|it| it.last_mut());
- if let Some(Adjustment {
- kind: Adjust::Borrow(AutoBorrow::Ref(_, mutability)),
- target,
- }) = base_adjustments
- {
- if let TyKind::Ref(_, _, ty) = target.kind(Interner) {
- base_ty = Some(ty.clone());
- }
- *mutability = Mutability::Mut;
- }
-
- // Apply `IndexMut` obligation for non-assignee expr
- if let Some(base_ty) = base_ty {
- let index_ty =
- if let Some(ty) = self.result.type_of_expr.get(index) {
- ty.clone()
- } else {
- self.infer_expr(
- index,
- &Expectation::none(),
- ExprIsRead::Yes,
- )
- };
- let trait_ref = TyBuilder::trait_ref(self.db, index_trait)
- .push(base_ty)
- .fill(|_| index_ty.clone().cast(Interner))
- .build();
- self.push_obligation(trait_ref.cast(Interner));
- }
- }
+ if mutability == Mutability::Mut
+ && let Some((f, _)) = self.result.method_resolutions.get_mut(&tgt_expr)
+ && let Some(index_trait) =
+ LangItem::IndexMut.resolve_trait(self.db, self.table.trait_env.krate)
+ && let Some(index_fn) = index_trait
+ .trait_items(self.db)
+ .method_by_name(&Name::new_symbol_root(sym::index_mut))
+ {
+ *f = index_fn;
+ let mut base_ty = None;
+ let base_adjustments =
+ self.result.expr_adjustments.get_mut(&base).and_then(|it| it.last_mut());
+ if let Some(Adjustment {
+ kind: Adjust::Borrow(AutoBorrow::Ref(_, mutability)),
+ target,
+ }) = base_adjustments
+ {
+ if let TyKind::Ref(_, _, ty) = target.kind(Interner) {
+ base_ty = Some(ty.clone());
}
+ *mutability = Mutability::Mut;
+ }
+
+ // Apply `IndexMut` obligation for non-assignee expr
+ if let Some(base_ty) = base_ty {
+ let index_ty = if let Some(ty) = self.result.type_of_expr.get(index) {
+ ty.clone()
+ } else {
+ self.infer_expr(index, &Expectation::none(), ExprIsRead::Yes)
+ };
+ let trait_ref = TyBuilder::trait_ref(self.db, index_trait)
+ .push(base_ty)
+ .fill(|_| index_ty.clone().cast(Interner))
+ .build();
+ self.push_obligation(trait_ref.cast(Interner));
}
}
self.infer_mut_expr(base, mutability);
@@ -178,28 +166,23 @@
}
Expr::UnaryOp { expr, op: UnaryOp::Deref } => {
let mut mutability = mutability;
- if let Some((f, _)) = self.result.method_resolutions.get_mut(&tgt_expr) {
- if mutability == Mutability::Mut {
- if let Some(deref_trait) =
- LangItem::DerefMut.resolve_trait(self.db, self.table.trait_env.krate)
- {
- let ty = self.result.type_of_expr.get(*expr);
- let is_mut_ptr = ty.is_some_and(|ty| {
- let ty = self.table.resolve_ty_shallow(ty);
- matches!(
- ty.kind(Interner),
- chalk_ir::TyKind::Raw(Mutability::Mut, _)
- )
- });
- if is_mut_ptr {
- mutability = Mutability::Not;
- } else if let Some(deref_fn) = deref_trait
- .trait_items(self.db)
- .method_by_name(&Name::new_symbol_root(sym::deref_mut))
- {
- *f = deref_fn;
- }
- }
+ if let Some((f, _)) = self.result.method_resolutions.get_mut(&tgt_expr)
+ && mutability == Mutability::Mut
+ && let Some(deref_trait) =
+ LangItem::DerefMut.resolve_trait(self.db, self.table.trait_env.krate)
+ {
+ let ty = self.result.type_of_expr.get(*expr);
+ let is_mut_ptr = ty.is_some_and(|ty| {
+ let ty = self.table.resolve_ty_shallow(ty);
+ matches!(ty.kind(Interner), chalk_ir::TyKind::Raw(Mutability::Mut, _))
+ });
+ if is_mut_ptr {
+ mutability = Mutability::Not;
+ } else if let Some(deref_fn) = deref_trait
+ .trait_items(self.db)
+ .method_by_name(&Name::new_symbol_root(sym::deref_mut))
+ {
+ *f = deref_fn;
}
}
self.infer_mut_expr(*expr, mutability);
diff --git a/crates/hir-ty/src/infer/pat.rs b/crates/hir-ty/src/infer/pat.rs
index 18288b7..707bec0 100644
--- a/crates/hir-ty/src/infer/pat.rs
+++ b/crates/hir-ty/src/infer/pat.rs
@@ -498,12 +498,12 @@
// If `expected` is an infer ty, we try to equate it to an array if the given pattern
// allows it. See issue #16609
- if self.pat_is_irrefutable(decl) && expected.is_ty_var() {
- if let Some(resolved_array_ty) =
+ if self.pat_is_irrefutable(decl)
+ && expected.is_ty_var()
+ && let Some(resolved_array_ty) =
self.try_resolve_slice_ty_to_array_ty(prefix, suffix, slice)
- {
- self.unify(&expected, &resolved_array_ty);
- }
+ {
+ self.unify(&expected, &resolved_array_ty);
}
let expected = self.resolve_ty_shallow(&expected);
@@ -539,17 +539,16 @@
fn infer_lit_pat(&mut self, expr: ExprId, expected: &Ty) -> Ty {
// Like slice patterns, byte string patterns can denote both `&[u8; N]` and `&[u8]`.
- if let Expr::Literal(Literal::ByteString(_)) = self.body[expr] {
- if let Some((inner, ..)) = expected.as_reference() {
- let inner = self.resolve_ty_shallow(inner);
- if matches!(inner.kind(Interner), TyKind::Slice(_)) {
- let elem_ty = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(Interner);
- let slice_ty = TyKind::Slice(elem_ty).intern(Interner);
- let ty =
- TyKind::Ref(Mutability::Not, static_lifetime(), slice_ty).intern(Interner);
- self.write_expr_ty(expr, ty.clone());
- return ty;
- }
+ if let Expr::Literal(Literal::ByteString(_)) = self.body[expr]
+ && let Some((inner, ..)) = expected.as_reference()
+ {
+ let inner = self.resolve_ty_shallow(inner);
+ if matches!(inner.kind(Interner), TyKind::Slice(_)) {
+ let elem_ty = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(Interner);
+ let slice_ty = TyKind::Slice(elem_ty).intern(Interner);
+ let ty = TyKind::Ref(Mutability::Not, static_lifetime(), slice_ty).intern(Interner);
+ self.write_expr_ty(expr, ty.clone());
+ return ty;
}
}
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index d61e7de..afee960 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -830,10 +830,10 @@
let data = t.hir_trait_id().trait_items(db);
for (name, assoc_id) in &data.items {
- if let AssocItemId::TypeAliasId(alias) = assoc_id {
- if let Some(result) = cb(name, &t, *alias) {
- return Some(result);
- }
+ if let AssocItemId::TypeAliasId(alias) = assoc_id
+ && let Some(result) = cb(name, &t, *alias)
+ {
+ return Some(result);
}
}
None
diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs
index 5c06234..9519c38 100644
--- a/crates/hir-ty/src/lower/path.rs
+++ b/crates/hir-ty/src/lower/path.rs
@@ -360,15 +360,14 @@
}
}
- if let Some(enum_segment) = enum_segment {
- if segments.get(enum_segment).is_some_and(|it| it.args_and_bindings.is_some())
- && segments.get(enum_segment + 1).is_some_and(|it| it.args_and_bindings.is_some())
- {
- self.on_diagnostic(PathLoweringDiagnostic::GenericArgsProhibited {
- segment: (enum_segment + 1) as u32,
- reason: GenericArgsProhibitedReason::EnumVariant,
- });
- }
+ if let Some(enum_segment) = enum_segment
+ && segments.get(enum_segment).is_some_and(|it| it.args_and_bindings.is_some())
+ && segments.get(enum_segment + 1).is_some_and(|it| it.args_and_bindings.is_some())
+ {
+ self.on_diagnostic(PathLoweringDiagnostic::GenericArgsProhibited {
+ segment: (enum_segment + 1) as u32,
+ reason: GenericArgsProhibitedReason::EnumVariant,
+ });
}
self.handle_type_ns_resolution(&resolution);
@@ -417,15 +416,14 @@
}
}
- if let Some(enum_segment) = enum_segment {
- if segments.get(enum_segment).is_some_and(|it| it.args_and_bindings.is_some())
- && segments.get(enum_segment + 1).is_some_and(|it| it.args_and_bindings.is_some())
- {
- self.on_diagnostic(PathLoweringDiagnostic::GenericArgsProhibited {
- segment: (enum_segment + 1) as u32,
- reason: GenericArgsProhibitedReason::EnumVariant,
- });
- }
+ if let Some(enum_segment) = enum_segment
+ && segments.get(enum_segment).is_some_and(|it| it.args_and_bindings.is_some())
+ && segments.get(enum_segment + 1).is_some_and(|it| it.args_and_bindings.is_some())
+ {
+ self.on_diagnostic(PathLoweringDiagnostic::GenericArgsProhibited {
+ segment: (enum_segment + 1) as u32,
+ reason: GenericArgsProhibitedReason::EnumVariant,
+ });
}
match &res {
@@ -576,13 +574,12 @@
// This simplifies the code a bit.
let penultimate_idx = self.current_segment_idx.wrapping_sub(1);
let penultimate = self.segments.get(penultimate_idx);
- if let Some(penultimate) = penultimate {
- if self.current_or_prev_segment.args_and_bindings.is_none()
- && penultimate.args_and_bindings.is_some()
- {
- self.current_segment_idx = penultimate_idx;
- self.current_or_prev_segment = penultimate;
- }
+ if let Some(penultimate) = penultimate
+ && self.current_or_prev_segment.args_and_bindings.is_none()
+ && penultimate.args_and_bindings.is_some()
+ {
+ self.current_segment_idx = penultimate_idx;
+ self.current_or_prev_segment = penultimate;
}
var.lookup(self.ctx.db).parent.into()
}
@@ -607,37 +604,36 @@
) -> Substitution {
let mut lifetime_elision = self.ctx.lifetime_elision.clone();
- if let Some(args) = self.current_or_prev_segment.args_and_bindings {
- if args.parenthesized != GenericArgsParentheses::No {
- let prohibit_parens = match def {
- GenericDefId::TraitId(trait_) => {
- // RTN is prohibited anyways if we got here.
- let is_rtn =
- args.parenthesized == GenericArgsParentheses::ReturnTypeNotation;
- let is_fn_trait = self
- .ctx
- .db
- .trait_signature(trait_)
- .flags
- .contains(TraitFlags::RUSTC_PAREN_SUGAR);
- is_rtn || !is_fn_trait
- }
- _ => true,
- };
-
- if prohibit_parens {
- let segment = self.current_segment_u32();
- self.on_diagnostic(
- PathLoweringDiagnostic::ParenthesizedGenericArgsWithoutFnTrait { segment },
- );
-
- return TyBuilder::unknown_subst(self.ctx.db, def);
+ if let Some(args) = self.current_or_prev_segment.args_and_bindings
+ && args.parenthesized != GenericArgsParentheses::No
+ {
+ let prohibit_parens = match def {
+ GenericDefId::TraitId(trait_) => {
+ // RTN is prohibited anyways if we got here.
+ let is_rtn = args.parenthesized == GenericArgsParentheses::ReturnTypeNotation;
+ let is_fn_trait = self
+ .ctx
+ .db
+ .trait_signature(trait_)
+ .flags
+ .contains(TraitFlags::RUSTC_PAREN_SUGAR);
+ is_rtn || !is_fn_trait
}
+ _ => true,
+ };
- // `Fn()`-style generics are treated like functions for the purpose of lifetime elision.
- lifetime_elision =
- LifetimeElisionKind::AnonymousCreateParameter { report_in_path: false };
+ if prohibit_parens {
+ let segment = self.current_segment_u32();
+ self.on_diagnostic(
+ PathLoweringDiagnostic::ParenthesizedGenericArgsWithoutFnTrait { segment },
+ );
+
+ return TyBuilder::unknown_subst(self.ctx.db, def);
}
+
+ // `Fn()`-style generics are treated like functions for the purpose of lifetime elision.
+ lifetime_elision =
+ LifetimeElisionKind::AnonymousCreateParameter { report_in_path: false };
}
self.substs_from_args_and_bindings(
@@ -753,18 +749,20 @@
match param {
GenericParamDataRef::LifetimeParamData(_) => error_lifetime().cast(Interner),
GenericParamDataRef::TypeParamData(param) => {
- if !infer_args && param.default.is_some() {
- if let Some(default) = default() {
- return default;
- }
+ if !infer_args
+ && param.default.is_some()
+ && let Some(default) = default()
+ {
+ return default;
}
TyKind::Error.intern(Interner).cast(Interner)
}
GenericParamDataRef::ConstParamData(param) => {
- if !infer_args && param.default.is_some() {
- if let Some(default) = default() {
- return default;
- }
+ if !infer_args
+ && param.default.is_some()
+ && let Some(default) = default()
+ {
+ return default;
}
let GenericParamId::ConstParamId(const_id) = param_id else {
unreachable!("non-const param ID for const param");
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index a6150a9..b22781e 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -581,15 +581,15 @@
}
if self.unsize_array {
ty = 'it: {
- if let TyKind::Ref(m, l, inner) = ty.kind(Interner) {
- if let TyKind::Array(inner, _) = inner.kind(Interner) {
- break 'it TyKind::Ref(
- *m,
- l.clone(),
- TyKind::Slice(inner.clone()).intern(Interner),
- )
- .intern(Interner);
- }
+ if let TyKind::Ref(m, l, inner) = ty.kind(Interner)
+ && let TyKind::Array(inner, _) = inner.kind(Interner)
+ {
+ break 'it TyKind::Ref(
+ *m,
+ l.clone(),
+ TyKind::Slice(inner.clone()).intern(Interner),
+ )
+ .intern(Interner);
}
// FIXME: report diagnostic if array unsizing happens without indirection.
ty
@@ -1549,11 +1549,11 @@
check_that!(receiver_ty.is_none());
check_that!(name.is_none_or(|n| n == item_name));
- if let Some(from_module) = visible_from_module {
- if !db.assoc_visibility(c.into()).is_visible_from(db, from_module) {
- cov_mark::hit!(const_candidate_not_visible);
- return IsValidCandidate::NotVisible;
- }
+ if let Some(from_module) = visible_from_module
+ && !db.assoc_visibility(c.into()).is_visible_from(db, from_module)
+ {
+ cov_mark::hit!(const_candidate_not_visible);
+ return IsValidCandidate::NotVisible;
}
let self_ty_matches = table.run_in_snapshot(|table| {
let expected_self_ty =
@@ -1638,11 +1638,11 @@
let db = table.db;
let data = db.function_signature(fn_id);
- if let Some(from_module) = visible_from_module {
- if !db.assoc_visibility(fn_id.into()).is_visible_from(db, from_module) {
- cov_mark::hit!(autoderef_candidate_not_visible);
- return IsValidCandidate::NotVisible;
- }
+ if let Some(from_module) = visible_from_module
+ && !db.assoc_visibility(fn_id.into()).is_visible_from(db, from_module)
+ {
+ cov_mark::hit!(autoderef_candidate_not_visible);
+ return IsValidCandidate::NotVisible;
}
table.run_in_snapshot(|table| {
let _p = tracing::info_span!("subst_for_def").entered();
diff --git a/crates/hir-ty/src/mir/borrowck.rs b/crates/hir-ty/src/mir/borrowck.rs
index fb0c0de..52df851 100644
--- a/crates/hir-ty/src/mir/borrowck.rs
+++ b/crates/hir-ty/src/mir/borrowck.rs
@@ -559,10 +559,9 @@
},
p,
) = value
+ && place_case(db, body, p) != ProjectionCase::Indirect
{
- if place_case(db, body, p) != ProjectionCase::Indirect {
- push_mut_span(p.local, statement.span, &mut result);
- }
+ push_mut_span(p.local, statement.span, &mut result);
}
}
StatementKind::FakeRead(p) => {
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs
index 9a97bd6..dfb8ae7 100644
--- a/crates/hir-ty/src/mir/eval.rs
+++ b/crates/hir-ty/src/mir/eval.rs
@@ -1082,18 +1082,18 @@
let stack_size = {
let mut stack_ptr = self.stack.len();
for (id, it) in body.locals.iter() {
- if id == return_slot() {
- if let Some(destination) = destination {
- locals.ptr.insert(id, destination);
- continue;
- }
+ if id == return_slot()
+ && let Some(destination) = destination
+ {
+ locals.ptr.insert(id, destination);
+ continue;
}
let (size, align) = self.size_align_of_sized(
&it.ty,
&locals,
"no unsized local in extending stack",
)?;
- while stack_ptr % align != 0 {
+ while !stack_ptr.is_multiple_of(align) {
stack_ptr += 1;
}
let my_ptr = stack_ptr;
@@ -1673,14 +1673,14 @@
if let Some(it) = goal(kind) {
return Ok(it);
}
- if let TyKind::Adt(id, subst) = kind {
- if let AdtId::StructId(struct_id) = id.0 {
- let field_types = self.db.field_types(struct_id.into());
- if let Some(ty) =
- field_types.iter().last().map(|it| it.1.clone().substitute(Interner, subst))
- {
- return self.coerce_unsized_look_through_fields(&ty, goal);
- }
+ if let TyKind::Adt(id, subst) = kind
+ && let AdtId::StructId(struct_id) = id.0
+ {
+ let field_types = self.db.field_types(struct_id.into());
+ if let Some(ty) =
+ field_types.iter().last().map(|it| it.1.clone().substitute(Interner, subst))
+ {
+ return self.coerce_unsized_look_through_fields(&ty, goal);
}
}
Err(MirEvalError::CoerceUnsizedError(ty.clone()))
@@ -1778,17 +1778,15 @@
locals: &Locals,
) -> Result<(usize, Arc<Layout>, Option<(usize, usize, i128)>)> {
let adt = it.adt_id(self.db);
- if let DefWithBodyId::VariantId(f) = locals.body.owner {
- if let VariantId::EnumVariantId(it) = it {
- if let AdtId::EnumId(e) = adt {
- if f.lookup(self.db).parent == e {
- // Computing the exact size of enums require resolving the enum discriminants. In order to prevent loops (and
- // infinite sized type errors) we use a dummy layout
- let i = self.const_eval_discriminant(it)?;
- return Ok((16, self.layout(&TyBuilder::unit())?, Some((0, 16, i))));
- }
- }
- }
+ if let DefWithBodyId::VariantId(f) = locals.body.owner
+ && let VariantId::EnumVariantId(it) = it
+ && let AdtId::EnumId(e) = adt
+ && f.lookup(self.db).parent == e
+ {
+ // Computing the exact size of enums require resolving the enum discriminants. In order to prevent loops (and
+ // infinite sized type errors) we use a dummy layout
+ let i = self.const_eval_discriminant(it)?;
+ return Ok((16, self.layout(&TyBuilder::unit())?, Some((0, 16, i))));
}
let layout = self.layout_adt(adt, subst)?;
Ok(match &layout.variants {
@@ -1909,10 +1907,10 @@
let name = const_id.name(self.db);
MirEvalError::ConstEvalError(name, Box::new(e))
})?;
- if let chalk_ir::ConstValue::Concrete(c) = &result_owner.data(Interner).value {
- if let ConstScalar::Bytes(v, mm) = &c.interned {
- break 'b (v, mm);
- }
+ if let chalk_ir::ConstValue::Concrete(c) = &result_owner.data(Interner).value
+ && let ConstScalar::Bytes(v, mm) = &c.interned
+ {
+ break 'b (v, mm);
}
not_supported!("unevaluatable constant");
}
@@ -2055,14 +2053,13 @@
.is_sized()
.then(|| (layout.size.bytes_usize(), layout.align.abi.bytes() as usize)));
}
- if let DefWithBodyId::VariantId(f) = locals.body.owner {
- if let Some((AdtId::EnumId(e), _)) = ty.as_adt() {
- if f.lookup(self.db).parent == e {
- // Computing the exact size of enums require resolving the enum discriminants. In order to prevent loops (and
- // infinite sized type errors) we use a dummy size
- return Ok(Some((16, 16)));
- }
- }
+ if let DefWithBodyId::VariantId(f) = locals.body.owner
+ && let Some((AdtId::EnumId(e), _)) = ty.as_adt()
+ && f.lookup(self.db).parent == e
+ {
+ // Computing the exact size of enums require resolving the enum discriminants. In order to prevent loops (and
+ // infinite sized type errors) we use a dummy size
+ return Ok(Some((16, 16)));
}
let layout = self.layout(ty);
if self.assert_placeholder_ty_is_unused
@@ -2103,7 +2100,7 @@
if !align.is_power_of_two() || align > 10000 {
return Err(MirEvalError::UndefinedBehavior(format!("Alignment {align} is invalid")));
}
- while self.heap.len() % align != 0 {
+ while !self.heap.len().is_multiple_of(align) {
self.heap.push(0);
}
if size.checked_add(self.heap.len()).is_none_or(|x| x > self.memory_limit) {
diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs
index e9665d5..bb4c963 100644
--- a/crates/hir-ty/src/mir/eval/shim.rs
+++ b/crates/hir-ty/src/mir/eval/shim.rs
@@ -119,25 +119,25 @@
destination.write_from_bytes(self, &result)?;
return Ok(true);
}
- if let ItemContainerId::TraitId(t) = def.lookup(self.db).container {
- if self.db.lang_attr(t.into()) == Some(LangItem::Clone) {
- let [self_ty] = generic_args.as_slice(Interner) else {
- not_supported!("wrong generic arg count for clone");
- };
- let Some(self_ty) = self_ty.ty(Interner) else {
- not_supported!("wrong generic arg kind for clone");
- };
- // Clone has special impls for tuples and function pointers
- if matches!(
- self_ty.kind(Interner),
- TyKind::Function(_) | TyKind::Tuple(..) | TyKind::Closure(..)
- ) {
- self.exec_clone(def, args, self_ty.clone(), locals, destination, span)?;
- return Ok(true);
- }
- // Return early to prevent caching clone as non special fn.
- return Ok(false);
+ if let ItemContainerId::TraitId(t) = def.lookup(self.db).container
+ && self.db.lang_attr(t.into()) == Some(LangItem::Clone)
+ {
+ let [self_ty] = generic_args.as_slice(Interner) else {
+ not_supported!("wrong generic arg count for clone");
+ };
+ let Some(self_ty) = self_ty.ty(Interner) else {
+ not_supported!("wrong generic arg kind for clone");
+ };
+ // Clone has special impls for tuples and function pointers
+ if matches!(
+ self_ty.kind(Interner),
+ TyKind::Function(_) | TyKind::Tuple(..) | TyKind::Closure(..)
+ ) {
+ self.exec_clone(def, args, self_ty.clone(), locals, destination, span)?;
+ return Ok(true);
}
+ // Return early to prevent caching clone as non special fn.
+ return Ok(false);
}
self.not_special_fn_cache.borrow_mut().insert(def);
Ok(false)
@@ -1256,23 +1256,22 @@
let addr = tuple.interval.addr.offset(offset);
args.push(IntervalAndTy::new(addr, field, self, locals)?);
}
- if let Some(target) = LangItem::FnOnce.resolve_trait(self.db, self.crate_id) {
- if let Some(def) = target
+ if let Some(target) = LangItem::FnOnce.resolve_trait(self.db, self.crate_id)
+ && let Some(def) = target
.trait_items(self.db)
.method_by_name(&Name::new_symbol_root(sym::call_once))
- {
- self.exec_fn_trait(
- def,
- &args,
- // FIXME: wrong for manual impls of `FnOnce`
- Substitution::empty(Interner),
- locals,
- destination,
- None,
- span,
- )?;
- return Ok(true);
- }
+ {
+ self.exec_fn_trait(
+ def,
+ &args,
+ // FIXME: wrong for manual impls of `FnOnce`
+ Substitution::empty(Interner),
+ locals,
+ destination,
+ None,
+ span,
+ )?;
+ return Ok(true);
}
not_supported!("FnOnce was not available for executing const_eval_select");
}
@@ -1367,12 +1366,11 @@
break;
}
}
- if signed {
- if let Some((&l, &r)) = lhs.iter().zip(rhs).next_back() {
- if l != r {
- result = (l as i8).cmp(&(r as i8));
- }
- }
+ if signed
+ && let Some((&l, &r)) = lhs.iter().zip(rhs).next_back()
+ && l != r
+ {
+ result = (l as i8).cmp(&(r as i8));
}
if let Some(e) = LangItem::Ordering.resolve_enum(self.db, self.crate_id) {
let ty = self.db.ty(e.into());
diff --git a/crates/hir-ty/src/mir/eval/shim/simd.rs b/crates/hir-ty/src/mir/eval/shim/simd.rs
index bc331a2..f554772 100644
--- a/crates/hir-ty/src/mir/eval/shim/simd.rs
+++ b/crates/hir-ty/src/mir/eval/shim/simd.rs
@@ -114,12 +114,11 @@
break;
}
}
- if is_signed {
- if let Some((&l, &r)) = l.iter().zip(r).next_back() {
- if l != r {
- result = (l as i8).cmp(&(r as i8));
- }
- }
+ if is_signed
+ && let Some((&l, &r)) = l.iter().zip(r).next_back()
+ && l != r
+ {
+ result = (l as i8).cmp(&(r as i8));
}
let result = match result {
Ordering::Less => ["lt", "le", "ne"].contains(&name),
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 07d8147..eb80e87 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -320,11 +320,11 @@
expr_id: ExprId,
current: BasicBlockId,
) -> Result<Option<(Operand, BasicBlockId)>> {
- if !self.has_adjustments(expr_id) {
- if let Expr::Literal(l) = &self.body[expr_id] {
- let ty = self.expr_ty_without_adjust(expr_id);
- return Ok(Some((self.lower_literal_to_operand(ty, l)?, current)));
- }
+ if !self.has_adjustments(expr_id)
+ && let Expr::Literal(l) = &self.body[expr_id]
+ {
+ let ty = self.expr_ty_without_adjust(expr_id);
+ return Ok(Some((self.lower_literal_to_operand(ty, l)?, current)));
}
let Some((p, current)) = self.lower_expr_as_place(current, expr_id, true)? else {
return Ok(None);
@@ -1039,18 +1039,18 @@
&& rhs_ty.is_scalar()
&& (lhs_ty == rhs_ty || builtin_inequal_impls)
};
- if !is_builtin {
- if let Some((func_id, generic_args)) = self.infer.method_resolution(expr_id) {
- let func = Operand::from_fn(self.db, func_id, generic_args);
- return self.lower_call_and_args(
- func,
- [*lhs, *rhs].into_iter(),
- place,
- current,
- self.is_uninhabited(expr_id),
- expr_id.into(),
- );
- }
+ if !is_builtin
+ && let Some((func_id, generic_args)) = self.infer.method_resolution(expr_id)
+ {
+ let func = Operand::from_fn(self.db, func_id, generic_args);
+ return self.lower_call_and_args(
+ func,
+ [*lhs, *rhs].into_iter(),
+ place,
+ current,
+ self.is_uninhabited(expr_id),
+ expr_id.into(),
+ );
}
if let hir_def::hir::BinaryOp::Assignment { op: Some(op) } = op {
// last adjustment is `&mut` which we don't want it.
@@ -1596,10 +1596,10 @@
fn expr_ty_after_adjustments(&self, e: ExprId) -> Ty {
let mut ty = None;
- if let Some(it) = self.infer.expr_adjustments.get(&e) {
- if let Some(it) = it.last() {
- ty = Some(it.target.clone());
- }
+ if let Some(it) = self.infer.expr_adjustments.get(&e)
+ && let Some(it) = it.last()
+ {
+ ty = Some(it.target.clone());
}
ty.unwrap_or_else(|| self.expr_ty_without_adjust(e))
}
@@ -1848,13 +1848,13 @@
self.result.param_locals.extend(params.clone().map(|(it, ty)| {
let local_id = self.result.locals.alloc(Local { ty });
self.drop_scopes.last_mut().unwrap().locals.push(local_id);
- if let Pat::Bind { id, subpat: None } = self.body[it] {
- if matches!(
+ if let Pat::Bind { id, subpat: None } = self.body[it]
+ && matches!(
self.body[id].mode,
BindingAnnotation::Unannotated | BindingAnnotation::Mutable
- ) {
- self.result.binding_locals.insert(id, local_id);
- }
+ )
+ {
+ self.result.binding_locals.insert(id, local_id);
}
local_id
}));
@@ -1887,10 +1887,10 @@
.into_iter()
.skip(base_param_count + self_binding.is_some() as usize);
for ((param, _), local) in params.zip(local_params) {
- if let Pat::Bind { id, .. } = self.body[param] {
- if local == self.binding_local(id)? {
- continue;
- }
+ if let Pat::Bind { id, .. } = self.body[param]
+ && local == self.binding_local(id)?
+ {
+ continue;
}
let r = self.pattern_match(current, None, local.into(), param)?;
if let Some(b) = r.1 {
diff --git a/crates/hir-ty/src/mir/lower/as_place.rs b/crates/hir-ty/src/mir/lower/as_place.rs
index e074c2d..42a1466 100644
--- a/crates/hir-ty/src/mir/lower/as_place.rs
+++ b/crates/hir-ty/src/mir/lower/as_place.rs
@@ -189,17 +189,14 @@
self.expr_ty_without_adjust(expr_id),
expr_id.into(),
'b: {
- if let Some((f, _)) = self.infer.method_resolution(expr_id) {
- if let Some(deref_trait) =
+ if let Some((f, _)) = self.infer.method_resolution(expr_id)
+ && let Some(deref_trait) =
self.resolve_lang_item(LangItem::DerefMut)?.as_trait()
- {
- if let Some(deref_fn) = deref_trait
- .trait_items(self.db)
- .method_by_name(&Name::new_symbol_root(sym::deref_mut))
- {
- break 'b deref_fn == f;
- }
- }
+ && let Some(deref_fn) = deref_trait
+ .trait_items(self.db)
+ .method_by_name(&Name::new_symbol_root(sym::deref_mut))
+ {
+ break 'b deref_fn == f;
}
false
},
diff --git a/crates/hir-ty/src/mir/lower/pattern_matching.rs b/crates/hir-ty/src/mir/lower/pattern_matching.rs
index 3325226..0440d85 100644
--- a/crates/hir-ty/src/mir/lower/pattern_matching.rs
+++ b/crates/hir-ty/src/mir/lower/pattern_matching.rs
@@ -317,27 +317,26 @@
(current, current_else) =
self.pattern_match_inner(current, current_else, next_place, pat, mode)?;
}
- if let &Some(slice) = slice {
- if mode != MatchingMode::Check {
- if let Pat::Bind { id, subpat: _ } = self.body[slice] {
- let next_place = cond_place.project(
- ProjectionElem::Subslice {
- from: prefix.len() as u64,
- to: suffix.len() as u64,
- },
- &mut self.result.projection_store,
- );
- let mode = self.infer.binding_modes[slice];
- (current, current_else) = self.pattern_match_binding(
- id,
- mode,
- next_place,
- (slice).into(),
- current,
- current_else,
- )?;
- }
- }
+ if let &Some(slice) = slice
+ && mode != MatchingMode::Check
+ && let Pat::Bind { id, subpat: _ } = self.body[slice]
+ {
+ let next_place = cond_place.project(
+ ProjectionElem::Subslice {
+ from: prefix.len() as u64,
+ to: suffix.len() as u64,
+ },
+ &mut self.result.projection_store,
+ );
+ let mode = self.infer.binding_modes[slice];
+ (current, current_else) = self.pattern_match_binding(
+ id,
+ mode,
+ next_place,
+ (slice).into(),
+ current,
+ current_else,
+ )?;
}
for (i, &pat) in suffix.iter().enumerate() {
let next_place = cond_place.project(
@@ -391,10 +390,10 @@
return Ok((current, current_else));
}
let (c, subst) = 'b: {
- if let Some(x) = self.infer.assoc_resolutions_for_pat(pattern) {
- if let AssocItemId::ConstId(c) = x.0 {
- break 'b (c, x.1);
- }
+ if let Some(x) = self.infer.assoc_resolutions_for_pat(pattern)
+ && let AssocItemId::ConstId(c) = x.0
+ {
+ break 'b (c, x.1);
}
if let ResolveValueResult::ValueNs(ValueNs::ConstId(c), _) = pr {
break 'b (c, Substitution::empty(Interner));
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 7414b4f..08b9d24 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -125,11 +125,10 @@
alias: AliasTy::Projection(projection_ty),
..
}))) = &goal.value.goal.data(Interner)
+ && let TyKind::BoundVar(_) = projection_ty.self_type_parameter(db).kind(Interner)
{
- if let TyKind::BoundVar(_) = projection_ty.self_type_parameter(db).kind(Interner) {
- // Hack: don't ask Chalk to normalize with an unknown self type, it'll say that's impossible
- return Some(Solution::Ambig(Guidance::Unknown));
- }
+ // Hack: don't ask Chalk to normalize with an unknown self type, it'll say that's impossible
+ return Some(Solution::Ambig(Guidance::Unknown));
}
// Chalk see `UnevaluatedConst` as a unique concrete value, but we see it as an alias for another const. So
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index d07c1aa..209ec79 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -333,13 +333,13 @@
constant: Const,
_outer_binder: DebruijnIndex,
) -> Result<Const, Self::Error> {
- if let chalk_ir::ConstValue::Concrete(c) = &constant.data(Interner).value {
- if let ConstScalar::UnevaluatedConst(id, subst) = &c.interned {
- if let Ok(eval) = self.db.const_eval(*id, subst.clone(), None) {
- return Ok(eval);
- } else {
- return Ok(unknown_const(constant.data(Interner).ty.clone()));
- }
+ if let chalk_ir::ConstValue::Concrete(c) = &constant.data(Interner).value
+ && let ConstScalar::UnevaluatedConst(id, subst) = &c.interned
+ {
+ if let Ok(eval) = self.db.const_eval(*id, subst.clone(), None) {
+ return Ok(eval);
+ } else {
+ return Ok(unknown_const(constant.data(Interner).ty.clone()));
}
}
Ok(constant)
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs
index c1e814e..fca0162 100644
--- a/crates/hir/src/diagnostics.rs
+++ b/crates/hir/src/diagnostics.rs
@@ -604,13 +604,13 @@
}
}
BodyValidationDiagnostic::RemoveUnnecessaryElse { if_expr } => {
- if let Ok(source_ptr) = source_map.expr_syntax(if_expr) {
- if let Some(ptr) = source_ptr.value.cast::<ast::IfExpr>() {
- return Some(
- RemoveUnnecessaryElse { if_expr: InFile::new(source_ptr.file_id, ptr) }
- .into(),
- );
- }
+ if let Ok(source_ptr) = source_map.expr_syntax(if_expr)
+ && let Some(ptr) = source_ptr.value.cast::<ast::IfExpr>()
+ {
+ return Some(
+ RemoveUnnecessaryElse { if_expr: InFile::new(source_ptr.file_id, ptr) }
+ .into(),
+ );
}
}
}
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 4ddb04b..a323f97 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -1020,21 +1020,21 @@
m: Macro,
) {
let id = db.macro_def(m.id);
- if let hir_expand::db::TokenExpander::DeclarativeMacro(expander) = db.macro_expander(id) {
- if let Some(e) = expander.mac.err() {
- let Some(ast) = id.ast_id().left() else {
- never!("declarative expander for non decl-macro: {:?}", e);
- return;
- };
- let krate = HasModule::krate(&m.id, db);
- let edition = krate.data(db).edition;
- emit_def_diagnostic_(
- db,
- acc,
- &DefDiagnosticKind::MacroDefError { ast, message: e.to_string() },
- edition,
- );
- }
+ if let hir_expand::db::TokenExpander::DeclarativeMacro(expander) = db.macro_expander(id)
+ && let Some(e) = expander.mac.err()
+ {
+ let Some(ast) = id.ast_id().left() else {
+ never!("declarative expander for non decl-macro: {:?}", e);
+ return;
+ };
+ let krate = HasModule::krate(&m.id, db);
+ let edition = krate.data(db).edition;
+ emit_def_diagnostic_(
+ db,
+ acc,
+ &DefDiagnosticKind::MacroDefError { ast, message: e.to_string() },
+ edition,
+ );
}
}
@@ -2564,10 +2564,10 @@
Callee::Closure(closure, _) => {
let c = db.lookup_intern_closure(closure.into());
let body = db.body(c.0);
- if let Expr::Closure { args, .. } = &body[c.1] {
- if let Pat::Bind { id, .. } = &body[args[self.idx]] {
- return Some(Local { parent: c.0, binding_id: *id });
- }
+ if let Expr::Closure { args, .. } = &body[c.1]
+ && let Pat::Bind { id, .. } = &body[args[self.idx]]
+ {
+ return Some(Local { parent: c.0, binding_id: *id });
}
None
}
@@ -2761,26 +2761,20 @@
pub fn render_debug(&self, db: &dyn HirDatabase) -> Result<String, MirEvalError> {
let data = self.const_.data(Interner);
- if let TyKind::Scalar(s) = data.ty.kind(Interner) {
- if matches!(s, Scalar::Int(_) | Scalar::Uint(_)) {
- if let hir_ty::ConstValue::Concrete(c) = &data.value {
- if let hir_ty::ConstScalar::Bytes(b, _) = &c.interned {
- let value = u128::from_le_bytes(mir::pad16(b, false));
- let value_signed =
- i128::from_le_bytes(mir::pad16(b, matches!(s, Scalar::Int(_))));
- let mut result = if let Scalar::Int(_) = s {
- value_signed.to_string()
- } else {
- value.to_string()
- };
- if value >= 10 {
- format_to!(result, " ({value:#X})");
- return Ok(result);
- } else {
- return Ok(result);
- }
- }
- }
+ if let TyKind::Scalar(s) = data.ty.kind(Interner)
+ && matches!(s, Scalar::Int(_) | Scalar::Uint(_))
+ && let hir_ty::ConstValue::Concrete(c) = &data.value
+ && let hir_ty::ConstScalar::Bytes(b, _) = &c.interned
+ {
+ let value = u128::from_le_bytes(mir::pad16(b, false));
+ let value_signed = i128::from_le_bytes(mir::pad16(b, matches!(s, Scalar::Int(_))));
+ let mut result =
+ if let Scalar::Int(_) = s { value_signed.to_string() } else { value.to_string() };
+ if value >= 10 {
+ format_to!(result, " ({value:#X})");
+ return Ok(result);
+ } else {
+ return Ok(result);
}
}
mir::render_const_using_debug_impl(db, self.def, &self.const_)
@@ -4421,10 +4415,10 @@
let impls = db.trait_impls_in_crate(id);
all.extend(impls.for_trait(trait_.id).map(Self::from))
}
- if let Some(block) = module.id.containing_block() {
- if let Some(trait_impls) = db.trait_impls_in_block(block) {
- all.extend(trait_impls.for_trait(trait_.id).map(Self::from));
- }
+ if let Some(block) = module.id.containing_block()
+ && let Some(trait_impls) = db.trait_impls_in_block(block)
+ {
+ all.extend(trait_impls.for_trait(trait_.id).map(Self::from));
}
all
}
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index adba592..d207305 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -933,19 +933,18 @@
InFile::new(file.file_id, last),
false,
&mut |InFile { value: last, file_id: last_fid }, _ctx| {
- if let Some(InFile { value: first, file_id: first_fid }) = scratch.next() {
- if first_fid == last_fid {
- if let Some(p) = first.parent() {
- let range = first.text_range().cover(last.text_range());
- let node = find_root(&p)
- .covering_element(range)
- .ancestors()
- .take_while(|it| it.text_range() == range)
- .find_map(N::cast);
- if let Some(node) = node {
- res.push(node);
- }
- }
+ if let Some(InFile { value: first, file_id: first_fid }) = scratch.next()
+ && first_fid == last_fid
+ && let Some(p) = first.parent()
+ {
+ let range = first.text_range().cover(last.text_range());
+ let node = find_root(&p)
+ .covering_element(range)
+ .ancestors()
+ .take_while(|it| it.text_range() == range)
+ .find_map(N::cast);
+ if let Some(node) = node {
+ res.push(node);
}
}
},
@@ -1391,10 +1390,10 @@
}
})()
.is_none();
- if was_not_remapped {
- if let ControlFlow::Break(b) = f(InFile::new(expansion, token), ctx) {
- return Some(b);
- }
+ if was_not_remapped
+ && let ControlFlow::Break(b) = f(InFile::new(expansion, token), ctx)
+ {
+ return Some(b);
}
}
}
@@ -2068,14 +2067,12 @@
break false;
}
- if let Some(parent) = ast::Expr::cast(parent.clone()) {
- if let Some(ExprOrPatId::ExprId(expr_id)) =
+ if let Some(parent) = ast::Expr::cast(parent.clone())
+ && let Some(ExprOrPatId::ExprId(expr_id)) =
source_map.node_expr(InFile { file_id, value: &parent })
- {
- if let Expr::Unsafe { .. } = body[expr_id] {
- break true;
- }
- }
+ && let Expr::Unsafe { .. } = body[expr_id]
+ {
+ break true;
}
let Some(parent_) = parent.parent() else { break false };
@@ -2354,32 +2351,30 @@
impl RenameConflictsVisitor<'_> {
fn resolve_path(&mut self, node: ExprOrPatId, path: &Path) {
- if let Path::BarePath(path) = path {
- if let Some(name) = path.as_ident() {
- if *name.symbol() == self.new_name {
- if let Some(conflicting) = self.resolver.rename_will_conflict_with_renamed(
- self.db,
- name,
- path,
- self.body.expr_or_pat_path_hygiene(node),
- self.to_be_renamed,
- ) {
- self.conflicts.insert(conflicting);
- }
- } else if *name.symbol() == self.old_name {
- if let Some(conflicting) =
- self.resolver.rename_will_conflict_with_another_variable(
- self.db,
- name,
- path,
- self.body.expr_or_pat_path_hygiene(node),
- &self.new_name,
- self.to_be_renamed,
- )
- {
- self.conflicts.insert(conflicting);
- }
+ if let Path::BarePath(path) = path
+ && let Some(name) = path.as_ident()
+ {
+ if *name.symbol() == self.new_name {
+ if let Some(conflicting) = self.resolver.rename_will_conflict_with_renamed(
+ self.db,
+ name,
+ path,
+ self.body.expr_or_pat_path_hygiene(node),
+ self.to_be_renamed,
+ ) {
+ self.conflicts.insert(conflicting);
}
+ } else if *name.symbol() == self.old_name
+ && let Some(conflicting) = self.resolver.rename_will_conflict_with_another_variable(
+ self.db,
+ name,
+ path,
+ self.body.expr_or_pat_path_hygiene(node),
+ &self.new_name,
+ self.to_be_renamed,
+ )
+ {
+ self.conflicts.insert(conflicting);
}
}
}
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index 0b554a9..d25fb1d 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -995,11 +995,11 @@
// Case where path is a qualifier of a use tree, e.g. foo::bar::{Baz, Qux} where we are
// trying to resolve foo::bar.
- if let Some(use_tree) = parent().and_then(ast::UseTree::cast) {
- if use_tree.coloncolon_token().is_some() {
- return resolve_hir_path_qualifier(db, &self.resolver, &hir_path, &store)
- .map(|it| (it, None));
- }
+ if let Some(use_tree) = parent().and_then(ast::UseTree::cast)
+ && use_tree.coloncolon_token().is_some()
+ {
+ return resolve_hir_path_qualifier(db, &self.resolver, &hir_path, &store)
+ .map(|it| (it, None));
}
let meta_path = path
@@ -1035,24 +1035,19 @@
// }
// ```
Some(it) if matches!(it, PathResolution::Def(ModuleDef::BuiltinType(_))) => {
- if let Some(mod_path) = hir_path.mod_path() {
- if let Some(ModuleDefId::ModuleId(id)) =
+ if let Some(mod_path) = hir_path.mod_path()
+ && let Some(ModuleDefId::ModuleId(id)) =
self.resolver.resolve_module_path_in_items(db, mod_path).take_types()
+ {
+ let parent_hir_name = parent_hir_path.segments().get(1).map(|it| it.name);
+ let module = crate::Module { id };
+ if module
+ .scope(db, None)
+ .into_iter()
+ .any(|(name, _)| Some(&name) == parent_hir_name)
{
- let parent_hir_name =
- parent_hir_path.segments().get(1).map(|it| it.name);
- let module = crate::Module { id };
- if module
- .scope(db, None)
- .into_iter()
- .any(|(name, _)| Some(&name) == parent_hir_name)
- {
- return Some((
- PathResolution::Def(ModuleDef::Module(module)),
- None,
- ));
- };
- }
+ return Some((PathResolution::Def(ModuleDef::Module(module)), None));
+ };
}
Some((it, None))
}
@@ -1282,22 +1277,22 @@
db: &'db dyn HirDatabase,
macro_expr: InFile<&ast::MacroExpr>,
) -> bool {
- if let Some((def, body, sm, Some(infer))) = self.body_() {
- if let Some(expanded_expr) = sm.macro_expansion_expr(macro_expr) {
- let mut is_unsafe = false;
- let mut walk_expr = |expr_id| {
- unsafe_operations(db, infer, def, body, expr_id, &mut |inside_unsafe_block| {
- is_unsafe |= inside_unsafe_block == InsideUnsafeBlock::No
- })
- };
- match expanded_expr {
- ExprOrPatId::ExprId(expanded_expr) => walk_expr(expanded_expr),
- ExprOrPatId::PatId(expanded_pat) => {
- body.walk_exprs_in_pat(expanded_pat, &mut walk_expr)
- }
+ if let Some((def, body, sm, Some(infer))) = self.body_()
+ && let Some(expanded_expr) = sm.macro_expansion_expr(macro_expr)
+ {
+ let mut is_unsafe = false;
+ let mut walk_expr = |expr_id| {
+ unsafe_operations(db, infer, def, body, expr_id, &mut |inside_unsafe_block| {
+ is_unsafe |= inside_unsafe_block == InsideUnsafeBlock::No
+ })
+ };
+ match expanded_expr {
+ ExprOrPatId::ExprId(expanded_expr) => walk_expr(expanded_expr),
+ ExprOrPatId::PatId(expanded_pat) => {
+ body.walk_exprs_in_pat(expanded_pat, &mut walk_expr)
}
- return is_unsafe;
}
+ return is_unsafe;
}
false
}
@@ -1575,12 +1570,11 @@
// If we are in a TypeNs for a Trait, and we have an unresolved name, try to resolve it as a type
// within the trait's associated types.
- if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty) {
- if let Some(type_alias_id) =
+ if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty)
+ && let Some(type_alias_id) =
trait_id.trait_items(db).associated_type_by_name(unresolved.name)
- {
- return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
- }
+ {
+ return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
}
let res = match ty {
@@ -1726,12 +1720,11 @@
// If we are in a TypeNs for a Trait, and we have an unresolved name, try to resolve it as a type
// within the trait's associated types.
- if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty) {
- if let Some(type_alias_id) =
+ if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty)
+ && let Some(type_alias_id) =
trait_id.trait_items(db).associated_type_by_name(unresolved.name)
- {
- return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
- }
+ {
+ return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
}
let res = match ty {
diff --git a/crates/hir/src/term_search.rs b/crates/hir/src/term_search.rs
index 4b354e6..e408921 100644
--- a/crates/hir/src/term_search.rs
+++ b/crates/hir/src/term_search.rs
@@ -122,10 +122,10 @@
}
// Collapse suggestions if there are many
- if let Some(res) = &res {
- if res.len() > self.many_threshold {
- return Some(vec![Expr::Many(ty.clone())]);
- }
+ if let Some(res) = &res
+ && res.len() > self.many_threshold
+ {
+ return Some(vec![Expr::Many(ty.clone())]);
}
res
@@ -160,10 +160,10 @@
}
// Collapse suggestions if there are many
- if let Some(res) = &res {
- if res.len() > self.many_threshold {
- return Some(vec![Expr::Many(ty.clone())]);
- }
+ if let Some(res) = &res
+ && res.len() > self.many_threshold
+ {
+ return Some(vec![Expr::Many(ty.clone())]);
}
res
diff --git a/crates/hir/src/term_search/expr.rs b/crates/hir/src/term_search/expr.rs
index 8438319..78f534d 100644
--- a/crates/hir/src/term_search/expr.rs
+++ b/crates/hir/src/term_search/expr.rs
@@ -336,10 +336,10 @@
if let Expr::Method { func, params, .. } = self {
res.extend(params.iter().flat_map(|it| it.traits_used(db)));
- if let Some(it) = func.as_assoc_item(db) {
- if let Some(it) = it.container_or_implemented_trait(db) {
- res.push(it);
- }
+ if let Some(it) = func.as_assoc_item(db)
+ && let Some(it) = it.container_or_implemented_trait(db)
+ {
+ res.push(it);
}
}
diff --git a/crates/ide-assists/src/handlers/add_lifetime_to_type.rs b/crates/ide-assists/src/handlers/add_lifetime_to_type.rs
index dcdc7ea..27dbdcf 100644
--- a/crates/ide-assists/src/handlers/add_lifetime_to_type.rs
+++ b/crates/ide-assists/src/handlers/add_lifetime_to_type.rs
@@ -82,10 +82,10 @@
record_field_list
.fields()
.filter_map(|r_field| {
- if let ast::Type::RefType(ref_type) = r_field.ty()? {
- if ref_type.lifetime().is_none() {
- return Some(ref_type);
- }
+ if let ast::Type::RefType(ref_type) = r_field.ty()?
+ && ref_type.lifetime().is_none()
+ {
+ return Some(ref_type);
}
None
@@ -102,10 +102,10 @@
ast::FieldList::RecordFieldList(record_list) => record_list
.fields()
.filter_map(|f| {
- if let ast::Type::RefType(ref_type) = f.ty()? {
- if ref_type.lifetime().is_none() {
- return Some(ref_type);
- }
+ if let ast::Type::RefType(ref_type) = f.ty()?
+ && ref_type.lifetime().is_none()
+ {
+ return Some(ref_type);
}
None
@@ -114,10 +114,10 @@
ast::FieldList::TupleFieldList(tuple_field_list) => tuple_field_list
.fields()
.filter_map(|f| {
- if let ast::Type::RefType(ref_type) = f.ty()? {
- if ref_type.lifetime().is_none() {
- return Some(ref_type);
- }
+ if let ast::Type::RefType(ref_type) = f.ty()?
+ && ref_type.lifetime().is_none()
+ {
+ return Some(ref_type);
}
None
diff --git a/crates/ide-assists/src/handlers/add_missing_impl_members.rs b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
index ab183ac..7f1e7cc 100644
--- a/crates/ide-assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
@@ -201,14 +201,12 @@
if let Some(cap) = ctx.config.snippet_cap {
let mut placeholder = None;
- if let DefaultMethods::No = mode {
- if let Some(ast::AssocItem::Fn(func)) = &first_new_item {
- if let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast)
- && m.syntax().text() == "todo!()"
- {
- placeholder = Some(m);
- }
- }
+ if let DefaultMethods::No = mode
+ && let Some(ast::AssocItem::Fn(func)) = &first_new_item
+ && let Some(m) = func.syntax().descendants().find_map(ast::MacroCall::cast)
+ && m.syntax().text() == "todo!()"
+ {
+ placeholder = Some(m);
}
if let Some(macro_call) = placeholder {
diff --git a/crates/ide-assists/src/handlers/apply_demorgan.rs b/crates/ide-assists/src/handlers/apply_demorgan.rs
index 3b447d1..753a9e5 100644
--- a/crates/ide-assists/src/handlers/apply_demorgan.rs
+++ b/crates/ide-assists/src/handlers/apply_demorgan.rs
@@ -207,10 +207,10 @@
// negate all tail expressions in the closure body
let tail_cb = &mut |e: &_| tail_cb_impl(&mut editor, &make, e);
walk_expr(&closure_body, &mut |expr| {
- if let ast::Expr::ReturnExpr(ret_expr) = expr {
- if let Some(ret_expr_arg) = &ret_expr.expr() {
- for_each_tail_expr(ret_expr_arg, tail_cb);
- }
+ if let ast::Expr::ReturnExpr(ret_expr) = expr
+ && let Some(ret_expr_arg) = &ret_expr.expr()
+ {
+ for_each_tail_expr(ret_expr_arg, tail_cb);
}
});
for_each_tail_expr(&closure_body, tail_cb);
diff --git a/crates/ide-assists/src/handlers/convert_bool_then.rs b/crates/ide-assists/src/handlers/convert_bool_then.rs
index d7b7e8d..9d5d3f2 100644
--- a/crates/ide-assists/src/handlers/convert_bool_then.rs
+++ b/crates/ide-assists/src/handlers/convert_bool_then.rs
@@ -86,12 +86,11 @@
e @ ast::Expr::CallExpr(_) => Some(e.clone()),
_ => None,
};
- if let Some(ast::Expr::CallExpr(call)) = e {
- if let Some(arg_list) = call.arg_list() {
- if let Some(arg) = arg_list.args().next() {
- editor.replace(call.syntax(), arg.syntax());
- }
- }
+ if let Some(ast::Expr::CallExpr(call)) = e
+ && let Some(arg_list) = call.arg_list()
+ && let Some(arg) = arg_list.args().next()
+ {
+ editor.replace(call.syntax(), arg.syntax());
}
});
let edit = editor.finish();
@@ -276,12 +275,12 @@
e @ ast::Expr::CallExpr(_) => Some(e.clone()),
_ => None,
};
- if let Some(ast::Expr::CallExpr(call)) = e {
- if let Some(ast::Expr::PathExpr(p)) = call.expr() {
- let res = p.path().and_then(|p| sema.resolve_path(&p));
- if let Some(hir::PathResolution::Def(hir::ModuleDef::Variant(v))) = res {
- return invalid |= v != some_variant;
- }
+ if let Some(ast::Expr::CallExpr(call)) = e
+ && let Some(ast::Expr::PathExpr(p)) = call.expr()
+ {
+ let res = p.path().and_then(|p| sema.resolve_path(&p));
+ if let Some(hir::PathResolution::Def(hir::ModuleDef::Variant(v))) = res {
+ return invalid |= v != some_variant;
}
}
invalid = true
diff --git a/crates/ide-assists/src/handlers/convert_closure_to_fn.rs b/crates/ide-assists/src/handlers/convert_closure_to_fn.rs
index 43515de..916bb67 100644
--- a/crates/ide-assists/src/handlers/convert_closure_to_fn.rs
+++ b/crates/ide-assists/src/handlers/convert_closure_to_fn.rs
@@ -101,21 +101,21 @@
// but we need to locate `AstPtr`s inside the body.
let mut wrap_body_in_block = true;
if let ast::Expr::BlockExpr(block) = &body {
- if let Some(async_token) = block.async_token() {
- if !is_async {
- is_async = true;
- ret_ty = ret_ty.future_output(ctx.db())?;
- let token_idx = async_token.index();
- let whitespace_tokens_after_count = async_token
- .siblings_with_tokens(Direction::Next)
- .skip(1)
- .take_while(|token| token.kind() == SyntaxKind::WHITESPACE)
- .count();
- body.syntax().splice_children(
- token_idx..token_idx + whitespace_tokens_after_count + 1,
- Vec::new(),
- );
- }
+ if let Some(async_token) = block.async_token()
+ && !is_async
+ {
+ is_async = true;
+ ret_ty = ret_ty.future_output(ctx.db())?;
+ let token_idx = async_token.index();
+ let whitespace_tokens_after_count = async_token
+ .siblings_with_tokens(Direction::Next)
+ .skip(1)
+ .take_while(|token| token.kind() == SyntaxKind::WHITESPACE)
+ .count();
+ body.syntax().splice_children(
+ token_idx..token_idx + whitespace_tokens_after_count + 1,
+ Vec::new(),
+ );
}
if let Some(gen_token) = block.gen_token() {
is_gen = true;
@@ -513,10 +513,10 @@
CaptureKind::MutableRef | CaptureKind::UniqueSharedRef => true,
CaptureKind::Move => return place,
};
- if let ast::Expr::PrefixExpr(expr) = &place {
- if expr.op_kind() == Some(ast::UnaryOp::Deref) {
- return expr.expr().expect("`display_place_source_code()` produced an invalid expr");
- }
+ if let ast::Expr::PrefixExpr(expr) = &place
+ && expr.op_kind() == Some(ast::UnaryOp::Deref)
+ {
+ return expr.expr().expect("`display_place_source_code()` produced an invalid expr");
}
make::expr_ref(place, needs_mut)
}
@@ -642,11 +642,11 @@
expr = ast::Expr::cast(parent).unwrap();
continue;
}
- if let Some(stmt_list) = ast::StmtList::cast(parent) {
- if let Some(block) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast) {
- expr = ast::Expr::BlockExpr(block);
- continue;
- }
+ if let Some(stmt_list) = ast::StmtList::cast(parent)
+ && let Some(block) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast)
+ {
+ expr = ast::Expr::BlockExpr(block);
+ continue;
}
break;
}
@@ -662,12 +662,11 @@
if let Some(let_stmt) = ast::LetStmt::cast(ancestor.clone()) {
break 'find_expr let_stmt.initializer();
}
- if ast::MatchArm::can_cast(ancestor.kind()) {
- if let Some(match_) =
+ if ast::MatchArm::can_cast(ancestor.kind())
+ && let Some(match_) =
ancestor.parent().and_then(|it| it.parent()).and_then(ast::MatchExpr::cast)
- {
- break 'find_expr match_.expr();
- }
+ {
+ break 'find_expr match_.expr();
}
if ast::ExprStmt::can_cast(ancestor.kind()) {
break;
diff --git a/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs b/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs
index db41927..a4742bc 100644
--- a/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs
+++ b/crates/ide-assists/src/handlers/convert_from_to_tryfrom.rs
@@ -50,10 +50,10 @@
let associated_items = impl_.assoc_item_list()?;
let from_fn = associated_items.assoc_items().find_map(|item| {
- if let ast::AssocItem::Fn(f) = item {
- if f.name()?.text() == "from" {
- return Some(f);
- }
+ if let ast::AssocItem::Fn(f) = item
+ && f.name()?.text() == "from"
+ {
+ return Some(f);
};
None
})?;
@@ -110,12 +110,11 @@
))
.clone_for_update();
- if let Some(cap) = ctx.config.snippet_cap {
- if let ast::AssocItem::TypeAlias(type_alias) = &error_type {
- if let Some(ty) = type_alias.ty() {
- builder.add_placeholder_snippet(cap, ty);
- }
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let ast::AssocItem::TypeAlias(type_alias) = &error_type
+ && let Some(ty) = type_alias.ty()
+ {
+ builder.add_placeholder_snippet(cap, ty);
}
associated_items.add_item_at_start(error_type);
diff --git a/crates/ide-assists/src/handlers/convert_into_to_from.rs b/crates/ide-assists/src/handlers/convert_into_to_from.rs
index b80276a..3d9cde0 100644
--- a/crates/ide-assists/src/handlers/convert_into_to_from.rs
+++ b/crates/ide-assists/src/handlers/convert_into_to_from.rs
@@ -65,10 +65,10 @@
};
let into_fn = impl_.assoc_item_list()?.assoc_items().find_map(|item| {
- if let ast::AssocItem::Fn(f) = item {
- if f.name()?.text() == "into" {
- return Some(f);
- }
+ if let ast::AssocItem::Fn(f) = item
+ && f.name()?.text() == "into"
+ {
+ return Some(f);
};
None
})?;
diff --git a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
index cca4cb9..247c101 100644
--- a/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
+++ b/crates/ide-assists/src/handlers/convert_tuple_return_type_to_struct.rs
@@ -265,10 +265,10 @@
let tail_cb = &mut |e: &_| tail_cb_impl(&mut exprs_to_wrap, e);
walk_expr(&body, &mut |expr| {
- if let ast::Expr::ReturnExpr(ret_expr) = expr {
- if let Some(ret_expr_arg) = &ret_expr.expr() {
- for_each_tail_expr(ret_expr_arg, tail_cb);
- }
+ if let ast::Expr::ReturnExpr(ret_expr) = expr
+ && let Some(ret_expr_arg) = &ret_expr.expr()
+ {
+ for_each_tail_expr(ret_expr_arg, tail_cb);
}
});
for_each_tail_expr(&body, tail_cb);
diff --git a/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs b/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs
index b27ebca..3d78895 100644
--- a/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs
+++ b/crates/ide-assists/src/handlers/convert_tuple_struct_to_named_struct.rs
@@ -192,7 +192,7 @@
).syntax().clone()
)
},
- _ => return None,
+ _ => None,
}
}
};
diff --git a/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs b/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs
index e582aa8..1af5db1 100644
--- a/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs
+++ b/crates/ide-assists/src/handlers/convert_two_arm_bool_match_to_matches_macro.rs
@@ -100,10 +100,10 @@
sema: &Semantics<'_, RootDatabase>,
expr: &ast::Expr,
) -> Option<ArmBodyExpression> {
- if let ast::Expr::Literal(lit) = expr {
- if let ast::LiteralKind::Bool(b) = lit.kind() {
- return Some(ArmBodyExpression::Literal(b));
- }
+ if let ast::Expr::Literal(lit) = expr
+ && let ast::LiteralKind::Bool(b) = lit.kind()
+ {
+ return Some(ArmBodyExpression::Literal(b));
}
if !sema.type_of_expr(expr)?.original.is_bool() {
diff --git a/crates/ide-assists/src/handlers/desugar_try_expr.rs b/crates/ide-assists/src/handlers/desugar_try_expr.rs
index efadde9..9976e34 100644
--- a/crates/ide-assists/src/handlers/desugar_try_expr.rs
+++ b/crates/ide-assists/src/handlers/desugar_try_expr.rs
@@ -106,73 +106,73 @@
},
);
- if let Some(let_stmt) = try_expr.syntax().parent().and_then(ast::LetStmt::cast) {
- if let_stmt.let_else().is_none() {
- let pat = let_stmt.pat()?;
- acc.add(
- AssistId::refactor_rewrite("desugar_try_expr_let_else"),
- "Replace try expression with let else",
- target,
- |builder| {
- let make = SyntaxFactory::with_mappings();
- let mut editor = builder.make_editor(let_stmt.syntax());
+ if let Some(let_stmt) = try_expr.syntax().parent().and_then(ast::LetStmt::cast)
+ && let_stmt.let_else().is_none()
+ {
+ let pat = let_stmt.pat()?;
+ acc.add(
+ AssistId::refactor_rewrite("desugar_try_expr_let_else"),
+ "Replace try expression with let else",
+ target,
+ |builder| {
+ let make = SyntaxFactory::with_mappings();
+ let mut editor = builder.make_editor(let_stmt.syntax());
- let indent_level = IndentLevel::from_node(let_stmt.syntax());
- let new_let_stmt = make.let_else_stmt(
- try_enum.happy_pattern(pat),
- let_stmt.ty(),
- expr,
- make.block_expr(
- iter::once(
- make.expr_stmt(
- make.expr_return(Some(match try_enum {
- TryEnum::Option => make.expr_path(make.ident_path("None")),
- TryEnum::Result => make
- .expr_call(
- make.expr_path(make.ident_path("Err")),
- make.arg_list(iter::once(
- match ctx.config.expr_fill_default {
- ExprFillDefaultMode::Todo => make
- .expr_macro(
- make.ident_path("todo"),
- make.token_tree(
- syntax::SyntaxKind::L_PAREN,
- [],
- ),
- )
- .into(),
- ExprFillDefaultMode::Underscore => {
- make.expr_underscore().into()
- }
- ExprFillDefaultMode::Default => make
- .expr_macro(
- make.ident_path("todo"),
- make.token_tree(
- syntax::SyntaxKind::L_PAREN,
- [],
- ),
- )
- .into(),
- },
- )),
- )
- .into(),
- }))
- .indent(indent_level + 1)
- .into(),
- )
+ let indent_level = IndentLevel::from_node(let_stmt.syntax());
+ let new_let_stmt = make.let_else_stmt(
+ try_enum.happy_pattern(pat),
+ let_stmt.ty(),
+ expr,
+ make.block_expr(
+ iter::once(
+ make.expr_stmt(
+ make.expr_return(Some(match try_enum {
+ TryEnum::Option => make.expr_path(make.ident_path("None")),
+ TryEnum::Result => make
+ .expr_call(
+ make.expr_path(make.ident_path("Err")),
+ make.arg_list(iter::once(
+ match ctx.config.expr_fill_default {
+ ExprFillDefaultMode::Todo => make
+ .expr_macro(
+ make.ident_path("todo"),
+ make.token_tree(
+ syntax::SyntaxKind::L_PAREN,
+ [],
+ ),
+ )
+ .into(),
+ ExprFillDefaultMode::Underscore => {
+ make.expr_underscore().into()
+ }
+ ExprFillDefaultMode::Default => make
+ .expr_macro(
+ make.ident_path("todo"),
+ make.token_tree(
+ syntax::SyntaxKind::L_PAREN,
+ [],
+ ),
+ )
+ .into(),
+ },
+ )),
+ )
+ .into(),
+ }))
+ .indent(indent_level + 1)
.into(),
- ),
- None,
- )
- .indent(indent_level),
- );
- editor.replace(let_stmt.syntax(), new_let_stmt.syntax());
- editor.add_mappings(make.finish_with_mappings());
- builder.add_file_edits(ctx.vfs_file_id(), editor);
- },
- );
- }
+ )
+ .into(),
+ ),
+ None,
+ )
+ .indent(indent_level),
+ );
+ editor.replace(let_stmt.syntax(), new_let_stmt.syntax());
+ editor.add_mappings(make.finish_with_mappings());
+ builder.add_file_edits(ctx.vfs_file_id(), editor);
+ },
+ );
}
Some(())
}
diff --git a/crates/ide-assists/src/handlers/expand_glob_import.rs b/crates/ide-assists/src/handlers/expand_glob_import.rs
index 307414c..66552dd 100644
--- a/crates/ide-assists/src/handlers/expand_glob_import.rs
+++ b/crates/ide-assists/src/handlers/expand_glob_import.rs
@@ -272,16 +272,16 @@
.clone()
.into_iter()
.filter(|r| {
- if let Definition::Trait(tr) = r.def {
- if tr.items(ctx.db()).into_iter().any(|ai| {
+ if let Definition::Trait(tr) = r.def
+ && tr.items(ctx.db()).into_iter().any(|ai| {
if let AssocItem::Function(f) = ai {
def_is_referenced_in(Definition::Function(f), ctx)
} else {
false
}
- }) {
- return true;
- }
+ })
+ {
+ return true;
}
def_is_referenced_in(r.def, ctx)
diff --git a/crates/ide-assists/src/handlers/extract_function.rs b/crates/ide-assists/src/handlers/extract_function.rs
index 00cbef1..890b8dd 100644
--- a/crates/ide-assists/src/handlers/extract_function.rs
+++ b/crates/ide-assists/src/handlers/extract_function.rs
@@ -175,10 +175,10 @@
let fn_def = format_function(ctx, module, &fun, old_indent).clone_for_update();
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(name) = fn_def.name() {
- builder.add_tabstop_before(cap, name);
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let Some(name) = fn_def.name()
+ {
+ builder.add_tabstop_before(cap, name);
}
let fn_def = match fun.self_param_adt(ctx) {
@@ -289,10 +289,10 @@
// Covering element returned the parent block of one or multiple statements that have been selected
if let Some(stmt_list) = ast::StmtList::cast(node.clone()) {
- if let Some(block_expr) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast) {
- if block_expr.syntax().text_range() == selection_range {
- return FunctionBody::from_expr(block_expr.into());
- }
+ if let Some(block_expr) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast)
+ && block_expr.syntax().text_range() == selection_range
+ {
+ return FunctionBody::from_expr(block_expr.into());
}
// Extract the full statements.
@@ -915,11 +915,10 @@
ast::Fn(fn_) => {
let func = sema.to_def(&fn_)?;
let mut ret_ty = func.ret_type(sema.db);
- if func.is_async(sema.db) {
- if let Some(async_ret) = func.async_ret_type(sema.db) {
+ if func.is_async(sema.db)
+ && let Some(async_ret) = func.async_ret_type(sema.db) {
ret_ty = async_ret;
}
- }
(fn_.const_token().is_some(), fn_.body().map(ast::Expr::BlockExpr), Some(ret_ty))
},
ast::Static(statik) => {
@@ -1172,19 +1171,19 @@
/// Search `parent`'s ancestors for items with potentially applicable generic parameters
fn generic_parents(parent: &SyntaxNode) -> Vec<GenericParent> {
let mut list = Vec::new();
- if let Some(parent_item) = parent.ancestors().find_map(ast::Item::cast) {
- if let ast::Item::Fn(ref fn_) = parent_item {
- if let Some(parent_parent) =
- parent_item.syntax().parent().and_then(|it| it.parent()).and_then(ast::Item::cast)
- {
- match parent_parent {
- ast::Item::Impl(impl_) => list.push(GenericParent::Impl(impl_)),
- ast::Item::Trait(trait_) => list.push(GenericParent::Trait(trait_)),
- _ => (),
- }
+ if let Some(parent_item) = parent.ancestors().find_map(ast::Item::cast)
+ && let ast::Item::Fn(ref fn_) = parent_item
+ {
+ if let Some(parent_parent) =
+ parent_item.syntax().parent().and_then(|it| it.parent()).and_then(ast::Item::cast)
+ {
+ match parent_parent {
+ ast::Item::Impl(impl_) => list.push(GenericParent::Impl(impl_)),
+ ast::Item::Trait(trait_) => list.push(GenericParent::Trait(trait_)),
+ _ => (),
}
- list.push(GenericParent::Fn(fn_.clone()));
}
+ list.push(GenericParent::Fn(fn_.clone()));
}
list
}
@@ -1337,10 +1336,10 @@
// see https://github.com/rust-lang/rust-analyzer/pull/7535#discussion_r570048550
let mut res = FxIndexSet::default();
body.walk_pat(&mut |pat| {
- if let ast::Pat::IdentPat(pat) = pat {
- if let Some(local) = sema.to_def(&pat) {
- res.insert(local);
- }
+ if let ast::Pat::IdentPat(pat) = pat
+ && let Some(local) = sema.to_def(&pat)
+ {
+ res.insert(local);
}
});
res
@@ -1445,11 +1444,11 @@
fn fixup_call_site(builder: &mut SourceChangeBuilder, body: &FunctionBody) {
let parent_match_arm = body.parent().and_then(ast::MatchArm::cast);
- if let Some(parent_match_arm) = parent_match_arm {
- if parent_match_arm.comma_token().is_none() {
- let parent_match_arm = builder.make_mut(parent_match_arm);
- ted::append_child_raw(parent_match_arm.syntax(), make::token(T![,]));
- }
+ if let Some(parent_match_arm) = parent_match_arm
+ && parent_match_arm.comma_token().is_none()
+ {
+ let parent_match_arm = builder.make_mut(parent_match_arm);
+ ted::append_child_raw(parent_match_arm.syntax(), make::token(T![,]));
}
}
@@ -2120,29 +2119,29 @@
_ => {}
},
WalkEvent::Leave(e) => {
- if nested_scope.is_none() {
- if let Some(expr) = ast::Expr::cast(e.clone()) {
- match expr {
- ast::Expr::ReturnExpr(return_expr) => {
- let expr = return_expr.expr();
- if let Some(replacement) = make_rewritten_flow(handler, expr) {
- ted::replace(return_expr.syntax(), replacement.syntax())
- }
+ if nested_scope.is_none()
+ && let Some(expr) = ast::Expr::cast(e.clone())
+ {
+ match expr {
+ ast::Expr::ReturnExpr(return_expr) => {
+ let expr = return_expr.expr();
+ if let Some(replacement) = make_rewritten_flow(handler, expr) {
+ ted::replace(return_expr.syntax(), replacement.syntax())
}
- ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => {
- let expr = break_expr.expr();
- if let Some(replacement) = make_rewritten_flow(handler, expr) {
- ted::replace(break_expr.syntax(), replacement.syntax())
- }
+ }
+ ast::Expr::BreakExpr(break_expr) if nested_loop.is_none() => {
+ let expr = break_expr.expr();
+ if let Some(replacement) = make_rewritten_flow(handler, expr) {
+ ted::replace(break_expr.syntax(), replacement.syntax())
}
- ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => {
- if let Some(replacement) = make_rewritten_flow(handler, None) {
- ted::replace(continue_expr.syntax(), replacement.syntax())
- }
+ }
+ ast::Expr::ContinueExpr(continue_expr) if nested_loop.is_none() => {
+ if let Some(replacement) = make_rewritten_flow(handler, None) {
+ ted::replace(continue_expr.syntax(), replacement.syntax())
}
- _ => {
- // do nothing
- }
+ }
+ _ => {
+ // do nothing
}
}
}
diff --git a/crates/ide-assists/src/handlers/extract_module.rs b/crates/ide-assists/src/handlers/extract_module.rs
index b82b798..c6a6b97 100644
--- a/crates/ide-assists/src/handlers/extract_module.rs
+++ b/crates/ide-assists/src/handlers/extract_module.rs
@@ -69,13 +69,12 @@
let mut impl_parent: Option<ast::Impl> = None;
let mut impl_child_count: usize = 0;
- if let Some(parent_assoc_list) = node.parent() {
- if let Some(parent_impl) = parent_assoc_list.parent() {
- if let Some(impl_) = ast::Impl::cast(parent_impl) {
- impl_child_count = parent_assoc_list.children().count();
- impl_parent = Some(impl_);
- }
- }
+ if let Some(parent_assoc_list) = node.parent()
+ && let Some(parent_impl) = parent_assoc_list.parent()
+ && let Some(impl_) = ast::Impl::cast(parent_impl)
+ {
+ impl_child_count = parent_assoc_list.children().count();
+ impl_parent = Some(impl_);
}
let mut curr_parent_module: Option<ast::Module> = None;
@@ -436,10 +435,10 @@
}
})
.for_each(|(node, def)| {
- if node_set.insert(node.to_string()) {
- if let Some(import) = self.process_def_in_sel(def, &node, &module, ctx) {
- check_intersection_and_push(&mut imports_to_remove, import);
- }
+ if node_set.insert(node.to_string())
+ && let Some(import) = self.process_def_in_sel(def, &node, &module, ctx)
+ {
+ check_intersection_and_push(&mut imports_to_remove, import);
}
})
}
@@ -542,15 +541,16 @@
import_path_to_be_removed = Some(text_range);
}
- if def_in_mod && def_out_sel {
- if let Some(first_path_in_use_tree) = use_tree_str.last() {
- let first_path_in_use_tree_str = first_path_in_use_tree.to_string();
- if !first_path_in_use_tree_str.contains("super")
- && !first_path_in_use_tree_str.contains("crate")
- {
- let super_path = make::ext::ident_path("super");
- use_tree_str.push(super_path);
- }
+ if def_in_mod
+ && def_out_sel
+ && let Some(first_path_in_use_tree) = use_tree_str.last()
+ {
+ let first_path_in_use_tree_str = first_path_in_use_tree.to_string();
+ if !first_path_in_use_tree_str.contains("super")
+ && !first_path_in_use_tree_str.contains("crate")
+ {
+ let super_path = make::ext::ident_path("super");
+ use_tree_str.push(super_path);
}
}
@@ -563,12 +563,11 @@
if let Some(mut use_tree_paths) = use_tree_paths {
use_tree_paths.reverse();
- if uses_exist_out_sel || !uses_exist_in_sel || !def_in_mod || !def_out_sel {
- if let Some(first_path_in_use_tree) = use_tree_paths.first() {
- if first_path_in_use_tree.to_string().contains("super") {
- use_tree_paths.insert(0, make::ext::ident_path("super"));
- }
- }
+ if (uses_exist_out_sel || !uses_exist_in_sel || !def_in_mod || !def_out_sel)
+ && let Some(first_path_in_use_tree) = use_tree_paths.first()
+ && first_path_in_use_tree.to_string().contains("super")
+ {
+ use_tree_paths.insert(0, make::ext::ident_path("super"));
}
let is_item = matches!(
@@ -691,11 +690,9 @@
_ => source.file_id.original_file(ctx.db()).file_id(ctx.db()) == curr_file_id,
};
- if have_same_parent {
- if let ModuleSource::Module(module_) = source.value {
- let in_sel = !selection_range.contains_range(module_.syntax().text_range());
- return (have_same_parent, in_sel);
- }
+ if have_same_parent && let ModuleSource::Module(module_) = source.value {
+ let in_sel = !selection_range.contains_range(module_.syntax().text_range());
+ return (have_same_parent, in_sel);
}
return (have_same_parent, false);
@@ -772,12 +769,12 @@
.filter(|x| x.to_string() != path.to_string())
.filter_map(ast::UseTree::cast)
.find_map(|use_tree| {
- if let Some(upper_tree_path) = use_tree.path() {
- if upper_tree_path.to_string() != path.to_string() {
- use_tree_str.push(upper_tree_path.clone());
- get_use_tree_paths_from_path(upper_tree_path, use_tree_str);
- return Some(use_tree);
- }
+ if let Some(upper_tree_path) = use_tree.path()
+ && upper_tree_path.to_string() != path.to_string()
+ {
+ use_tree_str.push(upper_tree_path.clone());
+ get_use_tree_paths_from_path(upper_tree_path, use_tree_str);
+ return Some(use_tree);
}
None
})?;
@@ -786,11 +783,11 @@
}
fn add_change_vis(vis: Option<ast::Visibility>, node_or_token_opt: Option<syntax::SyntaxElement>) {
- if vis.is_none() {
- if let Some(node_or_token) = node_or_token_opt {
- let pub_crate_vis = make::visibility_pub_crate().clone_for_update();
- ted::insert(ted::Position::before(node_or_token), pub_crate_vis.syntax());
- }
+ if vis.is_none()
+ && let Some(node_or_token) = node_or_token_opt
+ {
+ let pub_crate_vis = make::visibility_pub_crate().clone_for_update();
+ ted::insert(ted::Position::before(node_or_token), pub_crate_vis.syntax());
}
}
diff --git a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
index 9095b18..c56d0b3 100644
--- a/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
+++ b/crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
@@ -215,12 +215,12 @@
ast::GenericParam::LifetimeParam(lt)
if matches!(token.kind(), T![lifetime_ident]) =>
{
- if let Some(lt) = lt.lifetime() {
- if lt.text().as_str() == token.text() {
- *tag = true;
- tagged_one = true;
- break;
- }
+ if let Some(lt) = lt.lifetime()
+ && lt.text().as_str() == token.text()
+ {
+ *tag = true;
+ tagged_one = true;
+ break;
}
}
param if matches!(token.kind(), T![ident]) => {
diff --git a/crates/ide-assists/src/handlers/extract_type_alias.rs b/crates/ide-assists/src/handlers/extract_type_alias.rs
index d843ac6..79f2238 100644
--- a/crates/ide-assists/src/handlers/extract_type_alias.rs
+++ b/crates/ide-assists/src/handlers/extract_type_alias.rs
@@ -72,10 +72,10 @@
let ty_alias = make::ty_alias("Type", generic_params, None, None, Some((ty, None)))
.clone_for_update();
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(name) = ty_alias.name() {
- edit.add_annotation(name.syntax(), builder.make_tabstop_before(cap));
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let Some(name) = ty_alias.name()
+ {
+ edit.add_annotation(name.syntax(), builder.make_tabstop_before(cap));
}
let indent = IndentLevel::from_node(node);
@@ -111,17 +111,17 @@
match ty {
ast::Type::PathType(ty) => {
if let Some(path) = ty.path() {
- if let Some(name_ref) = path.as_single_name_ref() {
- if let Some(param) = known_generics.iter().find(|gp| {
+ if let Some(name_ref) = path.as_single_name_ref()
+ && let Some(param) = known_generics.iter().find(|gp| {
match gp {
ast::GenericParam::ConstParam(cp) => cp.name(),
ast::GenericParam::TypeParam(tp) => tp.name(),
_ => None,
}
.is_some_and(|n| n.text() == name_ref.text())
- }) {
- generics.push(param);
- }
+ })
+ {
+ generics.push(param);
}
generics.extend(
path.segments()
@@ -160,20 +160,18 @@
.and_then(|lt| known_generics.iter().find(find_lifetime(<.text()))),
),
ast::Type::ArrayType(ar) => {
- if let Some(ast::Expr::PathExpr(p)) = ar.const_arg().and_then(|x| x.expr()) {
- if let Some(path) = p.path() {
- if let Some(name_ref) = path.as_single_name_ref() {
- if let Some(param) = known_generics.iter().find(|gp| {
- if let ast::GenericParam::ConstParam(cp) = gp {
- cp.name().is_some_and(|n| n.text() == name_ref.text())
- } else {
- false
- }
- }) {
- generics.push(param);
- }
+ if let Some(ast::Expr::PathExpr(p)) = ar.const_arg().and_then(|x| x.expr())
+ && let Some(path) = p.path()
+ && let Some(name_ref) = path.as_single_name_ref()
+ && let Some(param) = known_generics.iter().find(|gp| {
+ if let ast::GenericParam::ConstParam(cp) = gp {
+ cp.name().is_some_and(|n| n.text() == name_ref.text())
+ } else {
+ false
}
- }
+ })
+ {
+ generics.push(param);
}
}
_ => (),
diff --git a/crates/ide-assists/src/handlers/extract_variable.rs b/crates/ide-assists/src/handlers/extract_variable.rs
index db2d316..c9c1969 100644
--- a/crates/ide-assists/src/handlers/extract_variable.rs
+++ b/crates/ide-assists/src/handlers/extract_variable.rs
@@ -404,11 +404,10 @@
}
if let Some(expr) =
node.parent().and_then(ast::StmtList::cast).and_then(|it| it.tail_expr())
+ && expr.syntax() == &node
{
- if expr.syntax() == &node {
- cov_mark::hit!(test_extract_var_last_expr);
- return Some(Anchor::Before(node));
- }
+ cov_mark::hit!(test_extract_var_last_expr);
+ return Some(Anchor::Before(node));
}
if let Some(parent) = node.parent() {
@@ -427,10 +426,10 @@
}
if let Some(stmt) = ast::Stmt::cast(node.clone()) {
- if let ast::Stmt::ExprStmt(stmt) = stmt {
- if stmt.expr().as_ref() == Some(to_extract) {
- return Some(Anchor::Replace(stmt));
- }
+ if let ast::Stmt::ExprStmt(stmt) = stmt
+ && stmt.expr().as_ref() == Some(to_extract)
+ {
+ return Some(Anchor::Replace(stmt));
}
return Some(Anchor::Before(node));
}
diff --git a/crates/ide-assists/src/handlers/generate_documentation_template.rs b/crates/ide-assists/src/handlers/generate_documentation_template.rs
index 68587f0..77232df 100644
--- a/crates/ide-assists/src/handlers/generate_documentation_template.rs
+++ b/crates/ide-assists/src/handlers/generate_documentation_template.rs
@@ -148,11 +148,11 @@
let self_name = self_name(ast_func);
format_to!(example, "use {use_path};\n\n");
- if let Some(self_name) = &self_name {
- if let Some(mut_) = is_ref_mut_self(ast_func) {
- let mut_ = if mut_ { "mut " } else { "" };
- format_to!(example, "let {mut_}{self_name} = ;\n");
- }
+ if let Some(self_name) = &self_name
+ && let Some(mut_) = is_ref_mut_self(ast_func)
+ {
+ let mut_ = if mut_ { "mut " } else { "" };
+ format_to!(example, "let {mut_}{self_name} = ;\n");
}
for param_name in &ref_mut_params {
format_to!(example, "let mut {param_name} = ;\n");
@@ -170,10 +170,10 @@
format_to!(example, "{function_call};\n");
}
// Check the mutated values
- if let Some(self_name) = &self_name {
- if is_ref_mut_self(ast_func) == Some(true) {
- format_to!(example, "assert_eq!({self_name}, );");
- }
+ if let Some(self_name) = &self_name
+ && is_ref_mut_self(ast_func) == Some(true)
+ {
+ format_to!(example, "assert_eq!({self_name}, );");
}
for param_name in &ref_mut_params {
format_to!(example, "assert_eq!({param_name}, );");
diff --git a/crates/ide-assists/src/handlers/generate_fn_type_alias.rs b/crates/ide-assists/src/handlers/generate_fn_type_alias.rs
index b63baa6..3c327a6 100644
--- a/crates/ide-assists/src/handlers/generate_fn_type_alias.rs
+++ b/crates/ide-assists/src/handlers/generate_fn_type_alias.rs
@@ -111,10 +111,10 @@
],
);
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(name) = ty_alias.name() {
- edit.add_annotation(name.syntax(), builder.make_placeholder_snippet(cap));
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let Some(name) = ty_alias.name()
+ {
+ edit.add_annotation(name.syntax(), builder.make_placeholder_snippet(cap));
}
builder.add_file_edits(ctx.vfs_file_id(), edit);
diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs
index 3290a70..613b32f 100644
--- a/crates/ide-assists/src/handlers/generate_function.rs
+++ b/crates/ide-assists/src/handlers/generate_function.rs
@@ -70,10 +70,10 @@
let TargetInfo { target_module, adt_info, target, file } =
fn_target_info(ctx, path, &call, fn_name)?;
- if let Some(m) = target_module {
- if !is_editable_crate(m.krate(), ctx.db()) {
- return None;
- }
+ if let Some(m) = target_module
+ && !is_editable_crate(m.krate(), ctx.db())
+ {
+ return None;
}
let function_builder =
diff --git a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs
index 20ee925..807b919 100644
--- a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs
+++ b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs
@@ -433,12 +433,11 @@
new_fn.indent(1.into());
// Insert a tabstop only for last method we generate
- if i == record_fields_count - 1 {
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(name) = new_fn.name() {
- builder.add_tabstop_before(cap, name);
- }
- }
+ if i == record_fields_count - 1
+ && let Some(cap) = ctx.config.snippet_cap
+ && let Some(name) = new_fn.name()
+ {
+ builder.add_tabstop_before(cap, name);
}
assoc_item_list.add_item(new_fn.clone().into());
diff --git a/crates/ide-assists/src/handlers/generate_impl.rs b/crates/ide-assists/src/handlers/generate_impl.rs
index 31cadcf..fcb81d2 100644
--- a/crates/ide-assists/src/handlers/generate_impl.rs
+++ b/crates/ide-assists/src/handlers/generate_impl.rs
@@ -58,11 +58,11 @@
let mut editor = edit.make_editor(nominal.syntax());
// Add a tabstop after the left curly brace
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(l_curly) = impl_.assoc_item_list().and_then(|it| it.l_curly_token()) {
- let tabstop = edit.make_tabstop_after(cap);
- editor.add_annotation(l_curly, tabstop);
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let Some(l_curly) = impl_.assoc_item_list().and_then(|it| it.l_curly_token())
+ {
+ let tabstop = edit.make_tabstop_after(cap);
+ editor.add_annotation(l_curly, tabstop);
}
insert_impl(&mut editor, &impl_, &nominal);
diff --git a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
index 92a4bd3..dc3dc73 100644
--- a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
+++ b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
@@ -175,18 +175,18 @@
}
fn strip_body(item: &ast::AssocItem) {
- if let ast::AssocItem::Fn(f) = item {
- if let Some(body) = f.body() {
- // In contrast to function bodies, we want to see no ws before a semicolon.
- // So let's remove them if we see any.
- if let Some(prev) = body.syntax().prev_sibling_or_token() {
- if prev.kind() == SyntaxKind::WHITESPACE {
- ted::remove(prev);
- }
- }
-
- ted::replace(body.syntax(), make::tokens::semicolon());
+ if let ast::AssocItem::Fn(f) = item
+ && let Some(body) = f.body()
+ {
+ // In contrast to function bodies, we want to see no ws before a semicolon.
+ // So let's remove them if we see any.
+ if let Some(prev) = body.syntax().prev_sibling_or_token()
+ && prev.kind() == SyntaxKind::WHITESPACE
+ {
+ ted::remove(prev);
}
+
+ ted::replace(body.syntax(), make::tokens::semicolon());
};
}
diff --git a/crates/ide-assists/src/handlers/inline_call.rs b/crates/ide-assists/src/handlers/inline_call.rs
index 1549b41..5367350 100644
--- a/crates/ide-assists/src/handlers/inline_call.rs
+++ b/crates/ide-assists/src/handlers/inline_call.rs
@@ -393,19 +393,17 @@
// `FileReference` incorrect
if let Some(imp) =
sema.ancestors_with_macros(fn_body.syntax().clone()).find_map(ast::Impl::cast)
+ && !node.syntax().ancestors().any(|anc| &anc == imp.syntax())
+ && let Some(t) = imp.self_ty()
{
- if !node.syntax().ancestors().any(|anc| &anc == imp.syntax()) {
- if let Some(t) = imp.self_ty() {
- while let Some(self_tok) = body
- .syntax()
- .descendants_with_tokens()
- .filter_map(NodeOrToken::into_token)
- .find(|tok| tok.kind() == SyntaxKind::SELF_TYPE_KW)
- {
- let replace_with = t.clone_subtree().syntax().clone_for_update();
- ted::replace(self_tok, replace_with);
- }
- }
+ while let Some(self_tok) = body
+ .syntax()
+ .descendants_with_tokens()
+ .filter_map(NodeOrToken::into_token)
+ .find(|tok| tok.kind() == SyntaxKind::SELF_TYPE_KW)
+ {
+ let replace_with = t.clone_subtree().syntax().clone_for_update();
+ ted::replace(self_tok, replace_with);
}
}
@@ -415,10 +413,10 @@
for stmt in fn_body.statements() {
if let Some(let_stmt) = ast::LetStmt::cast(stmt.syntax().to_owned()) {
for has_token in let_stmt.syntax().children_with_tokens() {
- if let Some(node) = has_token.as_node() {
- if let Some(ident_pat) = ast::IdentPat::cast(node.to_owned()) {
- func_let_vars.insert(ident_pat.syntax().text().to_string());
- }
+ if let Some(node) = has_token.as_node()
+ && let Some(ident_pat) = ast::IdentPat::cast(node.to_owned())
+ {
+ func_let_vars.insert(ident_pat.syntax().text().to_string());
}
}
}
@@ -534,16 +532,15 @@
}
}
- if let Some(generic_arg_list) = generic_arg_list.clone() {
- if let Some((target, source)) = &sema.scope(node.syntax()).zip(sema.scope(fn_body.syntax()))
- {
- body.reindent_to(IndentLevel(0));
- if let Some(new_body) = ast::BlockExpr::cast(
- PathTransform::function_call(target, source, function, generic_arg_list)
- .apply(body.syntax()),
- ) {
- body = new_body;
- }
+ if let Some(generic_arg_list) = generic_arg_list.clone()
+ && let Some((target, source)) = &sema.scope(node.syntax()).zip(sema.scope(fn_body.syntax()))
+ {
+ body.reindent_to(IndentLevel(0));
+ if let Some(new_body) = ast::BlockExpr::cast(
+ PathTransform::function_call(target, source, function, generic_arg_list)
+ .apply(body.syntax()),
+ ) {
+ body = new_body;
}
}
diff --git a/crates/ide-assists/src/handlers/move_const_to_impl.rs b/crates/ide-assists/src/handlers/move_const_to_impl.rs
index 0c1dc9e..a645c8b 100644
--- a/crates/ide-assists/src/handlers/move_const_to_impl.rs
+++ b/crates/ide-assists/src/handlers/move_const_to_impl.rs
@@ -43,10 +43,10 @@
let db = ctx.db();
let const_: ast::Const = ctx.find_node_at_offset()?;
// Don't show the assist when the cursor is at the const's body.
- if let Some(body) = const_.body() {
- if body.syntax().text_range().contains(ctx.offset()) {
- return None;
- }
+ if let Some(body) = const_.body()
+ && body.syntax().text_range().contains(ctx.offset())
+ {
+ return None;
}
let parent_fn = const_.syntax().ancestors().find_map(ast::Fn::cast)?;
diff --git a/crates/ide-assists/src/handlers/pull_assignment_up.rs b/crates/ide-assists/src/handlers/pull_assignment_up.rs
index 1b0c313..21debf6 100644
--- a/crates/ide-assists/src/handlers/pull_assignment_up.rs
+++ b/crates/ide-assists/src/handlers/pull_assignment_up.rs
@@ -62,10 +62,10 @@
return None;
};
- if let Some(parent) = tgt.syntax().parent() {
- if matches!(parent.kind(), syntax::SyntaxKind::BIN_EXPR | syntax::SyntaxKind::LET_STMT) {
- return None;
- }
+ if let Some(parent) = tgt.syntax().parent()
+ && matches!(parent.kind(), syntax::SyntaxKind::BIN_EXPR | syntax::SyntaxKind::LET_STMT)
+ {
+ return None;
}
let target = tgt.syntax().text_range();
@@ -90,10 +90,10 @@
let mut editor = SyntaxEditor::new(edit_tgt);
for (stmt, rhs) in assignments {
let mut stmt = stmt.syntax().clone();
- if let Some(parent) = stmt.parent() {
- if ast::ExprStmt::cast(parent.clone()).is_some() {
- stmt = parent.clone();
- }
+ if let Some(parent) = stmt.parent()
+ && ast::ExprStmt::cast(parent.clone()).is_some()
+ {
+ stmt = parent.clone();
}
editor.replace(stmt, rhs.syntax());
}
diff --git a/crates/ide-assists/src/handlers/raw_string.rs b/crates/ide-assists/src/handlers/raw_string.rs
index 94b49c5..2cbb24a 100644
--- a/crates/ide-assists/src/handlers/raw_string.rs
+++ b/crates/ide-assists/src/handlers/raw_string.rs
@@ -80,15 +80,15 @@
// parse inside string to escape `"`
let escaped = value.escape_default().to_string();
let suffix = string_suffix(token.text()).unwrap_or_default();
- if let Some(offsets) = token.quote_offsets() {
- if token.text()[offsets.contents - token.syntax().text_range().start()] == escaped {
- let end_quote = offsets.quotes.1;
- let end_quote =
- TextRange::new(end_quote.start(), end_quote.end() - TextSize::of(suffix));
- edit.replace(offsets.quotes.0, "\"");
- edit.replace(end_quote, "\"");
- return;
- }
+ if let Some(offsets) = token.quote_offsets()
+ && token.text()[offsets.contents - token.syntax().text_range().start()] == escaped
+ {
+ let end_quote = offsets.quotes.1;
+ let end_quote =
+ TextRange::new(end_quote.start(), end_quote.end() - TextSize::of(suffix));
+ edit.replace(offsets.quotes.0, "\"");
+ edit.replace(end_quote, "\"");
+ return;
}
edit.replace(token.syntax().text_range(), format!("\"{escaped}\"{suffix}"));
diff --git a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
index fa005a4..9f74213 100644
--- a/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
+++ b/crates/ide-assists/src/handlers/replace_qualified_name_with_use.rs
@@ -102,10 +102,10 @@
fn drop_generic_args(path: &ast::Path) -> ast::Path {
let path = path.clone_for_update();
- if let Some(segment) = path.segment() {
- if let Some(generic_args) = segment.generic_arg_list() {
- ted::remove(generic_args.syntax());
- }
+ if let Some(segment) = path.segment()
+ && let Some(generic_args) = segment.generic_arg_list()
+ {
+ ted::remove(generic_args.syntax());
}
path
}
diff --git a/crates/ide-assists/src/handlers/unnecessary_async.rs b/crates/ide-assists/src/handlers/unnecessary_async.rs
index ac10a82..b938577 100644
--- a/crates/ide-assists/src/handlers/unnecessary_async.rs
+++ b/crates/ide-assists/src/handlers/unnecessary_async.rs
@@ -41,10 +41,10 @@
return None;
}
// Do nothing if the method is a member of trait.
- if let Some(impl_) = function.syntax().ancestors().nth(2).and_then(ast::Impl::cast) {
- if impl_.trait_().is_some() {
- return None;
- }
+ if let Some(impl_) = function.syntax().ancestors().nth(2).and_then(ast::Impl::cast)
+ && impl_.trait_().is_some()
+ {
+ return None;
}
// Remove the `async` keyword plus whitespace after it, if any.
diff --git a/crates/ide-assists/src/handlers/unwrap_return_type.rs b/crates/ide-assists/src/handlers/unwrap_return_type.rs
index cf38262..eea6c85 100644
--- a/crates/ide-assists/src/handlers/unwrap_return_type.rs
+++ b/crates/ide-assists/src/handlers/unwrap_return_type.rs
@@ -72,20 +72,20 @@
let mut exprs_to_unwrap = Vec::new();
let tail_cb = &mut |e: &_| tail_cb_impl(&mut exprs_to_unwrap, e);
walk_expr(&body_expr, &mut |expr| {
- if let ast::Expr::ReturnExpr(ret_expr) = expr {
- if let Some(ret_expr_arg) = &ret_expr.expr() {
- for_each_tail_expr(ret_expr_arg, tail_cb);
- }
+ if let ast::Expr::ReturnExpr(ret_expr) = expr
+ && let Some(ret_expr_arg) = &ret_expr.expr()
+ {
+ for_each_tail_expr(ret_expr_arg, tail_cb);
}
});
for_each_tail_expr(&body_expr, tail_cb);
let is_unit_type = is_unit_type(&happy_type);
if is_unit_type {
- if let Some(NodeOrToken::Token(token)) = ret_type.syntax().next_sibling_or_token() {
- if token.kind() == SyntaxKind::WHITESPACE {
- editor.delete(token);
- }
+ if let Some(NodeOrToken::Token(token)) = ret_type.syntax().next_sibling_or_token()
+ && token.kind() == SyntaxKind::WHITESPACE
+ {
+ editor.delete(token);
}
editor.delete(ret_type.syntax());
@@ -162,10 +162,10 @@
}
}
- if let Some(cap) = ctx.config.snippet_cap {
- if let Some(final_placeholder) = final_placeholder {
- editor.add_annotation(final_placeholder.syntax(), builder.make_tabstop_after(cap));
- }
+ if let Some(cap) = ctx.config.snippet_cap
+ && let Some(final_placeholder) = final_placeholder
+ {
+ editor.add_annotation(final_placeholder.syntax(), builder.make_tabstop_after(cap));
}
editor.add_mappings(make.finish_with_mappings());
diff --git a/crates/ide-assists/src/handlers/unwrap_tuple.rs b/crates/ide-assists/src/handlers/unwrap_tuple.rs
index ecfecbb..46f3e85 100644
--- a/crates/ide-assists/src/handlers/unwrap_tuple.rs
+++ b/crates/ide-assists/src/handlers/unwrap_tuple.rs
@@ -47,10 +47,10 @@
if tuple_pat.fields().count() != tuple_init.fields().count() {
return None;
}
- if let Some(tys) = &tuple_ty {
- if tuple_pat.fields().count() != tys.fields().count() {
- return None;
- }
+ if let Some(tys) = &tuple_ty
+ && tuple_pat.fields().count() != tys.fields().count()
+ {
+ return None;
}
let parent = let_kw.parent()?;
diff --git a/crates/ide-assists/src/handlers/wrap_return_type.rs b/crates/ide-assists/src/handlers/wrap_return_type.rs
index d7189aa..0f089c9 100644
--- a/crates/ide-assists/src/handlers/wrap_return_type.rs
+++ b/crates/ide-assists/src/handlers/wrap_return_type.rs
@@ -101,24 +101,24 @@
let mut exprs_to_wrap = Vec::new();
let tail_cb = &mut |e: &_| tail_cb_impl(&mut exprs_to_wrap, e);
walk_expr(&body_expr, &mut |expr| {
- if let Expr::ReturnExpr(ret_expr) = expr {
- if let Some(ret_expr_arg) = &ret_expr.expr() {
- for_each_tail_expr(ret_expr_arg, tail_cb);
- }
+ if let Expr::ReturnExpr(ret_expr) = expr
+ && let Some(ret_expr_arg) = &ret_expr.expr()
+ {
+ for_each_tail_expr(ret_expr_arg, tail_cb);
}
});
for_each_tail_expr(&body_expr, tail_cb);
for ret_expr_arg in exprs_to_wrap {
- if let Some(ty) = ctx.sema.type_of_expr(&ret_expr_arg) {
- if ty.adjusted().could_unify_with(ctx.db(), &semantic_new_return_ty) {
- // The type is already correct, don't wrap it.
- // We deliberately don't use `could_unify_with_deeply()`, because as long as the outer
- // enum matches it's okay for us, as we don't trigger the assist if the return type
- // is already `Option`/`Result`, so mismatched exact type is more likely a mistake
- // than something intended.
- continue;
- }
+ if let Some(ty) = ctx.sema.type_of_expr(&ret_expr_arg)
+ && ty.adjusted().could_unify_with(ctx.db(), &semantic_new_return_ty)
+ {
+ // The type is already correct, don't wrap it.
+ // We deliberately don't use `could_unify_with_deeply()`, because as long as the outer
+ // enum matches it's okay for us, as we don't trigger the assist if the return type
+ // is already `Option`/`Result`, so mismatched exact type is more likely a mistake
+ // than something intended.
+ continue;
}
let happy_wrapped = make.expr_call(
@@ -147,13 +147,13 @@
ast::GenericArg::LifetimeArg(_) => false,
_ => true,
});
- if let Some(error_type_arg) = error_type_arg {
- if let Some(cap) = ctx.config.snippet_cap {
- editor.add_annotation(
- error_type_arg.syntax(),
- builder.make_placeholder_snippet(cap),
- );
- }
+ if let Some(error_type_arg) = error_type_arg
+ && let Some(cap) = ctx.config.snippet_cap
+ {
+ editor.add_annotation(
+ error_type_arg.syntax(),
+ builder.make_placeholder_snippet(cap),
+ );
}
}
diff --git a/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs b/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs
index 5183566..7d5740b 100644
--- a/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs
+++ b/crates/ide-assists/src/handlers/wrap_unwrap_cfg_attr.rs
@@ -200,13 +200,12 @@
],
);
- if let Some(snippet_cap) = ctx.config.snippet_cap {
- if let Some(first_meta) =
+ if let Some(snippet_cap) = ctx.config.snippet_cap
+ && let Some(first_meta) =
cfg_attr.meta().and_then(|meta| meta.token_tree()).and_then(|tt| tt.l_paren_token())
- {
- let tabstop = edit.make_tabstop_after(snippet_cap);
- editor.add_annotation(first_meta, tabstop);
- }
+ {
+ let tabstop = edit.make_tabstop_after(snippet_cap);
+ editor.add_annotation(first_meta, tabstop);
}
editor.add_mappings(make.finish_with_mappings());
@@ -256,13 +255,12 @@
editor.replace(attr.syntax(), cfg_attr.syntax());
- if let Some(snippet_cap) = ctx.config.snippet_cap {
- if let Some(first_meta) =
+ if let Some(snippet_cap) = ctx.config.snippet_cap
+ && let Some(first_meta) =
cfg_attr.meta().and_then(|meta| meta.token_tree()).and_then(|tt| tt.l_paren_token())
- {
- let tabstop = edit.make_tabstop_after(snippet_cap);
- editor.add_annotation(first_meta, tabstop);
- }
+ {
+ let tabstop = edit.make_tabstop_after(snippet_cap);
+ editor.add_annotation(first_meta, tabstop);
}
editor.add_mappings(make.finish_with_mappings());
diff --git a/crates/ide-assists/src/utils.rs b/crates/ide-assists/src/utils.rs
index 15c7a6a..77d471e 100644
--- a/crates/ide-assists/src/utils.rs
+++ b/crates/ide-assists/src/utils.rs
@@ -131,10 +131,10 @@
if ignore_items == IgnoreAssocItems::DocHiddenAttrPresent
&& assoc_item.attrs(sema.db).has_doc_hidden()
{
- if let hir::AssocItem::Function(f) = assoc_item {
- if !f.has_body(sema.db) {
- return true;
- }
+ if let hir::AssocItem::Function(f) = assoc_item
+ && !f.has_body(sema.db)
+ {
+ return true;
}
return false;
}
@@ -514,10 +514,10 @@
if !(same_ty && not_trait_impl) { None } else { Some(impl_blk) }
});
- if let Some(ref impl_blk) = block {
- if has_any_fn(impl_blk, names) {
- return None;
- }
+ if let Some(ref impl_blk) = block
+ && has_any_fn(impl_blk, names)
+ {
+ return None;
}
Some(block)
@@ -526,12 +526,11 @@
fn has_any_fn(imp: &ast::Impl, names: &[String]) -> bool {
if let Some(il) = imp.assoc_item_list() {
for item in il.assoc_items() {
- if let ast::AssocItem::Fn(f) = item {
- if let Some(name) = f.name() {
- if names.iter().any(|n| n.eq_ignore_ascii_case(&name.text())) {
- return true;
- }
- }
+ if let ast::AssocItem::Fn(f) = item
+ && let Some(name) = f.name()
+ && names.iter().any(|n| n.eq_ignore_ascii_case(&name.text()))
+ {
+ return true;
}
}
}
@@ -1021,12 +1020,12 @@
pub(crate) fn convert_param_list_to_arg_list(list: ast::ParamList) -> ast::ArgList {
let mut args = vec![];
for param in list.params() {
- if let Some(ast::Pat::IdentPat(pat)) = param.pat() {
- if let Some(name) = pat.name() {
- let name = name.to_string();
- let expr = make::expr_path(make::ext::ident_path(&name));
- args.push(expr);
- }
+ if let Some(ast::Pat::IdentPat(pat)) = param.pat()
+ && let Some(name) = pat.name()
+ {
+ let name = name.to_string();
+ let expr = make::expr_path(make::ext::ident_path(&name));
+ args.push(expr);
}
}
make::arg_list(args)
@@ -1138,12 +1137,11 @@
};
match expr {
ast::Expr::CallExpr(call) => {
- if let Some(ast::Expr::PathExpr(path_expr)) = call.expr() {
- if let Some(PathResolution::Def(ModuleDef::Function(func))) =
+ if let Some(ast::Expr::PathExpr(path_expr)) = call.expr()
+ && let Some(PathResolution::Def(ModuleDef::Function(func))) =
path_expr.path().and_then(|path| sema.resolve_path(&path))
- {
- is_const &= func.is_const(sema.db);
- }
+ {
+ is_const &= func.is_const(sema.db);
}
}
ast::Expr::MethodCallExpr(call) => {
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs
index 65072d9..11d2622 100644
--- a/crates/ide-completion/src/completions.rs
+++ b/crates/ide-completion/src/completions.rs
@@ -111,10 +111,11 @@
ctx: &CompletionContext<'_>,
super_chain_len: Option<usize>,
) {
- if let Some(len) = super_chain_len {
- if len > 0 && len < ctx.depth_from_crate_root {
- self.add_keyword(ctx, "super::");
- }
+ if let Some(len) = super_chain_len
+ && len > 0
+ && len < ctx.depth_from_crate_root
+ {
+ self.add_keyword(ctx, "super::");
}
}
@@ -643,10 +644,10 @@
let variants = enum_.variants(ctx.db);
- if let Some(impl_) = impl_.as_ref().and_then(|impl_| ctx.sema.to_def(impl_)) {
- if impl_.self_ty(ctx.db).as_adt() == Some(hir::Adt::Enum(enum_)) {
- variants.iter().for_each(|variant| process_variant(*variant));
- }
+ if let Some(impl_) = impl_.as_ref().and_then(|impl_| ctx.sema.to_def(impl_))
+ && impl_.self_ty(ctx.db).as_adt() == Some(hir::Adt::Enum(enum_))
+ {
+ variants.iter().for_each(|variant| process_variant(*variant));
}
for variant in variants {
diff --git a/crates/ide-completion/src/completions/dot.rs b/crates/ide-completion/src/completions/dot.rs
index 5340d65..f751233 100644
--- a/crates/ide-completion/src/completions/dot.rs
+++ b/crates/ide-completion/src/completions/dot.rs
@@ -258,12 +258,11 @@
fn on_trait_method(&mut self, func: hir::Function) -> ControlFlow<()> {
// This needs to come before the `seen_methods` test, so that if we see the same method twice,
// once as inherent and once not, we will include it.
- if let ItemContainer::Trait(trait_) = func.container(self.ctx.db) {
- if self.ctx.exclude_traits.contains(&trait_)
- || trait_.complete(self.ctx.db) == Complete::IgnoreMethods
- {
- return ControlFlow::Continue(());
- }
+ if let ItemContainer::Trait(trait_) = func.container(self.ctx.db)
+ && (self.ctx.exclude_traits.contains(&trait_)
+ || trait_.complete(self.ctx.db) == Complete::IgnoreMethods)
+ {
+ return ControlFlow::Continue(());
}
if func.self_param(self.ctx.db).is_some()
diff --git a/crates/ide-completion/src/completions/fn_param.rs b/crates/ide-completion/src/completions/fn_param.rs
index 809e71c..fb78386 100644
--- a/crates/ide-completion/src/completions/fn_param.rs
+++ b/crates/ide-completion/src/completions/fn_param.rs
@@ -128,10 +128,10 @@
{
let module = scope.module().into();
scope.process_all_names(&mut |name, def| {
- if let hir::ScopeDef::Local(local) = def {
- if let Ok(ty) = local.ty(ctx.db).display_source_code(ctx.db, module, true) {
- cb(name, ty);
- }
+ if let hir::ScopeDef::Local(local) = def
+ && let Ok(ty) = local.ty(ctx.db).display_source_code(ctx.db, module, true)
+ {
+ cb(name, ty);
}
});
}
diff --git a/crates/ide-completion/src/completions/item_list/trait_impl.rs b/crates/ide-completion/src/completions/item_list/trait_impl.rs
index bcf8c0e..cdd77e7 100644
--- a/crates/ide-completion/src/completions/item_list/trait_impl.rs
+++ b/crates/ide-completion/src/completions/item_list/trait_impl.rs
@@ -228,24 +228,22 @@
.set_documentation(func.docs(ctx.db))
.set_relevance(CompletionRelevance { exact_name_match: true, ..Default::default() });
- if let Some(source) = ctx.sema.source(func) {
- if let Some(transformed_fn) =
+ if let Some(source) = ctx.sema.source(func)
+ && let Some(transformed_fn) =
get_transformed_fn(ctx, source.value, impl_def, async_sugaring)
- {
- let function_decl =
- function_declaration(ctx, &transformed_fn, source.file_id.macro_file());
- match ctx.config.snippet_cap {
- Some(cap) => {
- let snippet = format!("{function_decl} {{\n $0\n}}");
- item.snippet_edit(cap, TextEdit::replace(replacement_range, snippet));
- }
- None => {
- let header = format!("{function_decl} {{");
- item.text_edit(TextEdit::replace(replacement_range, header));
- }
- };
- item.add_to(acc, ctx.db);
- }
+ {
+ let function_decl = function_declaration(ctx, &transformed_fn, source.file_id.macro_file());
+ match ctx.config.snippet_cap {
+ Some(cap) => {
+ let snippet = format!("{function_decl} {{\n $0\n}}");
+ item.snippet_edit(cap, TextEdit::replace(replacement_range, snippet));
+ }
+ None => {
+ let header = format!("{function_decl} {{");
+ item.text_edit(TextEdit::replace(replacement_range, header));
+ }
+ };
+ item.add_to(acc, ctx.db);
}
}
@@ -447,36 +445,36 @@
) {
let const_name = const_.name(ctx.db).map(|n| n.display_no_db(ctx.edition).to_smolstr());
- if let Some(const_name) = const_name {
- if let Some(source) = ctx.sema.source(const_) {
- let assoc_item = ast::AssocItem::Const(source.value);
- if let Some(transformed_item) = get_transformed_assoc_item(ctx, assoc_item, impl_def) {
- let transformed_const = match transformed_item {
- ast::AssocItem::Const(const_) => const_,
- _ => unreachable!(),
- };
+ if let Some(const_name) = const_name
+ && let Some(source) = ctx.sema.source(const_)
+ {
+ let assoc_item = ast::AssocItem::Const(source.value);
+ if let Some(transformed_item) = get_transformed_assoc_item(ctx, assoc_item, impl_def) {
+ let transformed_const = match transformed_item {
+ ast::AssocItem::Const(const_) => const_,
+ _ => unreachable!(),
+ };
- let label =
- make_const_compl_syntax(ctx, &transformed_const, source.file_id.macro_file());
- let replacement = format!("{label} ");
+ let label =
+ make_const_compl_syntax(ctx, &transformed_const, source.file_id.macro_file());
+ let replacement = format!("{label} ");
- let mut item =
- CompletionItem::new(SymbolKind::Const, replacement_range, label, ctx.edition);
- item.lookup_by(format_smolstr!("const {const_name}"))
- .set_documentation(const_.docs(ctx.db))
- .set_relevance(CompletionRelevance {
- exact_name_match: true,
- ..Default::default()
- });
- match ctx.config.snippet_cap {
- Some(cap) => item.snippet_edit(
- cap,
- TextEdit::replace(replacement_range, format!("{replacement}$0;")),
- ),
- None => item.text_edit(TextEdit::replace(replacement_range, replacement)),
- };
- item.add_to(acc, ctx.db);
- }
+ let mut item =
+ CompletionItem::new(SymbolKind::Const, replacement_range, label, ctx.edition);
+ item.lookup_by(format_smolstr!("const {const_name}"))
+ .set_documentation(const_.docs(ctx.db))
+ .set_relevance(CompletionRelevance {
+ exact_name_match: true,
+ ..Default::default()
+ });
+ match ctx.config.snippet_cap {
+ Some(cap) => item.snippet_edit(
+ cap,
+ TextEdit::replace(replacement_range, format!("{replacement}$0;")),
+ ),
+ None => item.text_edit(TextEdit::replace(replacement_range, replacement)),
+ };
+ item.add_to(acc, ctx.db);
}
}
}
diff --git a/crates/ide-completion/src/completions/mod_.rs b/crates/ide-completion/src/completions/mod_.rs
index 013747e..3333300 100644
--- a/crates/ide-completion/src/completions/mod_.rs
+++ b/crates/ide-completion/src/completions/mod_.rs
@@ -26,18 +26,17 @@
let mut current_module = ctx.module;
// For `mod $0`, `ctx.module` is its parent, but for `mod f$0`, it's `mod f` itself, but we're
// interested in its parent.
- if ctx.original_token.kind() == SyntaxKind::IDENT {
- if let Some(module) =
+ if ctx.original_token.kind() == SyntaxKind::IDENT
+ && let Some(module) =
ctx.original_token.parent_ancestors().nth(1).and_then(ast::Module::cast)
- {
- match ctx.sema.to_def(&module) {
- Some(module) if module == current_module => {
- if let Some(parent) = current_module.parent(ctx.db) {
- current_module = parent;
- }
+ {
+ match ctx.sema.to_def(&module) {
+ Some(module) if module == current_module => {
+ if let Some(parent) = current_module.parent(ctx.db) {
+ current_module = parent;
}
- _ => {}
}
+ _ => {}
}
}
diff --git a/crates/ide-completion/src/completions/pattern.rs b/crates/ide-completion/src/completions/pattern.rs
index 62fae1c..815ce51 100644
--- a/crates/ide-completion/src/completions/pattern.rs
+++ b/crates/ide-completion/src/completions/pattern.rs
@@ -64,18 +64,17 @@
if let Some(hir::Adt::Enum(e)) =
ctx.expected_type.as_ref().and_then(|ty| ty.strip_references().as_adt())
+ && (refutable || single_variant_enum(e))
{
- if refutable || single_variant_enum(e) {
- super::enum_variants_with_paths(
- acc,
- ctx,
- e,
- &pattern_ctx.impl_,
- |acc, ctx, variant, path| {
- acc.add_qualified_variant_pat(ctx, pattern_ctx, variant, path);
- },
- );
- }
+ super::enum_variants_with_paths(
+ acc,
+ ctx,
+ e,
+ &pattern_ctx.impl_,
+ |acc, ctx, variant, path| {
+ acc.add_qualified_variant_pat(ctx, pattern_ctx, variant, path);
+ },
+ );
}
// FIXME: ideally, we should look at the type we are matching against and
diff --git a/crates/ide-completion/src/completions/postfix.rs b/crates/ide-completion/src/completions/postfix.rs
index d002385..0058611 100644
--- a/crates/ide-completion/src/completions/postfix.rs
+++ b/crates/ide-completion/src/completions/postfix.rs
@@ -65,26 +65,19 @@
let cfg = ctx.config.import_path_config(ctx.is_nightly);
- if let Some(drop_trait) = ctx.famous_defs().core_ops_Drop() {
- if receiver_ty.impls_trait(ctx.db, drop_trait, &[]) {
- if let Some(drop_fn) = ctx.famous_defs().core_mem_drop() {
- if let Some(path) =
- ctx.module.find_path(ctx.db, ItemInNs::Values(drop_fn.into()), cfg)
- {
- cov_mark::hit!(postfix_drop_completion);
- let mut item = postfix_snippet(
- "drop",
- "fn drop(&mut self)",
- &format!(
- "{path}($0{receiver_text})",
- path = path.display(ctx.db, ctx.edition)
- ),
- );
- item.set_documentation(drop_fn.docs(ctx.db));
- item.add_to(acc, ctx.db);
- }
- }
- }
+ if let Some(drop_trait) = ctx.famous_defs().core_ops_Drop()
+ && receiver_ty.impls_trait(ctx.db, drop_trait, &[])
+ && let Some(drop_fn) = ctx.famous_defs().core_mem_drop()
+ && let Some(path) = ctx.module.find_path(ctx.db, ItemInNs::Values(drop_fn.into()), cfg)
+ {
+ cov_mark::hit!(postfix_drop_completion);
+ let mut item = postfix_snippet(
+ "drop",
+ "fn drop(&mut self)",
+ &format!("{path}($0{receiver_text})", path = path.display(ctx.db, ctx.edition)),
+ );
+ item.set_documentation(drop_fn.docs(ctx.db));
+ item.add_to(acc, ctx.db);
}
postfix_snippet("ref", "&expr", &format!("&{receiver_text}")).add_to(acc, ctx.db);
@@ -117,56 +110,50 @@
let try_enum = TryEnum::from_ty(&ctx.sema, &receiver_ty.strip_references());
let mut is_in_cond = false;
- if let Some(parent) = dot_receiver_including_refs.syntax().parent() {
- if let Some(second_ancestor) = parent.parent() {
- let sec_ancestor_kind = second_ancestor.kind();
- if let Some(expr) = <Either<ast::IfExpr, ast::WhileExpr>>::cast(second_ancestor) {
- is_in_cond = match expr {
- Either::Left(it) => it.condition().is_some_and(|cond| *cond.syntax() == parent),
- Either::Right(it) => {
- it.condition().is_some_and(|cond| *cond.syntax() == parent)
- }
- }
+ if let Some(parent) = dot_receiver_including_refs.syntax().parent()
+ && let Some(second_ancestor) = parent.parent()
+ {
+ let sec_ancestor_kind = second_ancestor.kind();
+ if let Some(expr) = <Either<ast::IfExpr, ast::WhileExpr>>::cast(second_ancestor) {
+ is_in_cond = match expr {
+ Either::Left(it) => it.condition().is_some_and(|cond| *cond.syntax() == parent),
+ Either::Right(it) => it.condition().is_some_and(|cond| *cond.syntax() == parent),
}
- match &try_enum {
- Some(try_enum) if is_in_cond => match try_enum {
- TryEnum::Result => {
- postfix_snippet(
- "let",
- "let Ok(_)",
- &format!("let Ok($0) = {receiver_text}"),
- )
+ }
+ match &try_enum {
+ Some(try_enum) if is_in_cond => match try_enum {
+ TryEnum::Result => {
+ postfix_snippet("let", "let Ok(_)", &format!("let Ok($0) = {receiver_text}"))
.add_to(acc, ctx.db);
- postfix_snippet(
- "letm",
- "let Ok(mut _)",
- &format!("let Ok(mut $0) = {receiver_text}"),
- )
- .add_to(acc, ctx.db);
- }
- TryEnum::Option => {
- postfix_snippet(
- "let",
- "let Some(_)",
- &format!("let Some($0) = {receiver_text}"),
- )
- .add_to(acc, ctx.db);
- postfix_snippet(
- "letm",
- "let Some(mut _)",
- &format!("let Some(mut $0) = {receiver_text}"),
- )
- .add_to(acc, ctx.db);
- }
- },
- _ if matches!(sec_ancestor_kind, STMT_LIST | EXPR_STMT) => {
- postfix_snippet("let", "let", &format!("let $0 = {receiver_text};"))
- .add_to(acc, ctx.db);
- postfix_snippet("letm", "let mut", &format!("let mut $0 = {receiver_text};"))
- .add_to(acc, ctx.db);
+ postfix_snippet(
+ "letm",
+ "let Ok(mut _)",
+ &format!("let Ok(mut $0) = {receiver_text}"),
+ )
+ .add_to(acc, ctx.db);
}
- _ => (),
+ TryEnum::Option => {
+ postfix_snippet(
+ "let",
+ "let Some(_)",
+ &format!("let Some($0) = {receiver_text}"),
+ )
+ .add_to(acc, ctx.db);
+ postfix_snippet(
+ "letm",
+ "let Some(mut _)",
+ &format!("let Some(mut $0) = {receiver_text}"),
+ )
+ .add_to(acc, ctx.db);
+ }
+ },
+ _ if matches!(sec_ancestor_kind, STMT_LIST | EXPR_STMT) => {
+ postfix_snippet("let", "let", &format!("let $0 = {receiver_text};"))
+ .add_to(acc, ctx.db);
+ postfix_snippet("letm", "let mut", &format!("let mut $0 = {receiver_text};"))
+ .add_to(acc, ctx.db);
}
+ _ => (),
}
}
@@ -258,25 +245,25 @@
)
.add_to(acc, ctx.db);
postfix_snippet("not", "!expr", &format!("!{receiver_text}")).add_to(acc, ctx.db);
- } else if let Some(trait_) = ctx.famous_defs().core_iter_IntoIterator() {
- if receiver_ty.impls_trait(ctx.db, trait_, &[]) {
- postfix_snippet(
- "for",
- "for ele in expr {}",
- &format!("for ele in {receiver_text} {{\n $0\n}}"),
- )
- .add_to(acc, ctx.db);
- }
+ } else if let Some(trait_) = ctx.famous_defs().core_iter_IntoIterator()
+ && receiver_ty.impls_trait(ctx.db, trait_, &[])
+ {
+ postfix_snippet(
+ "for",
+ "for ele in expr {}",
+ &format!("for ele in {receiver_text} {{\n $0\n}}"),
+ )
+ .add_to(acc, ctx.db);
}
}
let mut block_should_be_wrapped = true;
if dot_receiver.syntax().kind() == BLOCK_EXPR {
block_should_be_wrapped = false;
- if let Some(parent) = dot_receiver.syntax().parent() {
- if matches!(parent.kind(), IF_EXPR | WHILE_EXPR | LOOP_EXPR | FOR_EXPR) {
- block_should_be_wrapped = true;
- }
+ if let Some(parent) = dot_receiver.syntax().parent()
+ && matches!(parent.kind(), IF_EXPR | WHILE_EXPR | LOOP_EXPR | FOR_EXPR)
+ {
+ block_should_be_wrapped = true;
}
};
{
@@ -292,10 +279,10 @@
postfix_snippet("const", "const {}", &const_completion_string).add_to(acc, ctx.db);
}
- if let ast::Expr::Literal(literal) = dot_receiver_including_refs.clone() {
- if let Some(literal_text) = ast::String::cast(literal.token()) {
- add_format_like_completions(acc, ctx, &dot_receiver_including_refs, cap, &literal_text);
- }
+ if let ast::Expr::Literal(literal) = dot_receiver_including_refs.clone()
+ && let Some(literal_text) = ast::String::cast(literal.token())
+ {
+ add_format_like_completions(acc, ctx, &dot_receiver_including_refs, cap, &literal_text);
}
postfix_snippet(
diff --git a/crates/ide-completion/src/completions/use_.rs b/crates/ide-completion/src/completions/use_.rs
index d2ab193..f39b641 100644
--- a/crates/ide-completion/src/completions/use_.rs
+++ b/crates/ide-completion/src/completions/use_.rs
@@ -54,12 +54,10 @@
for (name, def) in module_scope {
if let (Some(attrs), Some(defining_crate)) =
(def.attrs(ctx.db), def.krate(ctx.db))
+ && (!ctx.check_stability(Some(&attrs))
+ || ctx.is_doc_hidden(&attrs, defining_crate))
{
- if !ctx.check_stability(Some(&attrs))
- || ctx.is_doc_hidden(&attrs, defining_crate)
- {
- continue;
- }
+ continue;
}
let is_name_already_imported =
already_imported_names.contains(name.as_str());
diff --git a/crates/ide-completion/src/completions/vis.rs b/crates/ide-completion/src/completions/vis.rs
index 38761f7..28d906d 100644
--- a/crates/ide-completion/src/completions/vis.rs
+++ b/crates/ide-completion/src/completions/vis.rs
@@ -20,11 +20,11 @@
// Try completing next child module of the path that is still a parent of the current module
let next_towards_current =
ctx.module.path_to_root(ctx.db).into_iter().take_while(|it| it != module).last();
- if let Some(next) = next_towards_current {
- if let Some(name) = next.name(ctx.db) {
- cov_mark::hit!(visibility_qualified);
- acc.add_module(ctx, path_ctx, next, name, vec![]);
- }
+ if let Some(next) = next_towards_current
+ && let Some(name) = next.name(ctx.db)
+ {
+ cov_mark::hit!(visibility_qualified);
+ acc.add_module(ctx, path_ctx, next, name, vec![]);
}
acc.add_super_keyword(ctx, *super_chain_len);
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index ea5fb39..2eabf99 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -287,24 +287,22 @@
&spec_attr,
fake_ident_token.clone(),
),
- ) {
- if let Some((fake_mapped_token, _)) =
- fake_mapped_tokens.into_iter().min_by_key(|(_, rank)| *rank)
- {
- return Some(ExpansionResult {
- original_file: original_file.value,
- speculative_file,
- original_offset,
- speculative_offset: fake_ident_token.text_range().start(),
- fake_ident_token,
- derive_ctx: Some((
- actual_expansion,
- fake_expansion,
- fake_mapped_token.text_range().start(),
- orig_attr,
- )),
- });
- }
+ ) && let Some((fake_mapped_token, _)) =
+ fake_mapped_tokens.into_iter().min_by_key(|(_, rank)| *rank)
+ {
+ return Some(ExpansionResult {
+ original_file: original_file.value,
+ speculative_file,
+ original_offset,
+ speculative_offset: fake_ident_token.text_range().start(),
+ fake_ident_token,
+ derive_ctx: Some((
+ actual_expansion,
+ fake_expansion,
+ fake_mapped_token.text_range().start(),
+ orig_attr,
+ )),
+ });
}
if let Some(spec_adt) =
@@ -535,14 +533,13 @@
NameRefKind::Path(PathCompletionCtx { kind: PathKind::Expr { .. }, path, .. }, ..),
..
} = &nameref_ctx
+ && is_in_token_of_for_loop(path)
{
- if is_in_token_of_for_loop(path) {
- // for pat $0
- // there is nothing to complete here except `in` keyword
- // don't bother populating the context
- // Ideally this special casing wouldn't be needed, but the parser recovers
- return None;
- }
+ // for pat $0
+ // there is nothing to complete here except `in` keyword
+ // don't bother populating the context
+ // Ideally this special casing wouldn't be needed, but the parser recovers
+ return None;
}
qual_ctx = qualifier_ctx;
@@ -951,29 +948,26 @@
let inbetween_body_and_decl_check = |node: SyntaxNode| {
if let Some(NodeOrToken::Node(n)) =
syntax::algo::non_trivia_sibling(node.into(), syntax::Direction::Prev)
+ && let Some(item) = ast::Item::cast(n)
{
- if let Some(item) = ast::Item::cast(n) {
- let is_inbetween = match &item {
- ast::Item::Const(it) => it.body().is_none() && it.semicolon_token().is_none(),
- ast::Item::Enum(it) => it.variant_list().is_none(),
- ast::Item::ExternBlock(it) => it.extern_item_list().is_none(),
- ast::Item::Fn(it) => it.body().is_none() && it.semicolon_token().is_none(),
- ast::Item::Impl(it) => it.assoc_item_list().is_none(),
- ast::Item::Module(it) => {
- it.item_list().is_none() && it.semicolon_token().is_none()
- }
- ast::Item::Static(it) => it.body().is_none(),
- ast::Item::Struct(it) => {
- it.field_list().is_none() && it.semicolon_token().is_none()
- }
- ast::Item::Trait(it) => it.assoc_item_list().is_none(),
- ast::Item::TypeAlias(it) => it.ty().is_none() && it.semicolon_token().is_none(),
- ast::Item::Union(it) => it.record_field_list().is_none(),
- _ => false,
- };
- if is_inbetween {
- return Some(item);
+ let is_inbetween = match &item {
+ ast::Item::Const(it) => it.body().is_none() && it.semicolon_token().is_none(),
+ ast::Item::Enum(it) => it.variant_list().is_none(),
+ ast::Item::ExternBlock(it) => it.extern_item_list().is_none(),
+ ast::Item::Fn(it) => it.body().is_none() && it.semicolon_token().is_none(),
+ ast::Item::Impl(it) => it.assoc_item_list().is_none(),
+ ast::Item::Module(it) => it.item_list().is_none() && it.semicolon_token().is_none(),
+ ast::Item::Static(it) => it.body().is_none(),
+ ast::Item::Struct(it) => {
+ it.field_list().is_none() && it.semicolon_token().is_none()
}
+ ast::Item::Trait(it) => it.assoc_item_list().is_none(),
+ ast::Item::TypeAlias(it) => it.ty().is_none() && it.semicolon_token().is_none(),
+ ast::Item::Union(it) => it.record_field_list().is_none(),
+ _ => false,
+ };
+ if is_inbetween {
+ return Some(item);
}
}
None
@@ -1502,10 +1496,10 @@
}
};
}
- } else if let Some(segment) = path.segment() {
- if segment.coloncolon_token().is_some() {
- path_ctx.qualified = Qualified::Absolute;
- }
+ } else if let Some(segment) = path.segment()
+ && segment.coloncolon_token().is_some()
+ {
+ path_ctx.qualified = Qualified::Absolute;
}
let mut qualifier_ctx = QualifierCtx::default();
@@ -1530,38 +1524,30 @@
if let Some(top) = top_node {
if let Some(NodeOrToken::Node(error_node)) =
syntax::algo::non_trivia_sibling(top.clone().into(), syntax::Direction::Prev)
+ && error_node.kind() == SyntaxKind::ERROR
{
- if error_node.kind() == SyntaxKind::ERROR {
- for token in
- error_node.children_with_tokens().filter_map(NodeOrToken::into_token)
- {
- match token.kind() {
- SyntaxKind::UNSAFE_KW => qualifier_ctx.unsafe_tok = Some(token),
- SyntaxKind::ASYNC_KW => qualifier_ctx.async_tok = Some(token),
- SyntaxKind::SAFE_KW => qualifier_ctx.safe_tok = Some(token),
- _ => {}
- }
+ for token in error_node.children_with_tokens().filter_map(NodeOrToken::into_token) {
+ match token.kind() {
+ SyntaxKind::UNSAFE_KW => qualifier_ctx.unsafe_tok = Some(token),
+ SyntaxKind::ASYNC_KW => qualifier_ctx.async_tok = Some(token),
+ SyntaxKind::SAFE_KW => qualifier_ctx.safe_tok = Some(token),
+ _ => {}
}
- qualifier_ctx.vis_node = error_node.children().find_map(ast::Visibility::cast);
}
+ qualifier_ctx.vis_node = error_node.children().find_map(ast::Visibility::cast);
}
- if let PathKind::Item { .. } = path_ctx.kind {
- if qualifier_ctx.none() {
- if let Some(t) = top.first_token() {
- if let Some(prev) = t
- .prev_token()
- .and_then(|t| syntax::algo::skip_trivia_token(t, Direction::Prev))
- {
- if ![T![;], T!['}'], T!['{']].contains(&prev.kind()) {
- // This was inferred to be an item position path, but it seems
- // to be part of some other broken node which leaked into an item
- // list
- return None;
- }
- }
- }
- }
+ if let PathKind::Item { .. } = path_ctx.kind
+ && qualifier_ctx.none()
+ && let Some(t) = top.first_token()
+ && let Some(prev) =
+ t.prev_token().and_then(|t| syntax::algo::skip_trivia_token(t, Direction::Prev))
+ && ![T![;], T!['}'], T!['{']].contains(&prev.kind())
+ {
+ // This was inferred to be an item position path, but it seems
+ // to be part of some other broken node which leaked into an item
+ // list
+ return None;
}
}
}
diff --git a/crates/ide-completion/src/item.rs b/crates/ide-completion/src/item.rs
index dcaac39..f27cd078 100644
--- a/crates/ide-completion/src/item.rs
+++ b/crates/ide-completion/src/item.rs
@@ -636,10 +636,10 @@
}
pub(crate) fn set_detail(&mut self, detail: Option<impl Into<String>>) -> &mut Builder {
self.detail = detail.map(Into::into);
- if let Some(detail) = &self.detail {
- if never!(detail.contains('\n'), "multiline detail:\n{}", detail) {
- self.detail = Some(detail.split('\n').next().unwrap().to_owned());
- }
+ if let Some(detail) = &self.detail
+ && never!(detail.contains('\n'), "multiline detail:\n{}", detail)
+ {
+ self.detail = Some(detail.split('\n').next().unwrap().to_owned());
}
self
}
diff --git a/crates/ide-completion/src/lib.rs b/crates/ide-completion/src/lib.rs
index 1fdd4cd..a70a113 100644
--- a/crates/ide-completion/src/lib.rs
+++ b/crates/ide-completion/src/lib.rs
@@ -208,9 +208,9 @@
// when the user types a bare `_` (that is it does not belong to an identifier)
// the user might just wanted to type a `_` for type inference or pattern discarding
// so try to suppress completions in those cases
- if trigger_character == Some('_') && ctx.original_token.kind() == syntax::SyntaxKind::UNDERSCORE
- {
- if let CompletionAnalysis::NameRef(NameRefContext {
+ if trigger_character == Some('_')
+ && ctx.original_token.kind() == syntax::SyntaxKind::UNDERSCORE
+ && let CompletionAnalysis::NameRef(NameRefContext {
kind:
NameRefKind::Path(
path_ctx @ PathCompletionCtx {
@@ -220,11 +220,9 @@
),
..
}) = analysis
- {
- if path_ctx.is_trivial_path() {
- return None;
- }
- }
+ && path_ctx.is_trivial_path()
+ {
+ return None;
}
{
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index c6b8af3..3d7a406 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -164,19 +164,18 @@
let expected_fn_type =
ctx.completion.expected_type.as_ref().is_some_and(|ty| ty.is_fn() || ty.is_closure());
- if !expected_fn_type {
- if let Some(receiver) = &dot_access.receiver {
- if let Some(receiver) = ctx.completion.sema.original_ast_node(receiver.clone()) {
- builder.insert(receiver.syntax().text_range().start(), "(".to_owned());
- builder.insert(ctx.source_range().end(), ")".to_owned());
+ if !expected_fn_type
+ && let Some(receiver) = &dot_access.receiver
+ && let Some(receiver) = ctx.completion.sema.original_ast_node(receiver.clone())
+ {
+ builder.insert(receiver.syntax().text_range().start(), "(".to_owned());
+ builder.insert(ctx.source_range().end(), ")".to_owned());
- let is_parens_needed =
- !matches!(dot_access.kind, DotAccessKind::Method { has_parens: true });
+ let is_parens_needed =
+ !matches!(dot_access.kind, DotAccessKind::Method { has_parens: true });
- if is_parens_needed {
- builder.insert(ctx.source_range().end(), "()".to_owned());
- }
- }
+ if is_parens_needed {
+ builder.insert(ctx.source_range().end(), "()".to_owned());
}
}
@@ -184,12 +183,11 @@
} else {
item.insert_text(field_with_receiver(receiver.as_deref(), &escaped_name));
}
- if let Some(receiver) = &dot_access.receiver {
- if let Some(original) = ctx.completion.sema.original_ast_node(receiver.clone()) {
- if let Some(ref_mode) = compute_ref_match(ctx.completion, ty) {
- item.ref_match(ref_mode, original.syntax().text_range().start());
- }
- }
+ if let Some(receiver) = &dot_access.receiver
+ && let Some(original) = ctx.completion.sema.original_ast_node(receiver.clone())
+ && let Some(ref_mode) = compute_ref_match(ctx.completion, ty)
+ {
+ item.ref_match(ref_mode, original.syntax().text_range().start());
}
item.doc_aliases(ctx.doc_aliases);
item.build(db)
@@ -437,26 +435,21 @@
path_ctx,
PathCompletionCtx { kind: PathKind::Type { .. }, has_type_args: false, .. }
) && config.callable.is_some();
- if type_path_no_ty_args {
- if let Some(cap) = cap {
- let has_non_default_type_params = match resolution {
- ScopeDef::ModuleDef(hir::ModuleDef::Adt(it)) => it.has_non_default_type_params(db),
- ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(it)) => {
- it.has_non_default_type_params(db)
- }
- _ => false,
- };
-
- if has_non_default_type_params {
- cov_mark::hit!(inserts_angle_brackets_for_generics);
- item.lookup_by(name.clone())
- .label(SmolStr::from_iter([&name, "<…>"]))
- .trigger_call_info()
- .insert_snippet(
- cap,
- format!("{}<$0>", local_name.display(db, completion.edition)),
- );
+ if type_path_no_ty_args && let Some(cap) = cap {
+ let has_non_default_type_params = match resolution {
+ ScopeDef::ModuleDef(hir::ModuleDef::Adt(it)) => it.has_non_default_type_params(db),
+ ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(it)) => {
+ it.has_non_default_type_params(db)
}
+ _ => false,
+ };
+
+ if has_non_default_type_params {
+ cov_mark::hit!(inserts_angle_brackets_for_generics);
+ item.lookup_by(name.clone())
+ .label(SmolStr::from_iter([&name, "<…>"]))
+ .trigger_call_info()
+ .insert_snippet(cap, format!("{}<$0>", local_name.display(db, completion.edition)));
}
}
@@ -634,23 +627,24 @@
if expected_type.could_unify_with(ctx.db, completion_ty) {
return None;
}
- if let Some(expected_without_ref) = &expected_without_ref {
- if completion_ty.autoderef(ctx.db).any(|ty| ty == *expected_without_ref) {
- cov_mark::hit!(suggest_ref);
- let mutability = if expected_type.is_mutable_reference() {
- hir::Mutability::Mut
- } else {
- hir::Mutability::Shared
- };
- return Some(CompletionItemRefMode::Reference(mutability));
- }
+ if let Some(expected_without_ref) = &expected_without_ref
+ && completion_ty.autoderef(ctx.db).any(|ty| ty == *expected_without_ref)
+ {
+ cov_mark::hit!(suggest_ref);
+ let mutability = if expected_type.is_mutable_reference() {
+ hir::Mutability::Mut
+ } else {
+ hir::Mutability::Shared
+ };
+ return Some(CompletionItemRefMode::Reference(mutability));
}
- if let Some(completion_without_ref) = completion_without_ref {
- if completion_without_ref == *expected_type && completion_without_ref.is_copy(ctx.db) {
- cov_mark::hit!(suggest_deref);
- return Some(CompletionItemRefMode::Dereference);
- }
+ if let Some(completion_without_ref) = completion_without_ref
+ && completion_without_ref == *expected_type
+ && completion_without_ref.is_copy(ctx.db)
+ {
+ cov_mark::hit!(suggest_deref);
+ return Some(CompletionItemRefMode::Dereference);
}
None
@@ -664,10 +658,10 @@
) {
if let Some(original_path) = &path_ctx.original_path {
// At least one char was typed by the user already, in that case look for the original path
- if let Some(original_path) = completion.sema.original_ast_node(original_path.clone()) {
- if let Some(ref_mode) = compute_ref_match(completion, ty) {
- item.ref_match(ref_mode, original_path.syntax().text_range().start());
- }
+ if let Some(original_path) = completion.sema.original_ast_node(original_path.clone())
+ && let Some(ref_mode) = compute_ref_match(completion, ty)
+ {
+ item.ref_match(ref_mode, original_path.syntax().text_range().start());
}
} else {
// completion requested on an empty identifier, there is no path here yet.
diff --git a/crates/ide-completion/src/render/const_.rs b/crates/ide-completion/src/render/const_.rs
index f11b302..707a8ae 100644
--- a/crates/ide-completion/src/render/const_.rs
+++ b/crates/ide-completion/src/render/const_.rs
@@ -25,10 +25,10 @@
.detail(detail)
.set_relevance(ctx.completion_relevance());
- if let Some(actm) = const_.as_assoc_item(db) {
- if let Some(trt) = actm.container_or_implemented_trait(db) {
- item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
- }
+ if let Some(actm) = const_.as_assoc_item(db)
+ && let Some(trt) = actm.container_or_implemented_trait(db)
+ {
+ item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
}
item.insert_text(escaped_name);
diff --git a/crates/ide-completion/src/render/function.rs b/crates/ide-completion/src/render/function.rs
index 7669aec..c466019 100644
--- a/crates/ide-completion/src/render/function.rs
+++ b/crates/ide-completion/src/render/function.rs
@@ -132,10 +132,10 @@
super::path_ref_match(completion, path_ctx, &ret_type, &mut item);
}
FuncKind::Method(DotAccess { receiver: Some(receiver), .. }, _) => {
- if let Some(original_expr) = completion.sema.original_ast_node(receiver.clone()) {
- if let Some(ref_mode) = compute_ref_match(completion, &ret_type) {
- item.ref_match(ref_mode, original_expr.syntax().text_range().start());
- }
+ if let Some(original_expr) = completion.sema.original_ast_node(receiver.clone())
+ && let Some(ref_mode) = compute_ref_match(completion, &ret_type)
+ {
+ item.ref_match(ref_mode, original_expr.syntax().text_range().start());
}
}
_ => (),
@@ -169,12 +169,10 @@
item.add_import(import_to_add);
}
None => {
- if let Some(actm) = assoc_item {
- if let Some(trt) = actm.container_or_implemented_trait(db) {
- item.trait_name(
- trt.name(db).display_no_db(ctx.completion.edition).to_smolstr(),
- );
- }
+ if let Some(actm) = assoc_item
+ && let Some(trt) = actm.container_or_implemented_trait(db)
+ {
+ item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
}
}
}
@@ -378,15 +376,13 @@
ctx.config.callable.as_ref()?;
// Don't add parentheses if the expected type is a function reference with the same signature.
- if let Some(expected) = ctx.expected_type.as_ref().filter(|e| e.is_fn()) {
- if let Some(expected) = expected.as_callable(ctx.db) {
- if let Some(completed) = func.ty(ctx.db).as_callable(ctx.db) {
- if expected.sig() == completed.sig() {
- cov_mark::hit!(no_call_parens_if_fn_ptr_needed);
- return None;
- }
- }
- }
+ if let Some(expected) = ctx.expected_type.as_ref().filter(|e| e.is_fn())
+ && let Some(expected) = expected.as_callable(ctx.db)
+ && let Some(completed) = func.ty(ctx.db).as_callable(ctx.db)
+ && expected.sig() == completed.sig()
+ {
+ cov_mark::hit!(no_call_parens_if_fn_ptr_needed);
+ return None;
}
let self_param = if has_dot_receiver || matches!(func_kind, FuncKind::Method(_, Some(_))) {
diff --git a/crates/ide-completion/src/render/type_alias.rs b/crates/ide-completion/src/render/type_alias.rs
index d57feee..3fc0f36 100644
--- a/crates/ide-completion/src/render/type_alias.rs
+++ b/crates/ide-completion/src/render/type_alias.rs
@@ -51,10 +51,10 @@
.detail(detail)
.set_relevance(ctx.completion_relevance());
- if let Some(actm) = type_alias.as_assoc_item(db) {
- if let Some(trt) = actm.container_or_implemented_trait(db) {
- item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
- }
+ if let Some(actm) = type_alias.as_assoc_item(db)
+ && let Some(trt) = actm.container_or_implemented_trait(db)
+ {
+ item.trait_name(trt.name(db).display_no_db(ctx.completion.edition).to_smolstr());
}
item.insert_text(escaped_name);
diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs
index a4a140e..2a4fcf6 100644
--- a/crates/ide-db/src/defs.rs
+++ b/crates/ide-db/src/defs.rs
@@ -610,18 +610,16 @@
let local = sema.to_def(&ident_pat)?;
let pat_parent = ident_pat.syntax().parent();
- if let Some(record_pat_field) = pat_parent.and_then(ast::RecordPatField::cast) {
- if record_pat_field.name_ref().is_none() {
- if let Some((field, _, adt_subst)) =
- sema.resolve_record_pat_field_with_subst(&record_pat_field)
- {
- return Some(NameClass::PatFieldShorthand {
- local_def: local,
- field_ref: field,
- adt_subst,
- });
- }
- }
+ if let Some(record_pat_field) = pat_parent.and_then(ast::RecordPatField::cast)
+ && record_pat_field.name_ref().is_none()
+ && let Some((field, _, adt_subst)) =
+ sema.resolve_record_pat_field_with_subst(&record_pat_field)
+ {
+ return Some(NameClass::PatFieldShorthand {
+ local_def: local,
+ field_ref: field,
+ adt_subst,
+ });
}
Some(NameClass::Definition(Definition::Local(local)))
}
@@ -755,30 +753,27 @@
let parent = name_ref.syntax().parent()?;
- if let Some(record_field) = ast::RecordExprField::for_field_name(name_ref) {
- if let Some((field, local, _, adt_subst)) =
+ if let Some(record_field) = ast::RecordExprField::for_field_name(name_ref)
+ && let Some((field, local, _, adt_subst)) =
sema.resolve_record_field_with_substitution(&record_field)
- {
- let res = match local {
- None => NameRefClass::Definition(Definition::Field(field), Some(adt_subst)),
- Some(local) => NameRefClass::FieldShorthand {
- field_ref: field,
- local_ref: local,
- adt_subst,
- },
- };
- return Some(res);
- }
+ {
+ let res = match local {
+ None => NameRefClass::Definition(Definition::Field(field), Some(adt_subst)),
+ Some(local) => {
+ NameRefClass::FieldShorthand { field_ref: field, local_ref: local, adt_subst }
+ }
+ };
+ return Some(res);
}
if let Some(path) = ast::PathSegment::cast(parent.clone()).map(|it| it.parent_path()) {
- if path.parent_path().is_none() {
- if let Some(macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) {
- // Only use this to resolve to macro calls for last segments as qualifiers resolve
- // to modules below.
- if let Some(macro_def) = sema.resolve_macro_call(¯o_call) {
- return Some(NameRefClass::Definition(Definition::Macro(macro_def), None));
- }
+ if path.parent_path().is_none()
+ && let Some(macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast)
+ {
+ // Only use this to resolve to macro calls for last segments as qualifiers resolve
+ // to modules below.
+ if let Some(macro_def) = sema.resolve_macro_call(¯o_call) {
+ return Some(NameRefClass::Definition(Definition::Macro(macro_def), None));
}
}
return sema
@@ -820,8 +815,8 @@
// ^^^^^
let containing_path = name_ref.syntax().ancestors().find_map(ast::Path::cast)?;
let resolved = sema.resolve_path(&containing_path)?;
- if let PathResolution::Def(ModuleDef::Trait(tr)) = resolved {
- if let Some(ty) = tr
+ if let PathResolution::Def(ModuleDef::Trait(tr)) = resolved
+ && let Some(ty) = tr
.items_with_supertraits(sema.db)
.iter()
.filter_map(|&assoc| match assoc {
@@ -833,7 +828,6 @@
// No substitution, this can only occur in type position.
return Some(NameRefClass::Definition(Definition::TypeAlias(ty), None));
}
- }
None
},
ast::UseBoundGenericArgs(_) => {
diff --git a/crates/ide-db/src/helpers.rs b/crates/ide-db/src/helpers.rs
index 3404290..1e54058 100644
--- a/crates/ide-db/src/helpers.rs
+++ b/crates/ide-db/src/helpers.rs
@@ -70,11 +70,11 @@
};
let mut defs: VecDeque<_> = module.declarations(db).into();
while let Some(def) = defs.pop_front() {
- if let ModuleDef::Module(submodule) = def {
- if submodule.is_inline(db) {
- defs.extend(submodule.declarations(db));
- submodule.impl_defs(db).into_iter().for_each(|impl_| cb(impl_.into()));
- }
+ if let ModuleDef::Module(submodule) = def
+ && submodule.is_inline(db)
+ {
+ defs.extend(submodule.declarations(db));
+ submodule.impl_defs(db).into_iter().for_each(|impl_| cb(impl_.into()));
}
cb(def.into());
}
diff --git a/crates/ide-db/src/imports/insert_use.rs b/crates/ide-db/src/imports/insert_use.rs
index 813f383..08cd8f2 100644
--- a/crates/ide-db/src/imports/insert_use.rs
+++ b/crates/ide-db/src/imports/insert_use.rs
@@ -97,12 +97,11 @@
.map(ImportScopeKind::Module)
.map(|kind| ImportScope { kind, required_cfgs });
} else if let Some(has_attrs) = ast::AnyHasAttrs::cast(syntax) {
- if block.is_none() {
- if let Some(b) = ast::BlockExpr::cast(has_attrs.syntax().clone()) {
- if let Some(b) = sema.original_ast_node(b) {
- block = b.stmt_list();
- }
- }
+ if block.is_none()
+ && let Some(b) = ast::BlockExpr::cast(has_attrs.syntax().clone())
+ && let Some(b) = sema.original_ast_node(b)
+ {
+ block = b.stmt_list();
}
if has_attrs
.attrs()
@@ -349,26 +348,24 @@
seen_one_style_groups.push((curr_vis.clone(), curr_attrs.clone()));
} else if eq_visibility(prev_vis, curr_vis.clone())
&& eq_attrs(prev_attrs, curr_attrs.clone())
+ && let Some((prev_path, curr_path)) = prev.path().zip(curr.path())
+ && let Some((prev_prefix, _)) = common_prefix(&prev_path, &curr_path)
{
- if let Some((prev_path, curr_path)) = prev.path().zip(curr.path()) {
- if let Some((prev_prefix, _)) = common_prefix(&prev_path, &curr_path) {
- if prev.use_tree_list().is_none() && curr.use_tree_list().is_none() {
- let prefix_c = prev_prefix.qualifiers().count();
- let curr_c = curr_path.qualifiers().count() - prefix_c;
- let prev_c = prev_path.qualifiers().count() - prefix_c;
- if curr_c == 1 && prev_c == 1 {
- // Same prefix, only differing in the last segment and no use tree lists so this has to be of item style.
- break ImportGranularityGuess::Item;
- } else {
- // Same prefix and no use tree list but differs in more than one segment at the end. This might be module style still.
- res = ImportGranularityGuess::ModuleOrItem;
- }
- } else {
- // Same prefix with item tree lists, has to be module style as it
- // can't be crate style since the trees wouldn't share a prefix then.
- break ImportGranularityGuess::Module;
- }
+ if prev.use_tree_list().is_none() && curr.use_tree_list().is_none() {
+ let prefix_c = prev_prefix.qualifiers().count();
+ let curr_c = curr_path.qualifiers().count() - prefix_c;
+ let prev_c = prev_path.qualifiers().count() - prefix_c;
+ if curr_c == 1 && prev_c == 1 {
+ // Same prefix, only differing in the last segment and no use tree lists so this has to be of item style.
+ break ImportGranularityGuess::Item;
+ } else {
+ // Same prefix and no use tree list but differs in more than one segment at the end. This might be module style still.
+ res = ImportGranularityGuess::ModuleOrItem;
}
+ } else {
+ // Same prefix with item tree lists, has to be module style as it
+ // can't be crate style since the trees wouldn't share a prefix then.
+ break ImportGranularityGuess::Module;
}
}
prev = curr;
diff --git a/crates/ide-db/src/path_transform.rs b/crates/ide-db/src/path_transform.rs
index b7432d8..5d88afe 100644
--- a/crates/ide-db/src/path_transform.rs
+++ b/crates/ide-db/src/path_transform.rs
@@ -193,13 +193,12 @@
}
}
(Either::Right(k), None) => {
- if let Some(default) = k.default(db) {
- if let Some(default) =
+ if let Some(default) = k.default(db)
+ && let Some(default) =
&default.display_source_code(db, source_module.into(), false).ok()
- {
- type_substs.insert(k, make::ty(default).clone_for_update());
- defaulted_params.push(Either::Left(k));
- }
+ {
+ type_substs.insert(k, make::ty(default).clone_for_update());
+ defaulted_params.push(Either::Left(k));
}
}
(Either::Left(k), Some(TypeOrConst::Either(v))) => {
@@ -221,11 +220,10 @@
(Either::Left(k), None) => {
if let Some(default) =
k.default(db, target_module.krate().to_display_target(db))
+ && let Some(default) = default.expr()
{
- if let Some(default) = default.expr() {
- const_substs.insert(k, default.syntax().clone_for_update());
- defaulted_params.push(Either::Right(k));
- }
+ const_substs.insert(k, default.syntax().clone_for_update());
+ defaulted_params.push(Either::Right(k));
}
}
_ => (), // ignore mismatching params
@@ -427,14 +425,14 @@
}
}
hir::PathResolution::Def(def) if def.as_assoc_item(self.source_scope.db).is_none() => {
- if let hir::ModuleDef::Trait(_) = def {
- if matches!(path.segment()?.kind()?, ast::PathSegmentKind::Type { .. }) {
- // `speculative_resolve` resolves segments like `<T as
- // Trait>` into `Trait`, but just the trait name should
- // not be used as the replacement of the original
- // segment.
- return None;
- }
+ if let hir::ModuleDef::Trait(_) = def
+ && matches!(path.segment()?.kind()?, ast::PathSegmentKind::Type { .. })
+ {
+ // `speculative_resolve` resolves segments like `<T as
+ // Trait>` into `Trait`, but just the trait name should
+ // not be used as the replacement of the original
+ // segment.
+ return None;
}
let cfg = ImportPathConfig {
@@ -446,19 +444,17 @@
let found_path = self.target_module.find_path(self.source_scope.db, def, cfg)?;
let res = mod_path_to_ast(&found_path, self.target_edition).clone_for_update();
let mut res_editor = SyntaxEditor::new(res.syntax().clone_subtree());
- if let Some(args) = path.segment().and_then(|it| it.generic_arg_list()) {
- if let Some(segment) = res.segment() {
- if let Some(old) = segment.generic_arg_list() {
- res_editor.replace(
- old.syntax(),
- args.clone_subtree().syntax().clone_for_update(),
- )
- } else {
- res_editor.insert(
- syntax_editor::Position::last_child_of(segment.syntax()),
- args.clone_subtree().syntax().clone_for_update(),
- );
- }
+ if let Some(args) = path.segment().and_then(|it| it.generic_arg_list())
+ && let Some(segment) = res.segment()
+ {
+ if let Some(old) = segment.generic_arg_list() {
+ res_editor
+ .replace(old.syntax(), args.clone_subtree().syntax().clone_for_update())
+ } else {
+ res_editor.insert(
+ syntax_editor::Position::last_child_of(segment.syntax()),
+ args.clone_subtree().syntax().clone_for_update(),
+ );
}
}
let res = res_editor.finish().new_root().clone();
@@ -485,27 +481,27 @@
.ok()?;
let ast_ty = make::ty(ty_str).clone_for_update();
- if let Some(adt) = ty.as_adt() {
- if let ast::Type::PathType(path_ty) = &ast_ty {
- let cfg = ImportPathConfig {
- prefer_no_std: false,
- prefer_prelude: true,
- prefer_absolute: false,
- allow_unstable: true,
- };
- let found_path = self.target_module.find_path(
- self.source_scope.db,
- ModuleDef::from(adt),
- cfg,
- )?;
+ if let Some(adt) = ty.as_adt()
+ && let ast::Type::PathType(path_ty) = &ast_ty
+ {
+ let cfg = ImportPathConfig {
+ prefer_no_std: false,
+ prefer_prelude: true,
+ prefer_absolute: false,
+ allow_unstable: true,
+ };
+ let found_path = self.target_module.find_path(
+ self.source_scope.db,
+ ModuleDef::from(adt),
+ cfg,
+ )?;
- if let Some(qual) =
- mod_path_to_ast(&found_path, self.target_edition).qualifier()
- {
- let res = make::path_concat(qual, path_ty.path()?).clone_for_update();
- editor.replace(path.syntax(), res.syntax());
- return Some(());
- }
+ if let Some(qual) =
+ mod_path_to_ast(&found_path, self.target_edition).qualifier()
+ {
+ let res = make::path_concat(qual, path_ty.path()?).clone_for_update();
+ editor.replace(path.syntax(), res.syntax());
+ return Some(());
}
}
diff --git a/crates/ide-db/src/rename.rs b/crates/ide-db/src/rename.rs
index 4e737e2..424b27a 100644
--- a/crates/ide-db/src/rename.rs
+++ b/crates/ide-db/src/rename.rs
@@ -442,17 +442,17 @@
name: &ast::Name,
new_name: &dyn Display,
) -> bool {
- if ast::RecordPatField::for_field_name(name).is_some() {
- if let Some(ident_pat) = name.syntax().parent().and_then(ast::IdentPat::cast) {
- cov_mark::hit!(rename_record_pat_field_name_split);
- // Foo { ref mut field } -> Foo { new_name: ref mut field }
- // ^ insert `new_name: `
+ if ast::RecordPatField::for_field_name(name).is_some()
+ && let Some(ident_pat) = name.syntax().parent().and_then(ast::IdentPat::cast)
+ {
+ cov_mark::hit!(rename_record_pat_field_name_split);
+ // Foo { ref mut field } -> Foo { new_name: ref mut field }
+ // ^ insert `new_name: `
- // FIXME: instead of splitting the shorthand, recursively trigger a rename of the
- // other name https://github.com/rust-lang/rust-analyzer/issues/6547
- edit.insert(ident_pat.syntax().text_range().start(), format!("{new_name}: "));
- return true;
- }
+ // FIXME: instead of splitting the shorthand, recursively trigger a rename of the
+ // other name https://github.com/rust-lang/rust-analyzer/issues/6547
+ edit.insert(ident_pat.syntax().text_range().start(), format!("{new_name}: "));
+ return true;
}
false
diff --git a/crates/ide-db/src/search.rs b/crates/ide-db/src/search.rs
index 9cf0bcf..4dd6422 100644
--- a/crates/ide-db/src/search.rs
+++ b/crates/ide-db/src/search.rs
@@ -295,10 +295,10 @@
}
// def is crate root
- if let &Definition::Module(module) = self {
- if module.is_crate_root() {
- return SearchScope::reverse_dependencies(db, module.krate());
- }
+ if let &Definition::Module(module) = self
+ && module.is_crate_root()
+ {
+ return SearchScope::reverse_dependencies(db, module.krate());
}
let module = match self.module(db) {
@@ -683,51 +683,47 @@
}
} else if let Some(alias) =
usage.ancestors().find_map(ast::TypeAlias::cast)
+ && let Some(name) = alias.name()
+ && seen
+ .insert(InFileWrapper::new(file_id, name.syntax().text_range()))
{
- if let Some(name) = alias.name() {
- if seen.insert(InFileWrapper::new(
- file_id,
- name.syntax().text_range(),
- )) {
- if let Some(def) = is_alias(&alias) {
- cov_mark::hit!(container_type_alias);
- insert_type_alias(
- sema.db,
- &mut to_process,
- name.text().as_str(),
- def.into(),
- );
- } else {
- cov_mark::hit!(same_name_different_def_type_alias);
- }
- }
+ if let Some(def) = is_alias(&alias) {
+ cov_mark::hit!(container_type_alias);
+ insert_type_alias(
+ sema.db,
+ &mut to_process,
+ name.text().as_str(),
+ def.into(),
+ );
+ } else {
+ cov_mark::hit!(same_name_different_def_type_alias);
}
}
// We need to account for `Self`. It can only refer to our type inside an impl.
let impl_ = 'impl_: {
for ancestor in usage.ancestors() {
- if let Some(parent) = ancestor.parent() {
- if let Some(parent) = ast::Impl::cast(parent) {
- // Only if the GENERIC_PARAM_LIST is directly under impl, otherwise it may be in the self ty.
- if matches!(
- ancestor.kind(),
- SyntaxKind::ASSOC_ITEM_LIST
- | SyntaxKind::WHERE_CLAUSE
- | SyntaxKind::GENERIC_PARAM_LIST
- ) {
- break;
- }
- if parent
- .trait_()
- .is_some_and(|trait_| *trait_.syntax() == ancestor)
- {
- break;
- }
-
- // Otherwise, found an impl where its self ty may be our type.
- break 'impl_ Some(parent);
+ if let Some(parent) = ancestor.parent()
+ && let Some(parent) = ast::Impl::cast(parent)
+ {
+ // Only if the GENERIC_PARAM_LIST is directly under impl, otherwise it may be in the self ty.
+ if matches!(
+ ancestor.kind(),
+ SyntaxKind::ASSOC_ITEM_LIST
+ | SyntaxKind::WHERE_CLAUSE
+ | SyntaxKind::GENERIC_PARAM_LIST
+ ) {
+ break;
}
+ if parent
+ .trait_()
+ .is_some_and(|trait_| *trait_.syntax() == ancestor)
+ {
+ break;
+ }
+
+ // Otherwise, found an impl where its self ty may be our type.
+ break 'impl_ Some(parent);
}
}
None
@@ -1356,11 +1352,10 @@
if matches!(expr.op_kind()?, ast::BinaryOp::Assignment { .. }) {
// If the variable or field ends on the LHS's end then it's a Write
// (covers fields and locals). FIXME: This is not terribly accurate.
- if let Some(lhs) = expr.lhs() {
- if lhs.syntax().text_range().end() == r.syntax().text_range().end() {
+ if let Some(lhs) = expr.lhs()
+ && lhs.syntax().text_range().end() == r.syntax().text_range().end() {
return Some(ReferenceCategory::WRITE)
}
- }
}
Some(ReferenceCategory::READ)
},
diff --git a/crates/ide-db/src/symbol_index.rs b/crates/ide-db/src/symbol_index.rs
index c15cade..9c4e6f5 100644
--- a/crates/ide-db/src/symbol_index.rs
+++ b/crates/ide-db/src/symbol_index.rs
@@ -252,10 +252,10 @@
let mut last_batch_start = 0;
for idx in 0..symbols.len() {
- if let Some(next_symbol) = symbols.get(idx + 1) {
- if cmp(&symbols[last_batch_start], next_symbol) == Ordering::Equal {
- continue;
- }
+ if let Some(next_symbol) = symbols.get(idx + 1)
+ && cmp(&symbols[last_batch_start], next_symbol) == Ordering::Equal
+ {
+ continue;
}
let start = last_batch_start;
@@ -371,10 +371,10 @@
if self.exclude_imports && symbol.is_import {
continue;
}
- if self.mode.check(&self.query, self.case_sensitive, symbol_name) {
- if let Some(b) = cb(symbol).break_value() {
- return Some(b);
- }
+ if self.mode.check(&self.query, self.case_sensitive, symbol_name)
+ && let Some(b) = cb(symbol).break_value()
+ {
+ return Some(b);
}
}
}
diff --git a/crates/ide-db/src/syntax_helpers/format_string.rs b/crates/ide-db/src/syntax_helpers/format_string.rs
index 7e8c921..1d4d8de 100644
--- a/crates/ide-db/src/syntax_helpers/format_string.rs
+++ b/crates/ide-db/src/syntax_helpers/format_string.rs
@@ -230,11 +230,11 @@
skip_char_and_emit(&mut chars, FormatSpecifier::Close, &mut callback);
}
continue;
- } else if let '}' = first_char {
- if let Some((_, '}')) = chars.peek() {
- // Escaped format specifier, `}}`
- read_escaped_format_specifier(&mut chars, &mut callback);
- }
+ } else if let '}' = first_char
+ && let Some((_, '}')) = chars.peek()
+ {
+ // Escaped format specifier, `}}`
+ read_escaped_format_specifier(&mut chars, &mut callback);
}
}
diff --git a/crates/ide-db/src/syntax_helpers/node_ext.rs b/crates/ide-db/src/syntax_helpers/node_ext.rs
index bdff64d..cefd8fd 100644
--- a/crates/ide-db/src/syntax_helpers/node_ext.rs
+++ b/crates/ide-db/src/syntax_helpers/node_ext.rs
@@ -79,14 +79,13 @@
continue;
}
};
- if let Some(let_stmt) = node.parent().and_then(ast::LetStmt::cast) {
- if let_stmt.initializer().map(|it| it.syntax() != &node).unwrap_or(true)
- && let_stmt.let_else().map(|it| it.syntax() != &node).unwrap_or(true)
- {
- // skipping potential const pat expressions in let statements
- preorder.skip_subtree();
- continue;
- }
+ if let Some(let_stmt) = node.parent().and_then(ast::LetStmt::cast)
+ && let_stmt.initializer().map(|it| it.syntax() != &node).unwrap_or(true)
+ && let_stmt.let_else().map(|it| it.syntax() != &node).unwrap_or(true)
+ {
+ // skipping potential const pat expressions in let statements
+ preorder.skip_subtree();
+ continue;
}
match ast::Stmt::cast(node.clone()) {
@@ -306,10 +305,10 @@
Some(ast::BlockModifier::AsyncGen(_)) => (),
None => (),
}
- if let Some(stmt_list) = b.stmt_list() {
- if let Some(e) = stmt_list.tail_expr() {
- for_each_tail_expr(&e, cb);
- }
+ if let Some(stmt_list) = b.stmt_list()
+ && let Some(e) = stmt_list.tail_expr()
+ {
+ for_each_tail_expr(&e, cb);
}
}
ast::Expr::IfExpr(if_) => {
diff --git a/crates/ide-db/src/use_trivial_constructor.rs b/crates/ide-db/src/use_trivial_constructor.rs
index f63cd92..a91d436a 100644
--- a/crates/ide-db/src/use_trivial_constructor.rs
+++ b/crates/ide-db/src/use_trivial_constructor.rs
@@ -16,17 +16,17 @@
) -> Option<Expr> {
match ty.as_adt() {
Some(hir::Adt::Enum(x)) => {
- if let &[variant] = &*x.variants(db) {
- if variant.kind(db) == hir::StructKind::Unit {
- let path = make::path_qualified(
- path,
- make::path_segment(make::name_ref(
- &variant.name(db).display_no_db(edition).to_smolstr(),
- )),
- );
+ if let &[variant] = &*x.variants(db)
+ && variant.kind(db) == hir::StructKind::Unit
+ {
+ let path = make::path_qualified(
+ path,
+ make::path_segment(make::name_ref(
+ &variant.name(db).display_no_db(edition).to_smolstr(),
+ )),
+ );
- return Some(make::expr_path(path));
- }
+ return Some(make::expr_path(path));
}
}
Some(hir::Adt::Struct(x)) if x.kind(db) == StructKind::Unit => {
diff --git a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
index bf7ddda..742d614 100644
--- a/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
+++ b/crates/ide-diagnostics/src/handlers/json_is_not_rust.rs
@@ -148,37 +148,27 @@
allow_unstable: true,
};
- if !scope_has("Serialize") {
- if let Some(PathResolution::Def(it)) = serialize_resolved {
- if let Some(it) = current_module.find_use_path(
- sema.db,
- it,
- config.insert_use.prefix_kind,
- cfg,
- ) {
- insert_use(
- &scope,
- mod_path_to_ast(&it, edition),
- &config.insert_use,
- );
- }
- }
+ if !scope_has("Serialize")
+ && let Some(PathResolution::Def(it)) = serialize_resolved
+ && let Some(it) = current_module.find_use_path(
+ sema.db,
+ it,
+ config.insert_use.prefix_kind,
+ cfg,
+ )
+ {
+ insert_use(&scope, mod_path_to_ast(&it, edition), &config.insert_use);
}
- if !scope_has("Deserialize") {
- if let Some(PathResolution::Def(it)) = deserialize_resolved {
- if let Some(it) = current_module.find_use_path(
- sema.db,
- it,
- config.insert_use.prefix_kind,
- cfg,
- ) {
- insert_use(
- &scope,
- mod_path_to_ast(&it, edition),
- &config.insert_use,
- );
- }
- }
+ if !scope_has("Deserialize")
+ && let Some(PathResolution::Def(it)) = deserialize_resolved
+ && let Some(it) = current_module.find_use_path(
+ sema.db,
+ it,
+ config.insert_use.prefix_kind,
+ cfg,
+ )
+ {
+ insert_use(&scope, mod_path_to_ast(&it, edition), &config.insert_use);
}
let mut sc = scb.finish();
sc.insert_source_edit(vfs_file_id, edit.finish());
diff --git a/crates/ide-diagnostics/src/handlers/missing_fields.rs b/crates/ide-diagnostics/src/handlers/missing_fields.rs
index 7da799e..893bfca 100644
--- a/crates/ide-diagnostics/src/handlers/missing_fields.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_fields.rs
@@ -227,12 +227,11 @@
// Look for a ::new() associated function
let has_new_func = ty
.iterate_assoc_items(ctx.sema.db, krate, |assoc_item| {
- if let AssocItem::Function(func) = assoc_item {
- if func.name(ctx.sema.db) == sym::new
- && func.assoc_fn_params(ctx.sema.db).is_empty()
- {
- return Some(());
- }
+ if let AssocItem::Function(func) = assoc_item
+ && func.name(ctx.sema.db) == sym::new
+ && func.assoc_fn_params(ctx.sema.db).is_empty()
+ {
+ return Some(());
}
None
diff --git a/crates/ide-diagnostics/src/handlers/mutability_errors.rs b/crates/ide-diagnostics/src/handlers/mutability_errors.rs
index 8831efa..6e30bf9 100644
--- a/crates/ide-diagnostics/src/handlers/mutability_errors.rs
+++ b/crates/ide-diagnostics/src/handlers/mutability_errors.rs
@@ -12,14 +12,14 @@
let root = ctx.sema.db.parse_or_expand(d.span.file_id);
let node = d.span.value.to_node(&root);
let mut span = d.span;
- if let Some(parent) = node.parent() {
- if ast::BinExpr::can_cast(parent.kind()) {
- // In case of an assignment, the diagnostic is provided on the variable name.
- // We want to expand it to include the whole assignment, but only when this
- // is an ordinary assignment, not a destructuring assignment. So, the direct
- // parent is an assignment expression.
- span = d.span.with_value(SyntaxNodePtr::new(&parent));
- }
+ if let Some(parent) = node.parent()
+ && ast::BinExpr::can_cast(parent.kind())
+ {
+ // In case of an assignment, the diagnostic is provided on the variable name.
+ // We want to expand it to include the whole assignment, but only when this
+ // is an ordinary assignment, not a destructuring assignment. So, the direct
+ // parent is an assignment expression.
+ span = d.span.with_value(SyntaxNodePtr::new(&parent));
};
let fixes = (|| {
@@ -73,10 +73,10 @@
let ast = source.syntax();
let Some(mut_token) = token(ast, T![mut]) else { continue };
edit_builder.delete(mut_token.text_range());
- if let Some(token) = mut_token.next_token() {
- if token.kind() == SyntaxKind::WHITESPACE {
- edit_builder.delete(token.text_range());
- }
+ if let Some(token) = mut_token.next_token()
+ && token.kind() == SyntaxKind::WHITESPACE
+ {
+ edit_builder.delete(token.text_range());
}
}
let edit = edit_builder.finish();
diff --git a/crates/ide-diagnostics/src/handlers/unlinked_file.rs b/crates/ide-diagnostics/src/handlers/unlinked_file.rs
index d96c658..3a6e480 100644
--- a/crates/ide-diagnostics/src/handlers/unlinked_file.rs
+++ b/crates/ide-diagnostics/src/handlers/unlinked_file.rs
@@ -231,13 +231,13 @@
// If there's an existing `mod m;` statement matching the new one, don't emit a fix (it's
// probably `#[cfg]`d out).
for item in items.clone() {
- if let ast::Item::Module(m) = item {
- if let Some(name) = m.name() {
- if m.item_list().is_none() && name.to_string() == new_mod_name {
- cov_mark::hit!(unlinked_file_skip_fix_when_mod_already_exists);
- return None;
- }
- }
+ if let ast::Item::Module(m) = item
+ && let Some(name) = m.name()
+ && m.item_list().is_none()
+ && name.to_string() == new_mod_name
+ {
+ cov_mark::hit!(unlinked_file_skip_fix_when_mod_already_exists);
+ return None;
}
}
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs
index 72bd66d..a1db926 100644
--- a/crates/ide-diagnostics/src/lib.rs
+++ b/crates/ide-diagnostics/src/lib.rs
@@ -568,10 +568,10 @@
diag.fixes = None;
// All Clippy lints report in macros, see https://github.com/rust-lang/rust-clippy/blob/903293b199364/declare_clippy_lint/src/lib.rs#L172.
- if let DiagnosticCode::RustcLint(lint) = diag.code {
- if !LINTS_TO_REPORT_IN_EXTERNAL_MACROS.contains(lint) {
- return false;
- }
+ if let DiagnosticCode::RustcLint(lint) = diag.code
+ && !LINTS_TO_REPORT_IN_EXTERNAL_MACROS.contains(lint)
+ {
+ return false;
};
}
true
@@ -760,35 +760,35 @@
}
while let Some(value) = iter.next() {
- if let Some(token) = value.as_token() {
- if token.kind() == SyntaxKind::IDENT {
- let severity = match token.text() {
- "allow" | "expect" => Some(Severity::Allow),
- "warn" => Some(Severity::Warning),
- "forbid" | "deny" => Some(Severity::Error),
- "cfg_attr" => {
- if let Some(NodeOrToken::Node(value)) = iter.next() {
- cfg_attr_lint_attrs(sema, &value, lint_attrs);
- }
- None
+ if let Some(token) = value.as_token()
+ && token.kind() == SyntaxKind::IDENT
+ {
+ let severity = match token.text() {
+ "allow" | "expect" => Some(Severity::Allow),
+ "warn" => Some(Severity::Warning),
+ "forbid" | "deny" => Some(Severity::Error),
+ "cfg_attr" => {
+ if let Some(NodeOrToken::Node(value)) = iter.next() {
+ cfg_attr_lint_attrs(sema, &value, lint_attrs);
}
- _ => None,
- };
- if let Some(severity) = severity {
- let lints = iter.next();
- if let Some(NodeOrToken::Node(lints)) = lints {
- lint_attrs.push((severity, lints));
- }
+ None
+ }
+ _ => None,
+ };
+ if let Some(severity) = severity {
+ let lints = iter.next();
+ if let Some(NodeOrToken::Node(lints)) = lints {
+ lint_attrs.push((severity, lints));
}
}
}
}
- if prev_len != lint_attrs.len() {
- if let Some(false) | None = sema.check_cfg_attr(value) {
- // Discard the attributes when the condition is false.
- lint_attrs.truncate(prev_len);
- }
+ if prev_len != lint_attrs.len()
+ && let Some(false) | None = sema.check_cfg_attr(value)
+ {
+ // Discard the attributes when the condition is false.
+ lint_attrs.truncate(prev_len);
}
}
diff --git a/crates/ide-ssr/src/lib.rs b/crates/ide-ssr/src/lib.rs
index e4b20f3..138af22 100644
--- a/crates/ide-ssr/src/lib.rs
+++ b/crates/ide-ssr/src/lib.rs
@@ -283,17 +283,16 @@
node: node.clone(),
});
}
- } else if let Some(macro_call) = ast::MacroCall::cast(node.clone()) {
- if let Some(expanded) = self.sema.expand_macro_call(¯o_call) {
- if let Some(tt) = macro_call.token_tree() {
- self.output_debug_for_nodes_at_range(
- &expanded.value,
- range,
- &Some(self.sema.original_range(tt.syntax())),
- out,
- );
- }
- }
+ } else if let Some(macro_call) = ast::MacroCall::cast(node.clone())
+ && let Some(expanded) = self.sema.expand_macro_call(¯o_call)
+ && let Some(tt) = macro_call.token_tree()
+ {
+ self.output_debug_for_nodes_at_range(
+ &expanded.value,
+ range,
+ &Some(self.sema.original_range(tt.syntax())),
+ out,
+ );
}
self.output_debug_for_nodes_at_range(&node, range, restrict_range, out);
}
diff --git a/crates/ide-ssr/src/matching.rs b/crates/ide-ssr/src/matching.rs
index b350315..f21132c 100644
--- a/crates/ide-ssr/src/matching.rs
+++ b/crates/ide-ssr/src/matching.rs
@@ -156,12 +156,11 @@
/// processing a macro expansion and we want to fail the match if we're working with a node that
/// didn't originate from the token tree of the macro call.
fn validate_range(&self, range: &FileRange) -> Result<(), MatchFailed> {
- if let Some(restrict_range) = &self.restrict_range {
- if restrict_range.file_id != range.file_id
- || !restrict_range.range.contains_range(range.range)
- {
- fail_match!("Node originated from a macro");
- }
+ if let Some(restrict_range) = &self.restrict_range
+ && (restrict_range.file_id != range.file_id
+ || !restrict_range.range.contains_range(range.range))
+ {
+ fail_match!("Node originated from a macro");
}
Ok(())
}
@@ -404,30 +403,27 @@
// Build a map keyed by field name.
let mut fields_by_name: FxHashMap<SmolStr, SyntaxNode> = FxHashMap::default();
for child in code.children() {
- if let Some(record) = ast::RecordExprField::cast(child.clone()) {
- if let Some(name) = record.field_name() {
- fields_by_name.insert(name.text().into(), child.clone());
- }
+ if let Some(record) = ast::RecordExprField::cast(child.clone())
+ && let Some(name) = record.field_name()
+ {
+ fields_by_name.insert(name.text().into(), child.clone());
}
}
for p in pattern.children_with_tokens() {
- if let SyntaxElement::Node(p) = p {
- if let Some(name_element) = p.first_child_or_token() {
- if self.get_placeholder(&name_element).is_some() {
- // If the pattern is using placeholders for field names then order
- // independence doesn't make sense. Fall back to regular ordered
- // matching.
- return self.attempt_match_node_children(phase, pattern, code);
- }
- if let Some(ident) = only_ident(name_element) {
- let code_record = fields_by_name.remove(ident.text()).ok_or_else(|| {
- match_error!(
- "Placeholder has record field '{}', but code doesn't",
- ident
- )
- })?;
- self.attempt_match_node(phase, &p, &code_record)?;
- }
+ if let SyntaxElement::Node(p) = p
+ && let Some(name_element) = p.first_child_or_token()
+ {
+ if self.get_placeholder(&name_element).is_some() {
+ // If the pattern is using placeholders for field names then order
+ // independence doesn't make sense. Fall back to regular ordered
+ // matching.
+ return self.attempt_match_node_children(phase, pattern, code);
+ }
+ if let Some(ident) = only_ident(name_element) {
+ let code_record = fields_by_name.remove(ident.text()).ok_or_else(|| {
+ match_error!("Placeholder has record field '{}', but code doesn't", ident)
+ })?;
+ self.attempt_match_node(phase, &p, &code_record)?;
}
}
}
@@ -476,14 +472,13 @@
}
}
SyntaxElement::Node(n) => {
- if let Some(first_token) = n.first_token() {
- if Some(first_token.text()) == next_pattern_token.as_deref() {
- if let Some(SyntaxElement::Node(p)) = pattern.next() {
- // We have a subtree that starts with the next token in our pattern.
- self.attempt_match_token_tree(phase, &p, n)?;
- break;
- }
- }
+ if let Some(first_token) = n.first_token()
+ && Some(first_token.text()) == next_pattern_token.as_deref()
+ && let Some(SyntaxElement::Node(p)) = pattern.next()
+ {
+ // We have a subtree that starts with the next token in our pattern.
+ self.attempt_match_token_tree(phase, &p, n)?;
+ break;
}
}
};
@@ -562,23 +557,22 @@
let deref_count = self.check_expr_type(pattern_type, expr)?;
let pattern_receiver = pattern_args.next();
self.attempt_match_opt(phase, pattern_receiver.clone(), code.receiver())?;
- if let Phase::Second(match_out) = phase {
- if let Some(placeholder_value) = pattern_receiver
+ if let Phase::Second(match_out) = phase
+ && let Some(placeholder_value) = pattern_receiver
.and_then(|n| self.get_placeholder_for_node(n.syntax()))
.and_then(|placeholder| {
match_out.placeholder_values.get_mut(&placeholder.ident)
})
- {
- placeholder_value.autoderef_count = deref_count;
- placeholder_value.autoref_kind = self
- .sema
- .resolve_method_call_as_callable(code)
- .and_then(|callable| {
- let (self_param, _) = callable.receiver_param(self.sema.db)?;
- Some(self.sema.source(self_param)?.value.kind())
- })
- .unwrap_or(ast::SelfParamKind::Owned);
- }
+ {
+ placeholder_value.autoderef_count = deref_count;
+ placeholder_value.autoref_kind = self
+ .sema
+ .resolve_method_call_as_callable(code)
+ .and_then(|callable| {
+ let (self_param, _) = callable.receiver_param(self.sema.db)?;
+ Some(self.sema.source(self_param)?.value.kind())
+ })
+ .unwrap_or(ast::SelfParamKind::Owned);
}
}
} else {
@@ -698,12 +692,11 @@
}
fn record_ignored_comments(&mut self, token: &SyntaxToken) {
- if token.kind() == SyntaxKind::COMMENT {
- if let Phase::Second(match_out) = self {
- if let Some(comment) = ast::Comment::cast(token.clone()) {
- match_out.ignored_comments.push(comment);
- }
- }
+ if token.kind() == SyntaxKind::COMMENT
+ && let Phase::Second(match_out) = self
+ && let Some(comment) = ast::Comment::cast(token.clone())
+ {
+ match_out.ignored_comments.push(comment);
}
}
}
diff --git a/crates/ide-ssr/src/replacing.rs b/crates/ide-ssr/src/replacing.rs
index 752edd6..16287a4 100644
--- a/crates/ide-ssr/src/replacing.rs
+++ b/crates/ide-ssr/src/replacing.rs
@@ -112,12 +112,12 @@
self.out.push_str(&mod_path.display(self.db, self.edition).to_string());
// Emit everything except for the segment's name-ref, since we already effectively
// emitted that as part of `mod_path`.
- if let Some(path) = ast::Path::cast(node.clone()) {
- if let Some(segment) = path.segment() {
- for node_or_token in segment.syntax().children_with_tokens() {
- if node_or_token.kind() != SyntaxKind::NAME_REF {
- self.render_node_or_token(&node_or_token);
- }
+ if let Some(path) = ast::Path::cast(node.clone())
+ && let Some(segment) = path.segment()
+ {
+ for node_or_token in segment.syntax().children_with_tokens() {
+ if node_or_token.kind() != SyntaxKind::NAME_REF {
+ self.render_node_or_token(&node_or_token);
}
}
}
@@ -242,15 +242,15 @@
}
fn parse_as_kind(code: &str, kind: SyntaxKind) -> Option<SyntaxNode> {
- if ast::Expr::can_cast(kind) {
- if let Ok(expr) = fragments::expr(code) {
- return Some(expr);
- }
+ if ast::Expr::can_cast(kind)
+ && let Ok(expr) = fragments::expr(code)
+ {
+ return Some(expr);
}
- if ast::Item::can_cast(kind) {
- if let Ok(item) = fragments::item(code) {
- return Some(item);
- }
+ if ast::Item::can_cast(kind)
+ && let Ok(item) = fragments::item(code)
+ {
+ return Some(item);
}
None
}
diff --git a/crates/ide-ssr/src/resolving.rs b/crates/ide-ssr/src/resolving.rs
index 8f28a1c..a4e2cfb 100644
--- a/crates/ide-ssr/src/resolving.rs
+++ b/crates/ide-ssr/src/resolving.rs
@@ -83,21 +83,17 @@
let ufcs_function_calls = resolved_paths
.iter()
.filter_map(|(path_node, resolved)| {
- if let Some(grandparent) = path_node.parent().and_then(|parent| parent.parent()) {
- if let Some(call_expr) = ast::CallExpr::cast(grandparent.clone()) {
- if let hir::PathResolution::Def(hir::ModuleDef::Function(function)) =
- resolved.resolution
- {
- if function.as_assoc_item(self.resolution_scope.scope.db).is_some() {
- let qualifier_type =
- self.resolution_scope.qualifier_type(path_node);
- return Some((
- grandparent,
- UfcsCallInfo { call_expr, function, qualifier_type },
- ));
- }
- }
- }
+ if let Some(grandparent) = path_node.parent().and_then(|parent| parent.parent())
+ && let Some(call_expr) = ast::CallExpr::cast(grandparent.clone())
+ && let hir::PathResolution::Def(hir::ModuleDef::Function(function)) =
+ resolved.resolution
+ && function.as_assoc_item(self.resolution_scope.scope.db).is_some()
+ {
+ let qualifier_type = self.resolution_scope.qualifier_type(path_node);
+ return Some((
+ grandparent,
+ UfcsCallInfo { call_expr, function, qualifier_type },
+ ));
}
None
})
@@ -153,12 +149,11 @@
/// Returns whether `path` contains a placeholder, but ignores any placeholders within type
/// arguments.
fn path_contains_placeholder(&self, path: &ast::Path) -> bool {
- if let Some(segment) = path.segment() {
- if let Some(name_ref) = segment.name_ref() {
- if self.placeholders_by_stand_in.contains_key(name_ref.text().as_str()) {
- return true;
- }
- }
+ if let Some(segment) = path.segment()
+ && let Some(name_ref) = segment.name_ref()
+ && self.placeholders_by_stand_in.contains_key(name_ref.text().as_str())
+ {
+ return true;
}
if let Some(qualifier) = path.qualifier() {
return self.path_contains_placeholder(&qualifier);
@@ -252,14 +247,12 @@
fn qualifier_type(&self, path: &SyntaxNode) -> Option<hir::Type<'db>> {
use syntax::ast::AstNode;
- if let Some(path) = ast::Path::cast(path.clone()) {
- if let Some(qualifier) = path.qualifier() {
- if let Some(hir::PathResolution::Def(hir::ModuleDef::Adt(adt))) =
- self.resolve_path(&qualifier)
- {
- return Some(adt.ty(self.scope.db));
- }
- }
+ if let Some(path) = ast::Path::cast(path.clone())
+ && let Some(qualifier) = path.qualifier()
+ && let Some(hir::PathResolution::Def(hir::ModuleDef::Adt(adt))) =
+ self.resolve_path(&qualifier)
+ {
+ return Some(adt.ty(self.scope.db));
}
None
}
@@ -299,11 +292,11 @@
/// Returns whether `path` or any of its qualifiers contains type arguments.
fn path_contains_type_arguments(path: Option<ast::Path>) -> bool {
if let Some(path) = path {
- if let Some(segment) = path.segment() {
- if segment.generic_arg_list().is_some() {
- cov_mark::hit!(type_arguments_within_path);
- return true;
- }
+ if let Some(segment) = path.segment()
+ && segment.generic_arg_list().is_some()
+ {
+ cov_mark::hit!(type_arguments_within_path);
+ return true;
}
return path_contains_type_arguments(path.qualifier());
}
diff --git a/crates/ide-ssr/src/search.rs b/crates/ide-ssr/src/search.rs
index 99a98fb..72f857c 100644
--- a/crates/ide-ssr/src/search.rs
+++ b/crates/ide-ssr/src/search.rs
@@ -187,16 +187,15 @@
self.try_add_match(rule, code, restrict_range, matches_out);
// If we've got a macro call, we already tried matching it pre-expansion, which is the only
// way to match the whole macro, now try expanding it and matching the expansion.
- if let Some(macro_call) = ast::MacroCall::cast(code.clone()) {
- if let Some(expanded) = self.sema.expand_macro_call(¯o_call) {
- if let Some(tt) = macro_call.token_tree() {
- // When matching within a macro expansion, we only want to allow matches of
- // nodes that originated entirely from within the token tree of the macro call.
- // i.e. we don't want to match something that came from the macro itself.
- if let Some(range) = self.sema.original_range_opt(tt.syntax()) {
- self.slow_scan_node(&expanded.value, rule, &Some(range), matches_out);
- }
- }
+ if let Some(macro_call) = ast::MacroCall::cast(code.clone())
+ && let Some(expanded) = self.sema.expand_macro_call(¯o_call)
+ && let Some(tt) = macro_call.token_tree()
+ {
+ // When matching within a macro expansion, we only want to allow matches of
+ // nodes that originated entirely from within the token tree of the macro call.
+ // i.e. we don't want to match something that came from the macro itself.
+ if let Some(range) = self.sema.original_range_opt(tt.syntax()) {
+ self.slow_scan_node(&expanded.value, rule, &Some(range), matches_out);
}
}
for child in code.children() {
@@ -241,10 +240,10 @@
/// Returns whether we support matching within `node` and all of its ancestors.
fn is_search_permitted_ancestors(node: &SyntaxNode) -> bool {
- if let Some(parent) = node.parent() {
- if !is_search_permitted_ancestors(&parent) {
- return false;
- }
+ if let Some(parent) = node.parent()
+ && !is_search_permitted_ancestors(&parent)
+ {
+ return false;
}
is_search_permitted(node)
}
diff --git a/crates/ide/src/annotations.rs b/crates/ide/src/annotations.rs
index 05196ac..dec1889 100644
--- a/crates/ide/src/annotations.rs
+++ b/crates/ide/src/annotations.rs
@@ -159,10 +159,10 @@
node.value.syntax().text_range(),
Some(name),
);
- if res.call_site.0.file_id == source_file_id {
- if let Some(name_range) = res.call_site.1 {
- return Some((res.call_site.0.range, Some(name_range)));
- }
+ if res.call_site.0.file_id == source_file_id
+ && let Some(name_range) = res.call_site.1
+ {
+ return Some((res.call_site.0.range, Some(name_range)));
}
};
// otherwise try upmapping the entire node out of attributes
diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs
index f31886b..ad84eac 100644
--- a/crates/ide/src/expand_macro.rs
+++ b/crates/ide/src/expand_macro.rs
@@ -96,14 +96,14 @@
let (name, expanded, kind) = loop {
let node = anc.next()?;
- if let Some(item) = ast::Item::cast(node.clone()) {
- if let Some(def) = sema.resolve_attr_macro_call(&item) {
- break (
- def.name(db).display(db, file_id.edition(db)).to_string(),
- expand_macro_recur(&sema, &item, &mut error, &mut span_map, TextSize::new(0))?,
- SyntaxKind::MACRO_ITEMS,
- );
- }
+ if let Some(item) = ast::Item::cast(node.clone())
+ && let Some(def) = sema.resolve_attr_macro_call(&item)
+ {
+ break (
+ def.name(db).display(db, file_id.edition(db)).to_string(),
+ expand_macro_recur(&sema, &item, &mut error, &mut span_map, TextSize::new(0))?,
+ SyntaxKind::MACRO_ITEMS,
+ );
}
if let Some(mac) = ast::MacroCall::cast(node) {
let mut name = mac.path()?.segment()?.name_ref()?.to_string();
diff --git a/crates/ide/src/extend_selection.rs b/crates/ide/src/extend_selection.rs
index a374f97..2926384 100644
--- a/crates/ide/src/extend_selection.rs
+++ b/crates/ide/src/extend_selection.rs
@@ -81,10 +81,10 @@
if token.text_range() != range {
return Some(token.text_range());
}
- if let Some(comment) = ast::Comment::cast(token.clone()) {
- if let Some(range) = extend_comments(comment) {
- return Some(range);
- }
+ if let Some(comment) = ast::Comment::cast(token.clone())
+ && let Some(range) = extend_comments(comment)
+ {
+ return Some(range);
}
token.parent()?
}
@@ -92,12 +92,11 @@
};
// if we are in single token_tree, we maybe live in macro or attr
- if node.kind() == TOKEN_TREE {
- if let Some(macro_call) = node.ancestors().find_map(ast::MacroCall::cast) {
- if let Some(range) = extend_tokens_from_range(sema, macro_call, range) {
- return Some(range);
- }
- }
+ if node.kind() == TOKEN_TREE
+ && let Some(macro_call) = node.ancestors().find_map(ast::MacroCall::cast)
+ && let Some(range) = extend_tokens_from_range(sema, macro_call, range)
+ {
+ return Some(range);
}
if node.text_range() != range {
@@ -106,10 +105,10 @@
let node = shallowest_node(&node);
- if node.parent().is_some_and(|n| list_kinds.contains(&n.kind())) {
- if let Some(range) = extend_list_item(&node) {
- return Some(range);
- }
+ if node.parent().is_some_and(|n| list_kinds.contains(&n.kind()))
+ && let Some(range) = extend_list_item(&node)
+ {
+ return Some(range);
}
node.parent().map(|it| it.text_range())
@@ -221,19 +220,20 @@
let prefix = TextRange::new(ws.text_range().start(), offset) - ws.text_range().start();
let ws_suffix = &ws_text[suffix];
let ws_prefix = &ws_text[prefix];
- if ws_text.contains('\n') && !ws_suffix.contains('\n') {
- if let Some(node) = ws.next_sibling_or_token() {
- let start = match ws_prefix.rfind('\n') {
- Some(idx) => ws.text_range().start() + TextSize::from((idx + 1) as u32),
- None => node.text_range().start(),
- };
- let end = if root.text().char_at(node.text_range().end()) == Some('\n') {
- node.text_range().end() + TextSize::of('\n')
- } else {
- node.text_range().end()
- };
- return TextRange::new(start, end);
- }
+ if ws_text.contains('\n')
+ && !ws_suffix.contains('\n')
+ && let Some(node) = ws.next_sibling_or_token()
+ {
+ let start = match ws_prefix.rfind('\n') {
+ Some(idx) => ws.text_range().start() + TextSize::from((idx + 1) as u32),
+ None => node.text_range().start(),
+ };
+ let end = if root.text().char_at(node.text_range().end()) == Some('\n') {
+ node.text_range().end() + TextSize::of('\n')
+ } else {
+ node.text_range().end()
+ };
+ return TextRange::new(start, end);
}
ws.text_range()
}
diff --git a/crates/ide/src/folding_ranges.rs b/crates/ide/src/folding_ranges.rs
index 1901bcc..ac64413 100755
--- a/crates/ide/src/folding_ranges.rs
+++ b/crates/ide/src/folding_ranges.rs
@@ -61,30 +61,29 @@
};
if is_multiline {
// for the func with multiline param list
- if matches!(element.kind(), FN) {
- if let NodeOrToken::Node(node) = &element {
- if let Some(fn_node) = ast::Fn::cast(node.clone()) {
- if !fn_node
- .param_list()
- .map(|param_list| param_list.syntax().text().contains_char('\n'))
- .unwrap_or(false)
- {
- continue;
- }
+ if matches!(element.kind(), FN)
+ && let NodeOrToken::Node(node) = &element
+ && let Some(fn_node) = ast::Fn::cast(node.clone())
+ {
+ if !fn_node
+ .param_list()
+ .map(|param_list| param_list.syntax().text().contains_char('\n'))
+ .unwrap_or(false)
+ {
+ continue;
+ }
- if fn_node.body().is_some() {
- // Get the actual start of the function (excluding doc comments)
- let fn_start = fn_node
- .fn_token()
- .map(|token| token.text_range().start())
- .unwrap_or(node.text_range().start());
- res.push(Fold {
- range: TextRange::new(fn_start, node.text_range().end()),
- kind: FoldKind::Function,
- });
- continue;
- }
- }
+ if fn_node.body().is_some() {
+ // Get the actual start of the function (excluding doc comments)
+ let fn_start = fn_node
+ .fn_token()
+ .map(|token| token.text_range().start())
+ .unwrap_or(node.text_range().start());
+ res.push(Fold {
+ range: TextRange::new(fn_start, node.text_range().end()),
+ kind: FoldKind::Function,
+ });
+ continue;
}
}
res.push(Fold { range: element.text_range(), kind });
@@ -120,14 +119,13 @@
match_ast! {
match node {
ast::Module(module) => {
- if module.item_list().is_none() {
- if let Some(range) = contiguous_range_for_item_group(
+ if module.item_list().is_none()
+ && let Some(range) = contiguous_range_for_item_group(
module,
&mut visited_nodes,
) {
res.push(Fold { range, kind: FoldKind::Modules })
}
- }
},
ast::Use(use_) => {
if let Some(range) = contiguous_range_for_item_group(use_, &mut visited_nodes) {
@@ -212,11 +210,11 @@
for element in first.syntax().siblings_with_tokens(Direction::Next) {
let node = match element {
NodeOrToken::Token(token) => {
- if let Some(ws) = ast::Whitespace::cast(token) {
- if !ws.spans_multiple_lines() {
- // Ignore whitespace without blank lines
- continue;
- }
+ if let Some(ws) = ast::Whitespace::cast(token)
+ && !ws.spans_multiple_lines()
+ {
+ // Ignore whitespace without blank lines
+ continue;
}
// There is a blank line or another token, which means that the
// group ends here
@@ -270,21 +268,21 @@
for element in first.syntax().siblings_with_tokens(Direction::Next) {
match element {
NodeOrToken::Token(token) => {
- if let Some(ws) = ast::Whitespace::cast(token.clone()) {
- if !ws.spans_multiple_lines() {
- // Ignore whitespace without blank lines
- continue;
- }
+ if let Some(ws) = ast::Whitespace::cast(token.clone())
+ && !ws.spans_multiple_lines()
+ {
+ // Ignore whitespace without blank lines
+ continue;
}
- if let Some(c) = ast::Comment::cast(token) {
- if c.kind() == group_kind {
- let text = c.text().trim_start();
- // regions are not real comments
- if !(text.starts_with(REGION_START) || text.starts_with(REGION_END)) {
- visited.insert(c.clone());
- last = c;
- continue;
- }
+ if let Some(c) = ast::Comment::cast(token)
+ && c.kind() == group_kind
+ {
+ let text = c.text().trim_start();
+ // regions are not real comments
+ if !(text.starts_with(REGION_START) || text.starts_with(REGION_END)) {
+ visited.insert(c.clone());
+ last = c;
+ continue;
}
}
// The comment group ends because either:
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs
index 29fc68b..84e4127 100644
--- a/crates/ide/src/goto_definition.rs
+++ b/crates/ide/src/goto_definition.rs
@@ -94,18 +94,17 @@
let parent = token.value.parent()?;
let token_file_id = token.file_id;
- if let Some(token) = ast::String::cast(token.value.clone()) {
- if let Some(x) =
+ if let Some(token) = ast::String::cast(token.value.clone())
+ && let Some(x) =
try_lookup_include_path(sema, InFile::new(token_file_id, token), file_id)
- {
- return Some(vec![x]);
- }
+ {
+ return Some(vec![x]);
}
- if ast::TokenTree::can_cast(parent.kind()) {
- if let Some(x) = try_lookup_macro_def_in_macro_use(sema, token.value) {
- return Some(vec![x]);
- }
+ if ast::TokenTree::can_cast(parent.kind())
+ && let Some(x) = try_lookup_macro_def_in_macro_use(sema, token.value)
+ {
+ return Some(vec![x]);
}
Some(
@@ -245,12 +244,11 @@
let krate = extern_crate.resolved_crate(sema.db)?;
for mod_def in krate.root_module().declarations(sema.db) {
- if let ModuleDef::Macro(mac) = mod_def {
- if mac.name(sema.db).as_str() == token.text() {
- if let Some(nav) = mac.try_to_nav(sema.db) {
- return Some(nav.call_site);
- }
- }
+ if let ModuleDef::Macro(mac) = mod_def
+ && mac.name(sema.db).as_str() == token.text()
+ && let Some(nav) = mac.try_to_nav(sema.db)
+ {
+ return Some(nav.call_site);
}
}
diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs
index 356bd69..9960e79 100644
--- a/crates/ide/src/highlight_related.rs
+++ b/crates/ide/src/highlight_related.rs
@@ -722,20 +722,19 @@
self.depth += 1;
}
- if let ast::Expr::MacroExpr(expr) = expr {
- if let Some(expanded) =
+ if let ast::Expr::MacroExpr(expr) = expr
+ && let Some(expanded) =
expr.macro_call().and_then(|call| self.sema.expand_macro_call(&call))
- {
- match_ast! {
- match (expanded.value) {
- ast::MacroStmts(it) => {
- self.handle_expanded(it, cb);
- },
- ast::Expr(it) => {
- self.walk(&it, cb);
- },
- _ => {}
- }
+ {
+ match_ast! {
+ match (expanded.value) {
+ ast::MacroStmts(it) => {
+ self.handle_expanded(it, cb);
+ },
+ ast::Expr(it) => {
+ self.walk(&it, cb);
+ },
+ _ => {}
}
}
}
@@ -755,10 +754,10 @@
}
for stmt in expanded.statements() {
- if let ast::Stmt::ExprStmt(stmt) = stmt {
- if let Some(expr) = stmt.expr() {
- self.walk(&expr, cb);
- }
+ if let ast::Stmt::ExprStmt(stmt) = stmt
+ && let Some(expr) = stmt.expr()
+ {
+ self.walk(&expr, cb);
}
}
}
@@ -806,12 +805,12 @@
push_to_highlights(unsafe_token_file_id, Some(unsafe_token.text_range()));
// highlight unsafe operations
- if let Some(block) = block_expr {
- if let Some(body) = sema.body_for(InFile::new(unsafe_token_file_id, block.syntax())) {
- let unsafe_ops = sema.get_unsafe_ops(body);
- for unsafe_op in unsafe_ops {
- push_to_highlights(unsafe_op.file_id, Some(unsafe_op.value.text_range()));
- }
+ if let Some(block) = block_expr
+ && let Some(body) = sema.body_for(InFile::new(unsafe_token_file_id, block.syntax()))
+ {
+ let unsafe_ops = sema.get_unsafe_ops(body);
+ for unsafe_op in unsafe_ops {
+ push_to_highlights(unsafe_op.file_id, Some(unsafe_op.value.text_range()));
}
}
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index e4d6279..44c98a4 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -244,17 +244,15 @@
let node = token.parent()?;
// special case macro calls, we wanna render the invoked arm index
- if let Some(name) = ast::NameRef::cast(node.clone()) {
- if let Some(path_seg) =
+ if let Some(name) = ast::NameRef::cast(node.clone())
+ && let Some(path_seg) =
name.syntax().parent().and_then(ast::PathSegment::cast)
- {
- if let Some(macro_call) = path_seg
+ && let Some(macro_call) = path_seg
.parent_path()
.syntax()
.parent()
.and_then(ast::MacroCall::cast)
- {
- if let Some(macro_) = sema.resolve_macro_call(¯o_call) {
+ && let Some(macro_) = sema.resolve_macro_call(¯o_call) {
break 'a vec![(
(Definition::Macro(macro_), None),
sema.resolve_macro_call_arm(¯o_call),
@@ -262,9 +260,6 @@
node,
)];
}
- }
- }
- }
match IdentClass::classify_node(sema, &node)? {
// It's better for us to fall back to the keyword hover here,
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index 670210d..51b5900 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -95,23 +95,25 @@
if let Some((hir::Adt::Enum(inner), hir::Adt::Enum(body))) = adts {
let famous_defs = FamousDefs(sema, sema.scope(try_expr.syntax())?.krate());
// special case for two options, there is no value in showing them
- if let Some(option_enum) = famous_defs.core_option_Option() {
- if inner == option_enum && body == option_enum {
- cov_mark::hit!(hover_try_expr_opt_opt);
- return None;
- }
+ if let Some(option_enum) = famous_defs.core_option_Option()
+ && inner == option_enum
+ && body == option_enum
+ {
+ cov_mark::hit!(hover_try_expr_opt_opt);
+ return None;
}
// special case two results to show the error variants only
- if let Some(result_enum) = famous_defs.core_result_Result() {
- if inner == result_enum && body == result_enum {
- let error_type_args =
- inner_ty.type_arguments().nth(1).zip(body_ty.type_arguments().nth(1));
- if let Some((inner, body)) = error_type_args {
- inner_ty = inner;
- body_ty = body;
- "Try Error".clone_into(&mut s);
- }
+ if let Some(result_enum) = famous_defs.core_result_Result()
+ && inner == result_enum
+ && body == result_enum
+ {
+ let error_type_args =
+ inner_ty.type_arguments().nth(1).zip(body_ty.type_arguments().nth(1));
+ if let Some((inner, body)) = error_type_args {
+ inner_ty = inner;
+ body_ty = body;
+ "Try Error".clone_into(&mut s);
}
}
}
@@ -1132,10 +1134,10 @@
) -> (Markup, Option<DocsRangeMap>) {
let mut buf = String::new();
- if let Some(mod_path) = mod_path {
- if !mod_path.is_empty() {
- format_to!(buf, "```rust\n{}\n```\n\n", mod_path);
- }
+ if let Some(mod_path) = mod_path
+ && !mod_path.is_empty()
+ {
+ format_to!(buf, "```rust\n{}\n```\n\n", mod_path);
}
format_to!(buf, "```rust\n{}\n```", rust);
@@ -1217,55 +1219,55 @@
format_to!(label, ", ");
}
- if let Some(render) = config.offset {
- if let Some(offset) = offset(&layout) {
- format_to!(label, "offset = ");
- match render {
- MemoryLayoutHoverRenderKind::Decimal => format_to!(label, "{offset}"),
- MemoryLayoutHoverRenderKind::Hexadecimal => format_to!(label, "{offset:#X}"),
- MemoryLayoutHoverRenderKind::Both if offset >= 10 => {
- format_to!(label, "{offset} ({offset:#X})")
- }
- MemoryLayoutHoverRenderKind::Both => {
- format_to!(label, "{offset}")
- }
+ if let Some(render) = config.offset
+ && let Some(offset) = offset(&layout)
+ {
+ format_to!(label, "offset = ");
+ match render {
+ MemoryLayoutHoverRenderKind::Decimal => format_to!(label, "{offset}"),
+ MemoryLayoutHoverRenderKind::Hexadecimal => format_to!(label, "{offset:#X}"),
+ MemoryLayoutHoverRenderKind::Both if offset >= 10 => {
+ format_to!(label, "{offset} ({offset:#X})")
}
- format_to!(label, ", ");
+ MemoryLayoutHoverRenderKind::Both => {
+ format_to!(label, "{offset}")
+ }
}
+ format_to!(label, ", ");
}
- if let Some(render) = config.padding {
- if let Some((padding_name, padding)) = padding(&layout) {
- format_to!(label, "{padding_name} = ");
- match render {
- MemoryLayoutHoverRenderKind::Decimal => format_to!(label, "{padding}"),
- MemoryLayoutHoverRenderKind::Hexadecimal => format_to!(label, "{padding:#X}"),
- MemoryLayoutHoverRenderKind::Both if padding >= 10 => {
- format_to!(label, "{padding} ({padding:#X})")
- }
- MemoryLayoutHoverRenderKind::Both => {
- format_to!(label, "{padding}")
- }
+ if let Some(render) = config.padding
+ && let Some((padding_name, padding)) = padding(&layout)
+ {
+ format_to!(label, "{padding_name} = ");
+ match render {
+ MemoryLayoutHoverRenderKind::Decimal => format_to!(label, "{padding}"),
+ MemoryLayoutHoverRenderKind::Hexadecimal => format_to!(label, "{padding:#X}"),
+ MemoryLayoutHoverRenderKind::Both if padding >= 10 => {
+ format_to!(label, "{padding} ({padding:#X})")
}
- format_to!(label, ", ");
+ MemoryLayoutHoverRenderKind::Both => {
+ format_to!(label, "{padding}")
+ }
}
+ format_to!(label, ", ");
}
- if config.niches {
- if let Some(niches) = layout.niches() {
- if niches > 1024 {
- if niches.is_power_of_two() {
- format_to!(label, "niches = 2{}, ", pwr2_to_exponent(niches));
- } else if is_pwr2plus1(niches) {
- format_to!(label, "niches = 2{} + 1, ", pwr2_to_exponent(niches - 1));
- } else if is_pwr2minus1(niches) {
- format_to!(label, "niches = 2{} - 1, ", pwr2_to_exponent(niches + 1));
- } else {
- format_to!(label, "niches = a lot, ");
- }
+ if config.niches
+ && let Some(niches) = layout.niches()
+ {
+ if niches > 1024 {
+ if niches.is_power_of_two() {
+ format_to!(label, "niches = 2{}, ", pwr2_to_exponent(niches));
+ } else if is_pwr2plus1(niches) {
+ format_to!(label, "niches = 2{} + 1, ", pwr2_to_exponent(niches - 1));
+ } else if is_pwr2minus1(niches) {
+ format_to!(label, "niches = 2{} - 1, ", pwr2_to_exponent(niches + 1));
} else {
- format_to!(label, "niches = {niches}, ");
+ format_to!(label, "niches = a lot, ");
}
+ } else {
+ format_to!(label, "niches = {niches}, ");
}
}
label.pop(); // ' '
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index 671fddb..7a8514c 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -576,13 +576,13 @@
}
pub fn append_part(&mut self, part: InlayHintLabelPart) {
- if part.linked_location.is_none() && part.tooltip.is_none() {
- if let Some(InlayHintLabelPart { text, linked_location: None, tooltip: None }) =
+ if part.linked_location.is_none()
+ && part.tooltip.is_none()
+ && let Some(InlayHintLabelPart { text, linked_location: None, tooltip: None }) =
self.parts.last_mut()
- {
- text.push_str(&part.text);
- return;
- }
+ {
+ text.push_str(&part.text);
+ return;
}
self.parts.push(part);
}
diff --git a/crates/ide/src/inlay_hints/adjustment.rs b/crates/ide/src/inlay_hints/adjustment.rs
index 49b43fc..4d020ba 100644
--- a/crates/ide/src/inlay_hints/adjustment.rs
+++ b/crates/ide/src/inlay_hints/adjustment.rs
@@ -39,10 +39,10 @@
if let ast::Expr::ParenExpr(_) = expr {
return None;
}
- if let ast::Expr::BlockExpr(b) = expr {
- if !b.is_standalone() {
- return None;
- }
+ if let ast::Expr::BlockExpr(b) = expr
+ && !b.is_standalone()
+ {
+ return None;
}
let descended = sema.descend_node_into_attributes(expr.clone()).pop();
diff --git a/crates/ide/src/inlay_hints/bind_pat.rs b/crates/ide/src/inlay_hints/bind_pat.rs
index 7293493..922e959 100644
--- a/crates/ide/src/inlay_hints/bind_pat.rs
+++ b/crates/ide/src/inlay_hints/bind_pat.rs
@@ -41,13 +41,11 @@
Some(it.colon_token())
},
ast::LetStmt(it) => {
- if config.hide_closure_initialization_hints {
- if let Some(ast::Expr::ClosureExpr(closure)) = it.initializer() {
- if closure_has_block_body(&closure) {
+ if config.hide_closure_initialization_hints
+ && let Some(ast::Expr::ClosureExpr(closure)) = it.initializer()
+ && closure_has_block_body(&closure) {
return None;
}
- }
- }
if it.ty().is_some() {
return None;
}
diff --git a/crates/ide/src/inlay_hints/chaining.rs b/crates/ide/src/inlay_hints/chaining.rs
index ff157fa..a8bb652 100644
--- a/crates/ide/src/inlay_hints/chaining.rs
+++ b/crates/ide/src/inlay_hints/chaining.rs
@@ -51,12 +51,11 @@
if ty.is_unknown() {
return None;
}
- if matches!(expr, ast::Expr::PathExpr(_)) {
- if let Some(hir::Adt::Struct(st)) = ty.as_adt() {
- if st.fields(sema.db).is_empty() {
- return None;
- }
- }
+ if matches!(expr, ast::Expr::PathExpr(_))
+ && let Some(hir::Adt::Struct(st)) = ty.as_adt()
+ && st.fields(sema.db).is_empty()
+ {
+ return None;
}
let label = label_of_ty(famous_defs, config, &ty, display_target)?;
acc.push(InlayHint {
diff --git a/crates/ide/src/inlay_hints/closing_brace.rs b/crates/ide/src/inlay_hints/closing_brace.rs
index 05253b6..e80c9dc 100644
--- a/crates/ide/src/inlay_hints/closing_brace.rs
+++ b/crates/ide/src/inlay_hints/closing_brace.rs
@@ -120,11 +120,11 @@
};
if let Some(mut next) = closing_token.next_token() {
- if next.kind() == T![;] {
- if let Some(tok) = next.next_token() {
- closing_token = next;
- next = tok;
- }
+ if next.kind() == T![;]
+ && let Some(tok) = next.next_token()
+ {
+ closing_token = next;
+ next = tok;
}
if !(next.kind() == SyntaxKind::WHITESPACE && next.text().contains('\n')) {
// Only display the hint if the `}` is the last token on the line
diff --git a/crates/ide/src/inlay_hints/closure_ret.rs b/crates/ide/src/inlay_hints/closure_ret.rs
index 9e600b5..fef1cb8 100644
--- a/crates/ide/src/inlay_hints/closure_ret.rs
+++ b/crates/ide/src/inlay_hints/closure_ret.rs
@@ -55,11 +55,9 @@
// Insert braces if necessary
let insert_braces = |builder: &mut TextEditBuilder| {
- if !has_block_body {
- if let Some(range) = closure.body().map(|b| b.syntax().text_range()) {
- builder.insert(range.start(), "{ ".to_owned());
- builder.insert(range.end(), " }".to_owned());
- }
+ if !has_block_body && let Some(range) = closure.body().map(|b| b.syntax().text_range()) {
+ builder.insert(range.start(), "{ ".to_owned());
+ builder.insert(range.end(), " }".to_owned());
}
};
diff --git a/crates/ide/src/inlay_hints/extern_block.rs b/crates/ide/src/inlay_hints/extern_block.rs
index 88152bf..491018a 100644
--- a/crates/ide/src/inlay_hints/extern_block.rs
+++ b/crates/ide/src/inlay_hints/extern_block.rs
@@ -81,10 +81,10 @@
text_edit: Some(config.lazy_text_edit(|| {
let mut builder = TextEdit::builder();
builder.insert(token.text_range().start(), "unsafe ".to_owned());
- if extern_block.unsafe_token().is_none() {
- if let Some(abi) = extern_block.abi() {
- builder.insert(abi.syntax().text_range().start(), "unsafe ".to_owned());
- }
+ if extern_block.unsafe_token().is_none()
+ && let Some(abi) = extern_block.abi()
+ {
+ builder.insert(abi.syntax().text_range().start(), "unsafe ".to_owned());
}
builder.finish()
})),
diff --git a/crates/ide/src/inlay_hints/generic_param.rs b/crates/ide/src/inlay_hints/generic_param.rs
index 6e1b3bd..1fddb6f 100644
--- a/crates/ide/src/inlay_hints/generic_param.rs
+++ b/crates/ide/src/inlay_hints/generic_param.rs
@@ -33,10 +33,10 @@
let mut args = generic_arg_list.generic_args().peekable();
let start_with_lifetime = matches!(args.peek()?, ast::GenericArg::LifetimeArg(_));
let params = generic_def.params(sema.db).into_iter().filter(|p| {
- if let hir::GenericParam::TypeParam(it) = p {
- if it.is_implicit(sema.db) {
- return false;
- }
+ if let hir::GenericParam::TypeParam(it) = p
+ && it.is_implicit(sema.db)
+ {
+ return false;
}
if !start_with_lifetime {
return !matches!(p, hir::GenericParam::LifetimeParam(_));
diff --git a/crates/ide/src/inlay_hints/implicit_static.rs b/crates/ide/src/inlay_hints/implicit_static.rs
index 7212efd..bddce90 100644
--- a/crates/ide/src/inlay_hints/implicit_static.rs
+++ b/crates/ide/src/inlay_hints/implicit_static.rs
@@ -22,30 +22,31 @@
return None;
}
- if let Either::Right(it) = &statik_or_const {
- if ast::AssocItemList::can_cast(
+ if let Either::Right(it) = &statik_or_const
+ && ast::AssocItemList::can_cast(
it.syntax().parent().map_or(SyntaxKind::EOF, |it| it.kind()),
- ) {
- return None;
- }
+ )
+ {
+ return None;
}
- if let Some(ast::Type::RefType(ty)) = statik_or_const.either(|it| it.ty(), |it| it.ty()) {
- if ty.lifetime().is_none() {
- let t = ty.amp_token()?;
- acc.push(InlayHint {
- range: t.text_range(),
- kind: InlayKind::Lifetime,
- label: "'static".into(),
- text_edit: Some(config.lazy_text_edit(|| {
- TextEdit::insert(t.text_range().start(), "'static ".into())
- })),
- position: InlayHintPosition::After,
- pad_left: false,
- pad_right: true,
- resolve_parent: None,
- });
- }
+ if let Some(ast::Type::RefType(ty)) = statik_or_const.either(|it| it.ty(), |it| it.ty())
+ && ty.lifetime().is_none()
+ {
+ let t = ty.amp_token()?;
+ acc.push(InlayHint {
+ range: t.text_range(),
+ kind: InlayKind::Lifetime,
+ label: "'static".into(),
+ text_edit: Some(
+ config
+ .lazy_text_edit(|| TextEdit::insert(t.text_range().start(), "'static ".into())),
+ ),
+ position: InlayHintPosition::After,
+ pad_left: false,
+ pad_right: true,
+ resolve_parent: None,
+ });
}
Some(())
diff --git a/crates/ide/src/inlay_hints/lifetime.rs b/crates/ide/src/inlay_hints/lifetime.rs
index 49fec0a..a89c53e 100644
--- a/crates/ide/src/inlay_hints/lifetime.rs
+++ b/crates/ide/src/inlay_hints/lifetime.rs
@@ -324,35 +324,35 @@
// apply hints
// apply output if required
- if let (Some(output_lt), Some(r)) = (&output, ret_type) {
- if let Some(ty) = r.ty() {
- walk_ty(&ty, &mut |ty| match ty {
- ast::Type::RefType(ty) if ty.lifetime().is_none() => {
- if let Some(amp) = ty.amp_token() {
- is_trivial = false;
- acc.push(mk_lt_hint(amp, output_lt.to_string()));
- }
- false
+ if let (Some(output_lt), Some(r)) = (&output, ret_type)
+ && let Some(ty) = r.ty()
+ {
+ walk_ty(&ty, &mut |ty| match ty {
+ ast::Type::RefType(ty) if ty.lifetime().is_none() => {
+ if let Some(amp) = ty.amp_token() {
+ is_trivial = false;
+ acc.push(mk_lt_hint(amp, output_lt.to_string()));
}
- ast::Type::FnPtrType(_) => {
+ false
+ }
+ ast::Type::FnPtrType(_) => {
+ is_trivial = false;
+ true
+ }
+ ast::Type::PathType(t) => {
+ if t.path()
+ .and_then(|it| it.segment())
+ .and_then(|it| it.parenthesized_arg_list())
+ .is_some()
+ {
is_trivial = false;
true
+ } else {
+ false
}
- ast::Type::PathType(t) => {
- if t.path()
- .and_then(|it| it.segment())
- .and_then(|it| it.parenthesized_arg_list())
- .is_some()
- {
- is_trivial = false;
- true
- } else {
- false
- }
- }
- _ => false,
- })
- }
+ }
+ _ => false,
+ })
}
if config.lifetime_elision_hints == LifetimeElisionHints::SkipTrivial && is_trivial {
diff --git a/crates/ide/src/inlay_hints/param_name.rs b/crates/ide/src/inlay_hints/param_name.rs
index 5174228..ec0a4c4 100644
--- a/crates/ide/src/inlay_hints/param_name.rs
+++ b/crates/ide/src/inlay_hints/param_name.rs
@@ -135,10 +135,10 @@
}
if unary_function {
- if let Some(function_name) = function_name {
- if is_param_name_suffix_of_fn_name(param_name, function_name) {
- return true;
- }
+ if let Some(function_name) = function_name
+ && is_param_name_suffix_of_fn_name(param_name, function_name)
+ {
+ return true;
}
if is_obvious_param(param_name) {
return true;
diff --git a/crates/ide/src/join_lines.rs b/crates/ide/src/join_lines.rs
index 0188c10..a946559 100644
--- a/crates/ide/src/join_lines.rs
+++ b/crates/ide/src/join_lines.rs
@@ -144,15 +144,15 @@
}
}
- if config.join_else_if {
- if let (Some(prev), Some(_next)) = (as_if_expr(&prev), as_if_expr(&next)) {
- match prev.else_token() {
- Some(_) => cov_mark::hit!(join_two_ifs_with_existing_else),
- None => {
- cov_mark::hit!(join_two_ifs);
- edit.replace(token.text_range(), " else ".to_owned());
- return;
- }
+ if config.join_else_if
+ && let (Some(prev), Some(_next)) = (as_if_expr(&prev), as_if_expr(&next))
+ {
+ match prev.else_token() {
+ Some(_) => cov_mark::hit!(join_two_ifs_with_existing_else),
+ None => {
+ cov_mark::hit!(join_two_ifs);
+ edit.replace(token.text_range(), " else ".to_owned());
+ return;
}
}
}
@@ -213,10 +213,10 @@
let mut buf = expr.syntax().text().to_string();
// Match block needs to have a comma after the block
- if let Some(match_arm) = block_expr.syntax().parent().and_then(ast::MatchArm::cast) {
- if match_arm.comma_token().is_none() {
- buf.push(',');
- }
+ if let Some(match_arm) = block_expr.syntax().parent().and_then(ast::MatchArm::cast)
+ && match_arm.comma_token().is_none()
+ {
+ buf.push(',');
}
edit.replace(block_range, buf);
diff --git a/crates/ide/src/parent_module.rs b/crates/ide/src/parent_module.rs
index 50219ce..96d829d 100644
--- a/crates/ide/src/parent_module.rs
+++ b/crates/ide/src/parent_module.rs
@@ -29,14 +29,13 @@
let mut module = find_node_at_offset::<ast::Module>(source_file.syntax(), position.offset);
// If cursor is literally on `mod foo`, go to the grandpa.
- if let Some(m) = &module {
- if !m
+ if let Some(m) = &module
+ && !m
.item_list()
.is_some_and(|it| it.syntax().text_range().contains_inclusive(position.offset))
- {
- cov_mark::hit!(test_resolve_parent_module_on_module_decl);
- module = m.syntax().ancestors().skip(1).find_map(ast::Module::cast);
- }
+ {
+ cov_mark::hit!(test_resolve_parent_module_on_module_decl);
+ module = m.syntax().ancestors().skip(1).find_map(ast::Module::cast);
}
match module {
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 6c1d142..634edaa 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -494,10 +494,10 @@
) {
let ra_fixture_after = &trim_indent(ra_fixture_after);
let (analysis, position) = fixture::position(ra_fixture_before);
- if !ra_fixture_after.starts_with("error: ") {
- if let Err(err) = analysis.prepare_rename(position).unwrap() {
- panic!("Prepare rename to '{new_name}' was failed: {err}")
- }
+ if !ra_fixture_after.starts_with("error: ")
+ && let Err(err) = analysis.prepare_rename(position).unwrap()
+ {
+ panic!("Prepare rename to '{new_name}' was failed: {err}")
}
let rename_result = analysis
.rename(position, new_name)
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs
index 9d1a5ba..83e5c5a 100644
--- a/crates/ide/src/runnables.rs
+++ b/crates/ide/src/runnables.rs
@@ -514,20 +514,19 @@
.flat_map(|it| it.name(db))
.for_each(|name| format_to!(path, "{}::", name.display(db, edition)));
// This probably belongs to canonical_path?
- if let Some(assoc_item) = def.as_assoc_item(db) {
- if let Some(ty) = assoc_item.implementing_ty(db) {
- if let Some(adt) = ty.as_adt() {
- let name = adt.name(db);
- let mut ty_args = ty.generic_parameters(db, display_target).peekable();
- format_to!(path, "{}", name.display(db, edition));
- if ty_args.peek().is_some() {
- format_to!(path, "<{}>", ty_args.format_with(",", |ty, cb| cb(&ty)));
- }
- format_to!(path, "::{}", def_name.display(db, edition));
- path.retain(|c| c != ' ');
- return Some(path);
- }
+ if let Some(assoc_item) = def.as_assoc_item(db)
+ && let Some(ty) = assoc_item.implementing_ty(db)
+ && let Some(adt) = ty.as_adt()
+ {
+ let name = adt.name(db);
+ let mut ty_args = ty.generic_parameters(db, display_target).peekable();
+ format_to!(path, "{}", name.display(db, edition));
+ if ty_args.peek().is_some() {
+ format_to!(path, "<{}>", ty_args.format_with(",", |ty, cb| cb(&ty)));
}
+ format_to!(path, "::{}", def_name.display(db, edition));
+ path.retain(|c| c != ' ');
+ return Some(path);
}
format_to!(path, "{}", def_name.display(db, edition));
Some(path)
@@ -697,14 +696,13 @@
continue;
};
for item in items {
- if let hir::ItemInNs::Macros(makro) = item {
- if Definition::Macro(makro)
+ if let hir::ItemInNs::Macros(makro) = item
+ && Definition::Macro(makro)
.usages(sema)
.in_scope(&search_scope)
.at_least_one()
- {
- return true;
- }
+ {
+ return true;
}
}
}
diff --git a/crates/ide/src/signature_help.rs b/crates/ide/src/signature_help.rs
index e30a3eb..382573b 100644
--- a/crates/ide/src/signature_help.rs
+++ b/crates/ide/src/signature_help.rs
@@ -146,12 +146,11 @@
// Stop at multi-line expressions, since the signature of the outer call is not very
// helpful inside them.
- if let Some(expr) = ast::Expr::cast(node.clone()) {
- if !matches!(expr, ast::Expr::RecordExpr(..))
- && expr.syntax().text().contains_char('\n')
- {
- break;
- }
+ if let Some(expr) = ast::Expr::cast(node.clone())
+ && !matches!(expr, ast::Expr::RecordExpr(..))
+ && expr.syntax().text().contains_char('\n')
+ {
+ break;
}
}
@@ -366,10 +365,10 @@
res.signature.push('<');
let mut buf = String::new();
for param in params {
- if let hir::GenericParam::TypeParam(ty) = param {
- if ty.is_implicit(db) {
- continue;
- }
+ if let hir::GenericParam::TypeParam(ty) = param
+ && ty.is_implicit(db)
+ {
+ continue;
}
buf.clear();
diff --git a/crates/ide/src/static_index.rs b/crates/ide/src/static_index.rs
index efee39c..694ac22 100644
--- a/crates/ide/src/static_index.rs
+++ b/crates/ide/src/static_index.rs
@@ -133,10 +133,10 @@
) -> Option<ArrayVec<Definition, 2>> {
for token in sema.descend_into_macros_exact(token) {
let def = IdentClass::classify_token(sema, &token).map(IdentClass::definitions_no_ops);
- if let Some(defs) = def {
- if !defs.is_empty() {
- return Some(defs);
- }
+ if let Some(defs) = def
+ && !defs.is_empty()
+ {
+ return Some(defs);
}
}
None
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index 87db0cd..8bde8fd 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -306,12 +306,12 @@
};
let mut h = match name_class {
NameRefClass::Definition(def, _) => {
- if let Definition::Local(local) = &def {
- if let Some(bindings_shadow_count) = bindings_shadow_count {
- let name = local.name(sema.db);
- let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
- *binding_hash = Some(calc_binding_hash(&name, *shadow_count))
- }
+ if let Definition::Local(local) = &def
+ && let Some(bindings_shadow_count) = bindings_shadow_count
+ {
+ let name = local.name(sema.db);
+ let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
+ *binding_hash = Some(calc_binding_hash(&name, *shadow_count))
};
let mut h = highlight_def(sema, krate, def, edition, true);
@@ -437,21 +437,21 @@
edition: Edition,
) -> Highlight {
let name_kind = NameClass::classify(sema, &name);
- if let Some(NameClass::Definition(Definition::Local(local))) = &name_kind {
- if let Some(bindings_shadow_count) = bindings_shadow_count {
- let name = local.name(sema.db);
- let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
- *shadow_count += 1;
- *binding_hash = Some(calc_binding_hash(&name, *shadow_count))
- }
+ if let Some(NameClass::Definition(Definition::Local(local))) = &name_kind
+ && let Some(bindings_shadow_count) = bindings_shadow_count
+ {
+ let name = local.name(sema.db);
+ let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
+ *shadow_count += 1;
+ *binding_hash = Some(calc_binding_hash(&name, *shadow_count))
};
match name_kind {
Some(NameClass::Definition(def)) => {
let mut h = highlight_def(sema, krate, def, edition, false) | HlMod::Definition;
- if let Definition::Trait(trait_) = &def {
- if trait_.is_unsafe(sema.db) {
- h |= HlMod::Unsafe;
- }
+ if let Definition::Trait(trait_) = &def
+ && trait_.is_unsafe(sema.db)
+ {
+ h |= HlMod::Unsafe;
}
h
}
@@ -743,10 +743,9 @@
hir::Access::Owned => {
if let Some(receiver_ty) =
method_call.receiver().and_then(|it| sema.type_of_expr(&it))
+ && !receiver_ty.adjusted().is_copy(sema.db)
{
- if !receiver_ty.adjusted().is_copy(sema.db) {
- h |= HlMod::Consuming
- }
+ h |= HlMod::Consuming
}
}
}
diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs
index 98f415a..ad838a6 100644
--- a/crates/load-cargo/src/lib.rs
+++ b/crates/load-cargo/src/lib.rs
@@ -475,10 +475,10 @@
}
let changes = vfs.take_changes();
for (_, file) in changes {
- if let vfs::Change::Create(v, _) | vfs::Change::Modify(v, _) = file.change {
- if let Ok(text) = String::from_utf8(v) {
- analysis_change.change_file(file.file_id, Some(text))
- }
+ if let vfs::Change::Create(v, _) | vfs::Change::Modify(v, _) = file.change
+ && let Ok(text) = String::from_utf8(v)
+ {
+ analysis_change.change_file(file.file_id, Some(text))
}
}
let source_roots = source_root_config.partition(vfs);
diff --git a/crates/mbe/src/benchmark.rs b/crates/mbe/src/benchmark.rs
index 04ac85a..b185556 100644
--- a/crates/mbe/src/benchmark.rs
+++ b/crates/mbe/src/benchmark.rs
@@ -185,24 +185,22 @@
for it in tokens.iter() {
collect_from_op(it, builder, seed);
}
- if i + 1 != cnt {
- if let Some(sep) = separator {
- match &**sep {
- Separator::Literal(it) => {
- builder.push(tt::Leaf::Literal(it.clone()))
+ if i + 1 != cnt
+ && let Some(sep) = separator
+ {
+ match &**sep {
+ Separator::Literal(it) => builder.push(tt::Leaf::Literal(it.clone())),
+ Separator::Ident(it) => builder.push(tt::Leaf::Ident(it.clone())),
+ Separator::Puncts(puncts) => {
+ for it in puncts {
+ builder.push(tt::Leaf::Punct(*it))
}
- Separator::Ident(it) => builder.push(tt::Leaf::Ident(it.clone())),
- Separator::Puncts(puncts) => {
- for it in puncts {
- builder.push(tt::Leaf::Punct(*it))
- }
- }
- Separator::Lifetime(punct, ident) => {
- builder.push(tt::Leaf::Punct(*punct));
- builder.push(tt::Leaf::Ident(ident.clone()));
- }
- };
- }
+ }
+ Separator::Lifetime(punct, ident) => {
+ builder.push(tt::Leaf::Punct(*punct));
+ builder.push(tt::Leaf::Ident(ident.clone()));
+ }
+ };
}
}
}
diff --git a/crates/mbe/src/expander/matcher.rs b/crates/mbe/src/expander/matcher.rs
index a8d5965..189efcd 100644
--- a/crates/mbe/src/expander/matcher.rs
+++ b/crates/mbe/src/expander/matcher.rs
@@ -475,12 +475,12 @@
})
}
OpDelimited::Op(Op::Subtree { tokens, delimiter }) => {
- if let Ok((subtree, _)) = src.clone().expect_subtree() {
- if subtree.delimiter.kind == delimiter.kind {
- item.stack.push(item.dot);
- item.dot = tokens.iter_delimited_with(*delimiter);
- cur_items.push(item);
- }
+ if let Ok((subtree, _)) = src.clone().expect_subtree()
+ && subtree.delimiter.kind == delimiter.kind
+ {
+ item.stack.push(item.dot);
+ item.dot = tokens.iter_delimited_with(*delimiter);
+ cur_items.push(item);
}
}
OpDelimited::Op(Op::Var { kind, name, .. }) => {
diff --git a/crates/parser/src/grammar/expressions.rs b/crates/parser/src/grammar/expressions.rs
index 2b4151e..41fd72d 100644
--- a/crates/parser/src/grammar/expressions.rs
+++ b/crates/parser/src/grammar/expressions.rs
@@ -77,38 +77,38 @@
return;
}
- if let Some((cm, blocklike)) = expr_stmt(p, Some(m)) {
- if !(p.at(T!['}']) || (semicolon != Semicolon::Required && p.at(EOF))) {
- // test no_semi_after_block
- // fn foo() {
- // if true {}
- // loop {}
- // match () {}
- // while true {}
- // for _ in () {}
- // {}
- // {}
- // macro_rules! test {
- // () => {}
- // }
- // test!{}
- // }
- let m = cm.precede(p);
- match semicolon {
- Semicolon::Required => {
- if blocklike.is_block() {
- p.eat(T![;]);
- } else {
- p.expect(T![;]);
- }
- }
- Semicolon::Optional => {
+ if let Some((cm, blocklike)) = expr_stmt(p, Some(m))
+ && !(p.at(T!['}']) || (semicolon != Semicolon::Required && p.at(EOF)))
+ {
+ // test no_semi_after_block
+ // fn foo() {
+ // if true {}
+ // loop {}
+ // match () {}
+ // while true {}
+ // for _ in () {}
+ // {}
+ // {}
+ // macro_rules! test {
+ // () => {}
+ // }
+ // test!{}
+ // }
+ let m = cm.precede(p);
+ match semicolon {
+ Semicolon::Required => {
+ if blocklike.is_block() {
p.eat(T![;]);
+ } else {
+ p.expect(T![;]);
}
- Semicolon::Forbidden => (),
}
- m.complete(p, EXPR_STMT);
+ Semicolon::Optional => {
+ p.eat(T![;]);
+ }
+ Semicolon::Forbidden => (),
}
+ m.complete(p, EXPR_STMT);
}
}
@@ -134,14 +134,11 @@
if p.at(T![else]) {
// test_err let_else_right_curly_brace
// fn func() { let Some(_) = {Some(1)} else { panic!("h") };}
- if let Some(expr) = expr_after_eq {
- if let Some(token) = expr.last_token(p) {
- if token == T!['}'] {
- p.error(
- "right curly brace `}` before `else` in a `let...else` statement not allowed"
- )
- }
- }
+ if let Some(expr) = expr_after_eq
+ && let Some(token) = expr.last_token(p)
+ && token == T!['}']
+ {
+ p.error("right curly brace `}` before `else` in a `let...else` statement not allowed")
}
// test let_else
diff --git a/crates/parser/src/input.rs b/crates/parser/src/input.rs
index 4490956..331bc58 100644
--- a/crates/parser/src/input.rs
+++ b/crates/parser/src/input.rs
@@ -61,7 +61,7 @@
#[inline]
fn push_impl(&mut self, kind: SyntaxKind, contextual_kind: SyntaxKind) {
let idx = self.len();
- if idx % (bits::BITS as usize) == 0 {
+ if idx.is_multiple_of(bits::BITS as usize) {
self.joint.push(0);
}
self.kind.push(kind);
diff --git a/crates/parser/src/shortcuts.rs b/crates/parser/src/shortcuts.rs
index e2baec8..d5e5139 100644
--- a/crates/parser/src/shortcuts.rs
+++ b/crates/parser/src/shortcuts.rs
@@ -252,10 +252,10 @@
WHITESPACE if text.contains("\n\n") => {
// we check whether the next token is a doc-comment
// and skip the whitespace in this case
- if let Some((COMMENT, peek_text)) = trivias.peek().map(|(_, pair)| pair) {
- if is_outer(peek_text) {
- continue;
- }
+ if let Some((COMMENT, peek_text)) = trivias.peek().map(|(_, pair)| pair)
+ && is_outer(peek_text)
+ {
+ continue;
}
break;
}
diff --git a/crates/query-group-macro/src/lib.rs b/crates/query-group-macro/src/lib.rs
index ec4b6b2..277cc0b 100644
--- a/crates/query-group-macro/src/lib.rs
+++ b/crates/query-group-macro/src/lib.rs
@@ -278,15 +278,15 @@
return Err(syn::Error::new(signature.span(), "Queries must have a return type"));
};
- if let syn::Type::Path(ref ty_path) = *return_ty {
- if matches!(query_kind, QueryKind::Input) {
- let field = InputStructField {
- name: method_name.to_token_stream(),
- ty: ty_path.path.to_token_stream(),
- };
+ if let syn::Type::Path(ref ty_path) = *return_ty
+ && matches!(query_kind, QueryKind::Input)
+ {
+ let field = InputStructField {
+ name: method_name.to_token_stream(),
+ ty: ty_path.path.to_token_stream(),
+ };
- input_struct_fields.push(field);
- }
+ input_struct_fields.push(field);
}
if let Some(block) = &mut method.default {
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs
index 4dba97c..ab045e0 100644
--- a/crates/rust-analyzer/src/bin/main.rs
+++ b/crates/rust-analyzer/src/bin/main.rs
@@ -122,12 +122,12 @@
// directory which we set to the project workspace.
// https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/general-environment-variables
// https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-syminitialize
- if let Ok(path) = env::current_exe() {
- if let Some(path) = path.parent() {
- // SAFETY: This is safe because this is single-threaded.
- unsafe {
- env::set_var("_NT_SYMBOL_PATH", path);
- }
+ if let Ok(path) = env::current_exe()
+ && let Some(path) = path.parent()
+ {
+ // SAFETY: This is safe because this is single-threaded.
+ unsafe {
+ env::set_var("_NT_SYMBOL_PATH", path);
}
}
}
diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs
index 4f75d14..9788684 100644
--- a/crates/rust-analyzer/src/cli/analysis_stats.rs
+++ b/crates/rust-analyzer/src/cli/analysis_stats.rs
@@ -136,34 +136,30 @@
for source_root_id in source_roots {
let source_root = db.source_root(source_root_id).source_root(db);
for file_id in source_root.iter() {
- if let Some(p) = source_root.path_for_file(&file_id) {
- if let Some((_, Some("rs"))) = p.name_and_extension() {
- // measure workspace/project code
- if !source_root.is_library || self.with_deps {
- let length = db.file_text(file_id).text(db).lines().count();
- let item_stats = db
- .file_item_tree(
- EditionedFileId::current_edition(db, file_id).into(),
- )
- .item_tree_stats()
- .into();
+ if let Some(p) = source_root.path_for_file(&file_id)
+ && let Some((_, Some("rs"))) = p.name_and_extension()
+ {
+ // measure workspace/project code
+ if !source_root.is_library || self.with_deps {
+ let length = db.file_text(file_id).text(db).lines().count();
+ let item_stats = db
+ .file_item_tree(EditionedFileId::current_edition(db, file_id).into())
+ .item_tree_stats()
+ .into();
- workspace_loc += length;
- workspace_item_trees += 1;
- workspace_item_stats += item_stats;
- } else {
- let length = db.file_text(file_id).text(db).lines().count();
- let item_stats = db
- .file_item_tree(
- EditionedFileId::current_edition(db, file_id).into(),
- )
- .item_tree_stats()
- .into();
+ workspace_loc += length;
+ workspace_item_trees += 1;
+ workspace_item_stats += item_stats;
+ } else {
+ let length = db.file_text(file_id).text(db).lines().count();
+ let item_stats = db
+ .file_item_tree(EditionedFileId::current_edition(db, file_id).into())
+ .item_tree_stats()
+ .into();
- dep_loc += length;
- dep_item_trees += 1;
- dep_item_stats += item_stats;
- }
+ dep_loc += length;
+ dep_item_trees += 1;
+ dep_item_stats += item_stats;
}
}
}
@@ -560,29 +556,35 @@
std::fs::write(path, txt).unwrap();
let res = ws.run_build_scripts(&cargo_config, &|_| ()).unwrap();
- if let Some(err) = res.error() {
- if err.contains("error: could not compile") {
- if let Some(mut err_idx) = err.find("error[E") {
- err_idx += 7;
- let err_code = &err[err_idx..err_idx + 4];
- match err_code {
- "0282" | "0283" => continue, // Byproduct of testing method
- "0277" | "0308" if generated.contains(&todo) => continue, // See https://github.com/rust-lang/rust/issues/69882
- // FIXME: In some rare cases `AssocItem::container_or_implemented_trait` returns `None` for trait methods.
- // Generated code is valid in case traits are imported
- "0599" if err.contains("the following trait is implemented but not in scope") => continue,
- _ => (),
+ if let Some(err) = res.error()
+ && err.contains("error: could not compile")
+ {
+ if let Some(mut err_idx) = err.find("error[E") {
+ err_idx += 7;
+ let err_code = &err[err_idx..err_idx + 4];
+ match err_code {
+ "0282" | "0283" => continue, // Byproduct of testing method
+ "0277" | "0308" if generated.contains(&todo) => continue, // See https://github.com/rust-lang/rust/issues/69882
+ // FIXME: In some rare cases `AssocItem::container_or_implemented_trait` returns `None` for trait methods.
+ // Generated code is valid in case traits are imported
+ "0599"
+ if err.contains(
+ "the following trait is implemented but not in scope",
+ ) =>
+ {
+ continue;
}
- bar.println(err);
- bar.println(generated);
- acc.error_codes
- .entry(err_code.to_owned())
- .and_modify(|n| *n += 1)
- .or_insert(1);
- } else {
- acc.syntax_errors += 1;
- bar.println(format!("Syntax error: \n{err}"));
+ _ => (),
}
+ bar.println(err);
+ bar.println(generated);
+ acc.error_codes
+ .entry(err_code.to_owned())
+ .and_modify(|n| *n += 1)
+ .or_insert(1);
+ } else {
+ acc.syntax_errors += 1;
+ bar.println(format!("Syntax error: \n{err}"));
}
}
}
@@ -731,12 +733,11 @@
let name = body_id.name(db).unwrap_or_else(Name::missing);
let module = body_id.module(db);
let display_target = module.krate().to_display_target(db);
- if let Some(only_name) = self.only.as_deref() {
- if name.display(db, Edition::LATEST).to_string() != only_name
- && full_name(db, body_id, module) != only_name
- {
- continue;
- }
+ if let Some(only_name) = self.only.as_deref()
+ && name.display(db, Edition::LATEST).to_string() != only_name
+ && full_name(db, body_id, module) != only_name
+ {
+ continue;
}
let msg = move || {
if verbosity.is_verbose() {
diff --git a/crates/rust-analyzer/src/cli/progress_report.rs b/crates/rust-analyzer/src/cli/progress_report.rs
index 1b9b870..0283113 100644
--- a/crates/rust-analyzer/src/cli/progress_report.rs
+++ b/crates/rust-analyzer/src/cli/progress_report.rs
@@ -83,11 +83,11 @@
output.extend(text.chars().skip(common_prefix_length));
// If the new text is shorter than the old one: delete overlapping characters
- if let Some(overlap_count) = self.text.len().checked_sub(text.len()) {
- if overlap_count > 0 {
- output += &" ".repeat(overlap_count);
- output += &"\x08".repeat(overlap_count);
- }
+ if let Some(overlap_count) = self.text.len().checked_sub(text.len())
+ && overlap_count > 0
+ {
+ output += &" ".repeat(overlap_count);
+ output += &"\x08".repeat(overlap_count);
}
let _ = io::stdout().write(output.as_bytes());
diff --git a/crates/rust-analyzer/src/cli/rustc_tests.rs b/crates/rust-analyzer/src/cli/rustc_tests.rs
index 30ac93f..36ae98b 100644
--- a/crates/rust-analyzer/src/cli/rustc_tests.rs
+++ b/crates/rust-analyzer/src/cli/rustc_tests.rs
@@ -305,10 +305,10 @@
for i in walk_dir {
let i = i?;
let p = i.into_path();
- if let Some(f) = &self.filter {
- if !p.as_os_str().to_string_lossy().contains(f) {
- continue;
- }
+ if let Some(f) = &self.filter
+ && !p.as_os_str().to_string_lossy().contains(f)
+ {
+ continue;
}
if p.extension().is_none_or(|x| x != "rs") {
continue;
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index a8bcce1..70d0448 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -3904,17 +3904,16 @@
for idx in url_offsets {
let link = &schema[idx..];
// matching on whitespace to ignore normal links
- if let Some(link_end) = link.find([' ', '[']) {
- if link.chars().nth(link_end) == Some('[') {
- if let Some(link_text_end) = link.find(']') {
- let link_text = link[link_end..(link_text_end + 1)].to_string();
+ if let Some(link_end) = link.find([' ', '['])
+ && link.chars().nth(link_end) == Some('[')
+ && let Some(link_text_end) = link.find(']')
+ {
+ let link_text = link[link_end..(link_text_end + 1)].to_string();
- schema.replace_range((idx + link_end)..(idx + link_text_end + 1), "");
- schema.insert(idx, '(');
- schema.insert(idx + link_end + 1, ')');
- schema.insert_str(idx, &link_text);
- }
- }
+ schema.replace_range((idx + link_end)..(idx + link_text_end + 1), "");
+ schema.insert(idx, '(');
+ schema.insert(idx + link_end + 1, ')');
+ schema.insert_str(idx, &link_text);
}
}
diff --git a/crates/rust-analyzer/src/config/patch_old_style.rs b/crates/rust-analyzer/src/config/patch_old_style.rs
index 95857dd..389bb78 100644
--- a/crates/rust-analyzer/src/config/patch_old_style.rs
+++ b/crates/rust-analyzer/src/config/patch_old_style.rs
@@ -73,19 +73,19 @@
}
// completion.snippets -> completion.snippets.custom;
- if let Some(Value::Object(obj)) = copy.pointer("/completion/snippets").cloned() {
- if obj.len() != 1 || obj.get("custom").is_none() {
- merge(
- json,
- json! {{
- "completion": {
- "snippets": {
- "custom": obj
- },
+ if let Some(Value::Object(obj)) = copy.pointer("/completion/snippets").cloned()
+ && (obj.len() != 1 || obj.get("custom").is_none())
+ {
+ merge(
+ json,
+ json! {{
+ "completion": {
+ "snippets": {
+ "custom": obj
},
- }},
- );
- }
+ },
+ }},
+ );
}
// callInfo_full -> signatureInfo_detail, signatureInfo_documentation_enable
diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs
index 79d8f67..3f64628 100644
--- a/crates/rust-analyzer/src/diagnostics/to_proto.rs
+++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs
@@ -298,10 +298,10 @@
let mut source = String::from("rustc");
let mut code = rd.code.as_ref().map(|c| c.code.clone());
- if let Some(code_val) = &code {
- if config.check_ignore.contains(code_val) {
- return Vec::new();
- }
+ if let Some(code_val) = &code
+ && config.check_ignore.contains(code_val)
+ {
+ return Vec::new();
}
if let Some(code_val) = &code {
@@ -373,10 +373,8 @@
let primary_location = primary_location(config, workspace_root, primary_span, snap);
let message = {
let mut message = message.clone();
- if needs_primary_span_label {
- if let Some(primary_span_label) = &primary_span.label {
- format_to!(message, "\n{}", primary_span_label);
- }
+ if needs_primary_span_label && let Some(primary_span_label) = &primary_span.label {
+ format_to!(message, "\n{}", primary_span_label);
}
message
};
diff --git a/crates/rust-analyzer/src/flycheck.rs b/crates/rust-analyzer/src/flycheck.rs
index 512ce0b..e4e0bcd 100644
--- a/crates/rust-analyzer/src/flycheck.rs
+++ b/crates/rust-analyzer/src/flycheck.rs
@@ -492,12 +492,11 @@
FlycheckConfig::CargoCommand { command, options, ansi_color_output } => {
let mut cmd =
toolchain::command(Tool::Cargo.path(), &*self.root, &options.extra_env);
- if let Some(sysroot_root) = &self.sysroot_root {
- if !options.extra_env.contains_key("RUSTUP_TOOLCHAIN")
- && std::env::var_os("RUSTUP_TOOLCHAIN").is_none()
- {
- cmd.env("RUSTUP_TOOLCHAIN", AsRef::<std::path::Path>::as_ref(sysroot_root));
- }
+ if let Some(sysroot_root) = &self.sysroot_root
+ && !options.extra_env.contains_key("RUSTUP_TOOLCHAIN")
+ && std::env::var_os("RUSTUP_TOOLCHAIN").is_none()
+ {
+ cmd.env("RUSTUP_TOOLCHAIN", AsRef::<std::path::Path>::as_ref(sysroot_root));
}
cmd.arg(command);
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index 62a28a1..3171bdd 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -591,10 +591,10 @@
pub(crate) fn respond(&mut self, response: lsp_server::Response) {
if let Some((method, start)) = self.req_queue.incoming.complete(&response.id) {
- if let Some(err) = &response.error {
- if err.message.starts_with("server panicked") {
- self.poke_rust_analyzer_developer(format!("{}, check the log", err.message));
- }
+ if let Some(err) = &response.error
+ && err.message.starts_with("server panicked")
+ {
+ self.poke_rust_analyzer_developer(format!("{}, check the log", err.message));
}
let duration = start.elapsed();
@@ -663,18 +663,18 @@
pub(crate) fn check_workspaces_msrv(&self) -> impl Iterator<Item = String> + '_ {
self.workspaces.iter().filter_map(|ws| {
- if let Some(toolchain) = &ws.toolchain {
- if *toolchain < crate::MINIMUM_SUPPORTED_TOOLCHAIN_VERSION {
- return Some(format!(
- "Workspace `{}` is using an outdated toolchain version `{}` but \
+ if let Some(toolchain) = &ws.toolchain
+ && *toolchain < crate::MINIMUM_SUPPORTED_TOOLCHAIN_VERSION
+ {
+ return Some(format!(
+ "Workspace `{}` is using an outdated toolchain version `{}` but \
rust-analyzer only supports `{}` and higher.\n\
Consider using the rust-analyzer rustup component for your toolchain or
upgrade your toolchain to a supported version.\n\n",
- ws.manifest_or_root(),
- toolchain,
- crate::MINIMUM_SUPPORTED_TOOLCHAIN_VERSION,
- ));
- }
+ ws.manifest_or_root(),
+ toolchain,
+ crate::MINIMUM_SUPPORTED_TOOLCHAIN_VERSION,
+ ));
}
None
})
diff --git a/crates/rust-analyzer/src/handlers/dispatch.rs b/crates/rust-analyzer/src/handlers/dispatch.rs
index aea116e..b25245d 100644
--- a/crates/rust-analyzer/src/handlers/dispatch.rs
+++ b/crates/rust-analyzer/src/handlers/dispatch.rs
@@ -433,10 +433,10 @@
}
pub(crate) fn finish(&mut self) {
- if let Some(not) = &self.not {
- if !not.method.starts_with("$/") {
- tracing::error!("unhandled notification: {:?}", not);
- }
+ if let Some(not) = &self.not
+ && !not.method.starts_with("$/")
+ {
+ tracing::error!("unhandled notification: {:?}", not);
}
}
}
diff --git a/crates/rust-analyzer/src/handlers/notification.rs b/crates/rust-analyzer/src/handlers/notification.rs
index 200e972..e193ff7 100644
--- a/crates/rust-analyzer/src/handlers/notification.rs
+++ b/crates/rust-analyzer/src/handlers/notification.rs
@@ -39,14 +39,12 @@
state: &mut GlobalState,
params: WorkDoneProgressCancelParams,
) -> anyhow::Result<()> {
- if let lsp_types::NumberOrString::String(s) = ¶ms.token {
- if let Some(id) = s.strip_prefix("rust-analyzer/flycheck/") {
- if let Ok(id) = id.parse::<u32>() {
- if let Some(flycheck) = state.flycheck.get(id as usize) {
- flycheck.cancel();
- }
- }
- }
+ if let lsp_types::NumberOrString::String(s) = ¶ms.token
+ && let Some(id) = s.strip_prefix("rust-analyzer/flycheck/")
+ && let Ok(id) = id.parse::<u32>()
+ && let Some(flycheck) = state.flycheck.get(id as usize)
+ {
+ flycheck.cancel();
}
// Just ignore this. It is OK to continue sending progress
@@ -76,12 +74,12 @@
tracing::error!("duplicate DidOpenTextDocument: {}", path);
}
- if let Some(abs_path) = path.as_path() {
- if state.config.excluded().any(|excluded| abs_path.starts_with(&excluded)) {
- tracing::trace!("opened excluded file {abs_path}");
- state.vfs.write().0.insert_excluded_file(path);
- return Ok(());
- }
+ if let Some(abs_path) = path.as_path()
+ && state.config.excluded().any(|excluded| abs_path.starts_with(&excluded))
+ {
+ tracing::trace!("opened excluded file {abs_path}");
+ state.vfs.write().0.insert_excluded_file(path);
+ return Ok(());
}
let contents = params.text_document.text.into_bytes();
@@ -449,12 +447,11 @@
params: RunFlycheckParams,
) -> anyhow::Result<()> {
let _p = tracing::info_span!("handle_run_flycheck").entered();
- if let Some(text_document) = params.text_document {
- if let Ok(vfs_path) = from_proto::vfs_path(&text_document.uri) {
- if run_flycheck(state, vfs_path) {
- return Ok(());
- }
- }
+ if let Some(text_document) = params.text_document
+ && let Ok(vfs_path) = from_proto::vfs_path(&text_document.uri)
+ && run_flycheck(state, vfs_path)
+ {
+ return Ok(());
}
// No specific flycheck was triggered, so let's trigger all of them.
if state.config.flycheck_workspace(None) {
diff --git a/crates/rust-analyzer/src/handlers/request.rs b/crates/rust-analyzer/src/handlers/request.rs
index a76a652..25c0aac 100644
--- a/crates/rust-analyzer/src/handlers/request.rs
+++ b/crates/rust-analyzer/src/handlers/request.rs
@@ -973,14 +973,13 @@
res.push(runnable);
}
- if let lsp_ext::RunnableArgs::Cargo(r) = &mut runnable.args {
- if let Some(TargetSpec::Cargo(CargoTargetSpec {
+ if let lsp_ext::RunnableArgs::Cargo(r) = &mut runnable.args
+ && let Some(TargetSpec::Cargo(CargoTargetSpec {
sysroot_root: Some(sysroot_root),
..
})) = &target_spec
- {
- r.environment.insert("RUSTC_TOOLCHAIN".to_owned(), sysroot_root.to_string());
- }
+ {
+ r.environment.insert("RUSTC_TOOLCHAIN".to_owned(), sysroot_root.to_string());
};
res.push(runnable);
@@ -1034,25 +1033,25 @@
}
Some(TargetSpec::ProjectJson(_)) => {}
None => {
- if !snap.config.linked_or_discovered_projects().is_empty() {
- if let Some(path) = snap.file_id_to_file_path(file_id).parent() {
- let mut cargo_args = vec!["check".to_owned(), "--workspace".to_owned()];
- cargo_args.extend(config.cargo_extra_args.iter().cloned());
- res.push(lsp_ext::Runnable {
- label: "cargo check --workspace".to_owned(),
- location: None,
- kind: lsp_ext::RunnableKind::Cargo,
- args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs {
- workspace_root: None,
- cwd: path.as_path().unwrap().to_path_buf().into(),
- override_cargo: config.override_cargo,
- cargo_args,
- executable_args: Vec::new(),
- environment: Default::default(),
- }),
- });
- };
- }
+ if !snap.config.linked_or_discovered_projects().is_empty()
+ && let Some(path) = snap.file_id_to_file_path(file_id).parent()
+ {
+ let mut cargo_args = vec!["check".to_owned(), "--workspace".to_owned()];
+ cargo_args.extend(config.cargo_extra_args.iter().cloned());
+ res.push(lsp_ext::Runnable {
+ label: "cargo check --workspace".to_owned(),
+ location: None,
+ kind: lsp_ext::RunnableKind::Cargo,
+ args: lsp_ext::RunnableArgs::Cargo(lsp_ext::CargoRunnableArgs {
+ workspace_root: None,
+ cwd: path.as_path().unwrap().to_path_buf().into(),
+ override_cargo: config.override_cargo,
+ cargo_args,
+ executable_args: Vec::new(),
+ environment: Default::default(),
+ }),
+ });
+ };
}
}
Ok(res)
@@ -1557,12 +1556,12 @@
code_action.edit = ca.edit;
code_action.command = ca.command;
- if let Some(edit) = code_action.edit.as_ref() {
- if let Some(changes) = edit.document_changes.as_ref() {
- for change in changes {
- if let lsp_ext::SnippetDocumentChangeOperation::Op(res_op) = change {
- resource_ops_supported(&snap.config, resolve_resource_op(res_op))?
- }
+ if let Some(edit) = code_action.edit.as_ref()
+ && let Some(changes) = edit.document_changes.as_ref()
+ {
+ for change in changes {
+ if let lsp_ext::SnippetDocumentChangeOperation::Op(res_op) = change {
+ resource_ops_supported(&snap.config, resolve_resource_op(res_op))?
}
}
}
@@ -1958,12 +1957,11 @@
if let Some(cached_tokens @ lsp_types::SemanticTokens { result_id: Some(prev_id), .. }) =
&cached_tokens
+ && *prev_id == params.previous_result_id
{
- if *prev_id == params.previous_result_id {
- let delta = to_proto::semantic_token_delta(cached_tokens, &semantic_tokens);
- snap.semantic_tokens_cache.lock().insert(params.text_document.uri, semantic_tokens);
- return Ok(Some(delta.into()));
- }
+ let delta = to_proto::semantic_token_delta(cached_tokens, &semantic_tokens);
+ snap.semantic_tokens_cache.lock().insert(params.text_document.uri, semantic_tokens);
+ return Ok(Some(delta.into()));
}
// Clone first to keep the lock short
@@ -2122,24 +2120,25 @@
snap: &GlobalStateSnapshot,
position: &FilePosition,
) -> Option<lsp_ext::CommandLinkGroup> {
- if snap.config.hover_actions().implementations && snap.config.client_commands().show_reference {
- if let Some(nav_data) = snap.analysis.goto_implementation(*position).unwrap_or(None) {
- let uri = to_proto::url(snap, position.file_id);
- let line_index = snap.file_line_index(position.file_id).ok()?;
- let position = to_proto::position(&line_index, position.offset);
- let locations: Vec<_> = nav_data
- .info
- .into_iter()
- .filter_map(|nav| to_proto::location_from_nav(snap, nav).ok())
- .collect();
- let title = to_proto::implementation_title(locations.len());
- let command = to_proto::command::show_references(title, &uri, position, locations);
+ if snap.config.hover_actions().implementations
+ && snap.config.client_commands().show_reference
+ && let Some(nav_data) = snap.analysis.goto_implementation(*position).unwrap_or(None)
+ {
+ let uri = to_proto::url(snap, position.file_id);
+ let line_index = snap.file_line_index(position.file_id).ok()?;
+ let position = to_proto::position(&line_index, position.offset);
+ let locations: Vec<_> = nav_data
+ .info
+ .into_iter()
+ .filter_map(|nav| to_proto::location_from_nav(snap, nav).ok())
+ .collect();
+ let title = to_proto::implementation_title(locations.len());
+ let command = to_proto::command::show_references(title, &uri, position, locations);
- return Some(lsp_ext::CommandLinkGroup {
- commands: vec![to_command_link(command, "Go to implementations".into())],
- ..Default::default()
- });
- }
+ return Some(lsp_ext::CommandLinkGroup {
+ commands: vec![to_command_link(command, "Go to implementations".into())],
+ ..Default::default()
+ });
}
None
}
@@ -2148,28 +2147,29 @@
snap: &GlobalStateSnapshot,
position: &FilePosition,
) -> Option<lsp_ext::CommandLinkGroup> {
- if snap.config.hover_actions().references && snap.config.client_commands().show_reference {
- if let Some(ref_search_res) = snap.analysis.find_all_refs(*position, None).unwrap_or(None) {
- let uri = to_proto::url(snap, position.file_id);
- let line_index = snap.file_line_index(position.file_id).ok()?;
- let position = to_proto::position(&line_index, position.offset);
- let locations: Vec<_> = ref_search_res
- .into_iter()
- .flat_map(|res| res.references)
- .flat_map(|(file_id, ranges)| {
- ranges.into_iter().map(move |(range, _)| FileRange { file_id, range })
- })
- .unique()
- .filter_map(|range| to_proto::location(snap, range).ok())
- .collect();
- let title = to_proto::reference_title(locations.len());
- let command = to_proto::command::show_references(title, &uri, position, locations);
+ if snap.config.hover_actions().references
+ && snap.config.client_commands().show_reference
+ && let Some(ref_search_res) = snap.analysis.find_all_refs(*position, None).unwrap_or(None)
+ {
+ let uri = to_proto::url(snap, position.file_id);
+ let line_index = snap.file_line_index(position.file_id).ok()?;
+ let position = to_proto::position(&line_index, position.offset);
+ let locations: Vec<_> = ref_search_res
+ .into_iter()
+ .flat_map(|res| res.references)
+ .flat_map(|(file_id, ranges)| {
+ ranges.into_iter().map(move |(range, _)| FileRange { file_id, range })
+ })
+ .unique()
+ .filter_map(|range| to_proto::location(snap, range).ok())
+ .collect();
+ let title = to_proto::reference_title(locations.len());
+ let command = to_proto::command::show_references(title, &uri, position, locations);
- return Some(lsp_ext::CommandLinkGroup {
- commands: vec![to_command_link(command, "Go to references".into())],
- ..Default::default()
- });
- }
+ return Some(lsp_ext::CommandLinkGroup {
+ commands: vec![to_command_link(command, "Go to references".into())],
+ ..Default::default()
+ });
}
None
}
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 00cf890..61c758d 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -501,14 +501,12 @@
}
}
- if self.config.cargo_autoreload_config(None)
- || self.config.discover_workspace_config().is_some()
- {
- if let Some((cause, FetchWorkspaceRequest { path, force_crate_graph_reload })) =
+ if (self.config.cargo_autoreload_config(None)
+ || self.config.discover_workspace_config().is_some())
+ && let Some((cause, FetchWorkspaceRequest { path, force_crate_graph_reload })) =
self.fetch_workspaces_queue.should_start_op()
- {
- self.fetch_workspaces(cause, path, force_crate_graph_reload);
- }
+ {
+ self.fetch_workspaces(cause, path, force_crate_graph_reload);
}
if !self.fetch_workspaces_queue.op_in_progress() {
@@ -765,33 +763,33 @@
self.report_progress("Fetching", state, msg, None, None);
}
Task::DiscoverLinkedProjects(arg) => {
- if let Some(cfg) = self.config.discover_workspace_config() {
- if !self.discover_workspace_queue.op_in_progress() {
- // the clone is unfortunately necessary to avoid a borrowck error when
- // `self.report_progress` is called later
- let title = &cfg.progress_label.clone();
- let command = cfg.command.clone();
- let discover = DiscoverCommand::new(self.discover_sender.clone(), command);
+ if let Some(cfg) = self.config.discover_workspace_config()
+ && !self.discover_workspace_queue.op_in_progress()
+ {
+ // the clone is unfortunately necessary to avoid a borrowck error when
+ // `self.report_progress` is called later
+ let title = &cfg.progress_label.clone();
+ let command = cfg.command.clone();
+ let discover = DiscoverCommand::new(self.discover_sender.clone(), command);
- self.report_progress(title, Progress::Begin, None, None, None);
- self.discover_workspace_queue
- .request_op("Discovering workspace".to_owned(), ());
- let _ = self.discover_workspace_queue.should_start_op();
+ self.report_progress(title, Progress::Begin, None, None, None);
+ self.discover_workspace_queue
+ .request_op("Discovering workspace".to_owned(), ());
+ let _ = self.discover_workspace_queue.should_start_op();
- let arg = match arg {
- DiscoverProjectParam::Buildfile(it) => DiscoverArgument::Buildfile(it),
- DiscoverProjectParam::Path(it) => DiscoverArgument::Path(it),
- };
+ let arg = match arg {
+ DiscoverProjectParam::Buildfile(it) => DiscoverArgument::Buildfile(it),
+ DiscoverProjectParam::Path(it) => DiscoverArgument::Path(it),
+ };
- let handle = discover.spawn(
- arg,
- &std::env::current_dir()
- .expect("Failed to get cwd during project discovery"),
- );
- self.discover_handle = Some(handle.unwrap_or_else(|e| {
- panic!("Failed to spawn project discovery command: {e}")
- }));
- }
+ let handle = discover.spawn(
+ arg,
+ &std::env::current_dir()
+ .expect("Failed to get cwd during project discovery"),
+ );
+ self.discover_handle = Some(handle.unwrap_or_else(|e| {
+ panic!("Failed to spawn project discovery command: {e}")
+ }));
}
}
Task::FetchBuildData(progress) => {
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index e798aa6..aa38aa7 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -306,13 +306,13 @@
_ => None,
});
- if let Some(build) = build {
- if is_quiescent {
- let path = AbsPathBuf::try_from(build.build_file)
- .expect("Unable to convert to an AbsPath");
- let arg = DiscoverProjectParam::Buildfile(path);
- sender.send(Task::DiscoverLinkedProjects(arg)).unwrap();
- }
+ if let Some(build) = build
+ && is_quiescent
+ {
+ let path = AbsPathBuf::try_from(build.build_file)
+ .expect("Unable to convert to an AbsPath");
+ let arg = DiscoverProjectParam::Buildfile(path);
+ sender.send(Task::DiscoverLinkedProjects(arg)).unwrap();
}
}
diff --git a/crates/span/src/map.rs b/crates/span/src/map.rs
index f582017..bb09933 100644
--- a/crates/span/src/map.rs
+++ b/crates/span/src/map.rs
@@ -41,13 +41,13 @@
/// Pushes a new span onto the [`SpanMap`].
pub fn push(&mut self, offset: TextSize, span: SpanData<S>) {
- if cfg!(debug_assertions) {
- if let Some(&(last_offset, _)) = self.spans.last() {
- assert!(
- last_offset < offset,
- "last_offset({last_offset:?}) must be smaller than offset({offset:?})"
- );
- }
+ if cfg!(debug_assertions)
+ && let Some(&(last_offset, _)) = self.spans.last()
+ {
+ assert!(
+ last_offset < offset,
+ "last_offset({last_offset:?}) must be smaller than offset({offset:?})"
+ );
}
self.spans.push((offset, span));
}
diff --git a/crates/syntax-bridge/src/lib.rs b/crates/syntax-bridge/src/lib.rs
index d592299..bdff671 100644
--- a/crates/syntax-bridge/src/lib.rs
+++ b/crates/syntax-bridge/src/lib.rs
@@ -768,17 +768,17 @@
}
fn bump(&mut self) -> Option<(Self::Token, TextRange)> {
- if let Some((punct, offset)) = self.punct_offset.clone() {
- if usize::from(offset) + 1 < punct.text().len() {
- let offset = offset + TextSize::of('.');
- let range = punct.text_range();
- self.punct_offset = Some((punct.clone(), offset));
- let range = TextRange::at(range.start() + offset, TextSize::of('.'));
- return Some((
- SynToken::Punct { token: punct, offset: u32::from(offset) as usize },
- range,
- ));
- }
+ if let Some((punct, offset)) = self.punct_offset.clone()
+ && usize::from(offset) + 1 < punct.text().len()
+ {
+ let offset = offset + TextSize::of('.');
+ let range = punct.text_range();
+ self.punct_offset = Some((punct.clone(), offset));
+ let range = TextRange::at(range.start() + offset, TextSize::of('.'));
+ return Some((
+ SynToken::Punct { token: punct, offset: u32::from(offset) as usize },
+ range,
+ ));
}
if let Some(leaf) = self.current_leaves.pop() {
diff --git a/crates/syntax-bridge/src/prettify_macro_expansion.rs b/crates/syntax-bridge/src/prettify_macro_expansion.rs
index 0a5c8df..2f932e0 100644
--- a/crates/syntax-bridge/src/prettify_macro_expansion.rs
+++ b/crates/syntax-bridge/src/prettify_macro_expansion.rs
@@ -61,10 +61,11 @@
}
_ => continue,
};
- if token.kind() == SyntaxKind::IDENT && token.text() == "$crate" {
- if let Some(replacement) = dollar_crate_replacement(&token) {
- dollar_crate_replacements.push((token.clone(), replacement));
- }
+ if token.kind() == SyntaxKind::IDENT
+ && token.text() == "$crate"
+ && let Some(replacement) = dollar_crate_replacement(&token)
+ {
+ dollar_crate_replacements.push((token.clone(), replacement));
}
let tok = &token;
diff --git a/crates/syntax-bridge/src/tests.rs b/crates/syntax-bridge/src/tests.rs
index 8871bf5..c8dc313 100644
--- a/crates/syntax-bridge/src/tests.rs
+++ b/crates/syntax-bridge/src/tests.rs
@@ -34,14 +34,11 @@
while !cursor.eof() {
while let Some(token_tree) = cursor.token_tree() {
if let tt::TokenTree::Leaf(Leaf::Punct(Punct {
- spacing,
- span: Span { range, .. },
- ..
+ spacing, span: Span { range, .. }, ..
})) = token_tree
+ && let Some(expected) = annotations.remove(range)
{
- if let Some(expected) = annotations.remove(range) {
- assert_eq!(expected, *spacing);
- }
+ assert_eq!(expected, *spacing);
}
cursor.bump();
}
diff --git a/crates/syntax-bridge/src/to_parser_input.rs b/crates/syntax-bridge/src/to_parser_input.rs
index 021dc65..c0ff8e1 100644
--- a/crates/syntax-bridge/src/to_parser_input.rs
+++ b/crates/syntax-bridge/src/to_parser_input.rs
@@ -21,17 +21,17 @@
let tt = current.token_tree();
// Check if it is lifetime
- if let Some(tt::TokenTree::Leaf(tt::Leaf::Punct(punct))) = tt {
- if punct.char == '\'' {
- current.bump();
- match current.token_tree() {
- Some(tt::TokenTree::Leaf(tt::Leaf::Ident(_ident))) => {
- res.push(LIFETIME_IDENT);
- current.bump();
- continue;
- }
- _ => panic!("Next token must be ident"),
+ if let Some(tt::TokenTree::Leaf(tt::Leaf::Punct(punct))) = tt
+ && punct.char == '\''
+ {
+ current.bump();
+ match current.token_tree() {
+ Some(tt::TokenTree::Leaf(tt::Leaf::Ident(_ident))) => {
+ res.push(LIFETIME_IDENT);
+ current.bump();
+ continue;
}
+ _ => panic!("Next token must be ident"),
}
}
diff --git a/crates/syntax/src/ast/edit.rs b/crates/syntax/src/ast/edit.rs
index d97fdec..9b30642 100644
--- a/crates/syntax/src/ast/edit.rs
+++ b/crates/syntax/src/ast/edit.rs
@@ -89,11 +89,11 @@
_ => None,
});
for token in tokens {
- if let Some(ws) = ast::Whitespace::cast(token) {
- if ws.text().contains('\n') {
- let new_ws = make::tokens::whitespace(&format!("{}{self}", ws.syntax()));
- ted::replace(ws.syntax(), &new_ws);
- }
+ if let Some(ws) = ast::Whitespace::cast(token)
+ && ws.text().contains('\n')
+ {
+ let new_ws = make::tokens::whitespace(&format!("{}{self}", ws.syntax()));
+ ted::replace(ws.syntax(), &new_ws);
}
}
}
@@ -122,13 +122,13 @@
_ => None,
});
for token in tokens {
- if let Some(ws) = ast::Whitespace::cast(token) {
- if ws.text().contains('\n') {
- let new_ws = make::tokens::whitespace(
- &ws.syntax().text().replace(&format!("\n{self}"), "\n"),
- );
- ted::replace(ws.syntax(), &new_ws);
- }
+ if let Some(ws) = ast::Whitespace::cast(token)
+ && ws.text().contains('\n')
+ {
+ let new_ws = make::tokens::whitespace(
+ &ws.syntax().text().replace(&format!("\n{self}"), "\n"),
+ );
+ ted::replace(ws.syntax(), &new_ws);
}
}
}
diff --git a/crates/syntax/src/ast/edit_in_place.rs b/crates/syntax/src/ast/edit_in_place.rs
index 28b543e..f01ac08 100644
--- a/crates/syntax/src/ast/edit_in_place.rs
+++ b/crates/syntax/src/ast/edit_in_place.rs
@@ -383,10 +383,10 @@
impl ast::WhereClause {
pub fn add_predicate(&self, predicate: ast::WherePred) {
- if let Some(pred) = self.predicates().last() {
- if !pred.syntax().siblings_with_tokens(Direction::Next).any(|it| it.kind() == T![,]) {
- ted::append_child_raw(self.syntax(), make::token(T![,]));
- }
+ if let Some(pred) = self.predicates().last()
+ && !pred.syntax().siblings_with_tokens(Direction::Next).any(|it| it.kind() == T![,])
+ {
+ ted::append_child_raw(self.syntax(), make::token(T![,]));
}
ted::append_child(self.syntax(), predicate.syntax());
}
@@ -744,10 +744,10 @@
}
if let Some(existing_ty) = self.ty() {
- if let Some(sibling) = existing_ty.syntax().prev_sibling_or_token() {
- if sibling.kind() == SyntaxKind::WHITESPACE {
- ted::remove(sibling);
- }
+ if let Some(sibling) = existing_ty.syntax().prev_sibling_or_token()
+ && sibling.kind() == SyntaxKind::WHITESPACE
+ {
+ ted::remove(sibling);
}
ted::remove(existing_ty.syntax());
@@ -823,19 +823,18 @@
return;
}
// this is a shorthand
- if let Some(ast::Expr::PathExpr(path_expr)) = self.expr() {
- if let Some(path) = path_expr.path() {
- if let Some(name_ref) = path.as_single_name_ref() {
- path_expr.syntax().detach();
- let children = vec![
- name_ref.syntax().clone().into(),
- ast::make::token(T![:]).into(),
- ast::make::tokens::single_space().into(),
- expr.syntax().clone().into(),
- ];
- ted::insert_all_raw(Position::last_child_of(self.syntax()), children);
- }
- }
+ if let Some(ast::Expr::PathExpr(path_expr)) = self.expr()
+ && let Some(path) = path_expr.path()
+ && let Some(name_ref) = path.as_single_name_ref()
+ {
+ path_expr.syntax().detach();
+ let children = vec![
+ name_ref.syntax().clone().into(),
+ ast::make::token(T![:]).into(),
+ ast::make::tokens::single_space().into(),
+ expr.syntax().clone().into(),
+ ];
+ ted::insert_all_raw(Position::last_child_of(self.syntax()), children);
}
}
}
diff --git a/crates/syntax/src/ast/prec.rs b/crates/syntax/src/ast/prec.rs
index 00750bf..1364adb 100644
--- a/crates/syntax/src/ast/prec.rs
+++ b/crates/syntax/src/ast/prec.rs
@@ -276,19 +276,19 @@
}
// Not every expression can be followed by `else` in the `let-else`
- if let Some(ast::Stmt::LetStmt(e)) = stmt {
- if e.let_else().is_some() {
- match self {
- BinExpr(e)
- if e.op_kind()
- .map(|op| matches!(op, BinaryOp::LogicOp(_)))
- .unwrap_or(false) =>
- {
- return true;
- }
- _ if self.clone().trailing_brace().is_some() => return true,
- _ => {}
+ if let Some(ast::Stmt::LetStmt(e)) = stmt
+ && e.let_else().is_some()
+ {
+ match self {
+ BinExpr(e)
+ if e.op_kind()
+ .map(|op| matches!(op, BinaryOp::LogicOp(_)))
+ .unwrap_or(false) =>
+ {
+ return true;
}
+ _ if self.clone().trailing_brace().is_some() => return true,
+ _ => {}
}
}
diff --git a/crates/syntax/src/syntax_editor.rs b/crates/syntax/src/syntax_editor.rs
index 5107754..124ac5c 100644
--- a/crates/syntax/src/syntax_editor.rs
+++ b/crates/syntax/src/syntax_editor.rs
@@ -626,10 +626,10 @@
if let Some(ret_ty) = parent_fn.ret_type() {
editor.delete(ret_ty.syntax().clone());
- if let Some(SyntaxElement::Token(token)) = ret_ty.syntax().next_sibling_or_token() {
- if token.kind().is_trivia() {
- editor.delete(token);
- }
+ if let Some(SyntaxElement::Token(token)) = ret_ty.syntax().next_sibling_or_token()
+ && token.kind().is_trivia()
+ {
+ editor.delete(token);
}
}
diff --git a/crates/syntax/src/ted.rs b/crates/syntax/src/ted.rs
index 6fcbdd0..5c28647 100644
--- a/crates/syntax/src/ted.rs
+++ b/crates/syntax/src/ted.rs
@@ -90,15 +90,15 @@
insert_all_raw(position, vec![elem.syntax_element()]);
}
pub fn insert_all(position: Position, mut elements: Vec<SyntaxElement>) {
- if let Some(first) = elements.first() {
- if let Some(ws) = ws_before(&position, first) {
- elements.insert(0, ws.into());
- }
+ if let Some(first) = elements.first()
+ && let Some(ws) = ws_before(&position, first)
+ {
+ elements.insert(0, ws.into());
}
- if let Some(last) = elements.last() {
- if let Some(ws) = ws_after(&position, last) {
- elements.push(ws.into());
- }
+ if let Some(last) = elements.last()
+ && let Some(ws) = ws_after(&position, last)
+ {
+ elements.push(ws.into());
}
insert_all_raw(position, elements);
}
@@ -165,20 +165,22 @@
PositionRepr::After(it) => it,
};
- if prev.kind() == T!['{'] && new.kind() == SyntaxKind::USE {
- if let Some(item_list) = prev.parent().and_then(ast::ItemList::cast) {
- let mut indent = IndentLevel::from_element(&item_list.syntax().clone().into());
- indent.0 += 1;
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
- }
+ if prev.kind() == T!['{']
+ && new.kind() == SyntaxKind::USE
+ && let Some(item_list) = prev.parent().and_then(ast::ItemList::cast)
+ {
+ let mut indent = IndentLevel::from_element(&item_list.syntax().clone().into());
+ indent.0 += 1;
+ return Some(make::tokens::whitespace(&format!("\n{indent}")));
}
- if prev.kind() == T!['{'] && ast::Stmt::can_cast(new.kind()) {
- if let Some(stmt_list) = prev.parent().and_then(ast::StmtList::cast) {
- let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into());
- indent.0 += 1;
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
- }
+ if prev.kind() == T!['{']
+ && ast::Stmt::can_cast(new.kind())
+ && let Some(stmt_list) = prev.parent().and_then(ast::StmtList::cast)
+ {
+ let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into());
+ indent.0 += 1;
+ return Some(make::tokens::whitespace(&format!("\n{indent}")));
}
ws_between(prev, new)
diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs
index 4180f9c..485140b 100644
--- a/crates/syntax/src/validation.rs
+++ b/crates/syntax/src/validation.rs
@@ -142,50 +142,50 @@
match literal.kind() {
ast::LiteralKind::String(s) => {
- if !s.is_raw() {
- if let Some(without_quotes) = unquote(text, 1, '"') {
- unescape_str(without_quotes, |range, char| {
- if let Err(err) = char {
- push_err(1, range.start, err);
- }
- });
- }
+ if !s.is_raw()
+ && let Some(without_quotes) = unquote(text, 1, '"')
+ {
+ unescape_str(without_quotes, |range, char| {
+ if let Err(err) = char {
+ push_err(1, range.start, err);
+ }
+ });
}
}
ast::LiteralKind::ByteString(s) => {
- if !s.is_raw() {
- if let Some(without_quotes) = unquote(text, 2, '"') {
- unescape_byte_str(without_quotes, |range, char| {
- if let Err(err) = char {
- push_err(1, range.start, err);
- }
- });
- }
+ if !s.is_raw()
+ && let Some(without_quotes) = unquote(text, 2, '"')
+ {
+ unescape_byte_str(without_quotes, |range, char| {
+ if let Err(err) = char {
+ push_err(1, range.start, err);
+ }
+ });
}
}
ast::LiteralKind::CString(s) => {
- if !s.is_raw() {
- if let Some(without_quotes) = unquote(text, 2, '"') {
- unescape_c_str(without_quotes, |range, char| {
- if let Err(err) = char {
- push_err(1, range.start, err);
- }
- });
- }
+ if !s.is_raw()
+ && let Some(without_quotes) = unquote(text, 2, '"')
+ {
+ unescape_c_str(without_quotes, |range, char| {
+ if let Err(err) = char {
+ push_err(1, range.start, err);
+ }
+ });
}
}
ast::LiteralKind::Char(_) => {
- if let Some(without_quotes) = unquote(text, 1, '\'') {
- if let Err(err) = unescape_char(without_quotes) {
- push_err(1, 0, err);
- }
+ if let Some(without_quotes) = unquote(text, 1, '\'')
+ && let Err(err) = unescape_char(without_quotes)
+ {
+ push_err(1, 0, err);
}
}
ast::LiteralKind::Byte(_) => {
- if let Some(without_quotes) = unquote(text, 2, '\'') {
- if let Err(err) = unescape_byte(without_quotes) {
- push_err(2, 0, err);
- }
+ if let Some(without_quotes) = unquote(text, 2, '\'')
+ && let Err(err) = unescape_byte(without_quotes)
+ {
+ push_err(2, 0, err);
}
}
ast::LiteralKind::IntNumber(_)
@@ -224,14 +224,14 @@
}
fn validate_numeric_name(name_ref: Option<ast::NameRef>, errors: &mut Vec<SyntaxError>) {
- if let Some(int_token) = int_token(name_ref) {
- if int_token.text().chars().any(|c| !c.is_ascii_digit()) {
- errors.push(SyntaxError::new(
- "Tuple (struct) field access is only allowed through \
+ if let Some(int_token) = int_token(name_ref)
+ && int_token.text().chars().any(|c| !c.is_ascii_digit())
+ {
+ errors.push(SyntaxError::new(
+ "Tuple (struct) field access is only allowed through \
decimal integers with no underscores or suffix",
- int_token.text_range(),
- ));
- }
+ int_token.text_range(),
+ ));
}
fn int_token(name_ref: Option<ast::NameRef>) -> Option<SyntaxToken> {
@@ -285,13 +285,13 @@
token.text_range(),
));
}
- } else if let Some(token) = segment.crate_token() {
- if !is_path_start || use_prefix(path).is_some() {
- errors.push(SyntaxError::new(
- "The `crate` keyword is only allowed as the first segment of a path",
- token.text_range(),
- ));
- }
+ } else if let Some(token) = segment.crate_token()
+ && (!is_path_start || use_prefix(path).is_some())
+ {
+ errors.push(SyntaxError::new(
+ "The `crate` keyword is only allowed as the first segment of a path",
+ token.text_range(),
+ ));
}
fn use_prefix(mut path: ast::Path) -> Option<ast::Path> {
diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs
index 8937e53..4413d2f 100644
--- a/crates/test-fixture/src/lib.rs
+++ b/crates/test-fixture/src/lib.rs
@@ -955,12 +955,12 @@
_: String,
) -> Result<TopSubtree, ProcMacroExpansionError> {
for tt in subtree.token_trees().flat_tokens() {
- if let tt::TokenTree::Leaf(tt::Leaf::Ident(ident)) = tt {
- if ident.sym == sym::cfg || ident.sym == sym::cfg_attr {
- return Err(ProcMacroExpansionError::Panic(
- "cfg or cfg_attr found in DisallowCfgProcMacroExpander".to_owned(),
- ));
- }
+ if let tt::TokenTree::Leaf(tt::Leaf::Ident(ident)) = tt
+ && (ident.sym == sym::cfg || ident.sym == sym::cfg_attr)
+ {
+ return Err(ProcMacroExpansionError::Panic(
+ "cfg or cfg_attr found in DisallowCfgProcMacroExpander".to_owned(),
+ ));
}
}
Ok(subtree.clone())
diff --git a/crates/tt/src/lib.rs b/crates/tt/src/lib.rs
index 4412338..243a27b 100644
--- a/crates/tt/src/lib.rs
+++ b/crates/tt/src/lib.rs
@@ -357,10 +357,10 @@
}
pub fn try_into_subtree(self) -> Option<SubtreeView<'a, S>> {
- if let Some(TokenTree::Subtree(subtree)) = self.0.first() {
- if subtree.usize_len() == (self.0.len() - 1) {
- return Some(SubtreeView::new(self.0));
- }
+ if let Some(TokenTree::Subtree(subtree)) = self.0.first()
+ && subtree.usize_len() == (self.0.len() - 1)
+ {
+ return Some(SubtreeView::new(self.0));
}
None
}
@@ -1028,10 +1028,10 @@
tkns = rest;
last = [last, tokentree_to_text(tkn, &mut tkns)].join(if last_to_joint { "" } else { " " });
last_to_joint = false;
- if let TokenTree::Leaf(Leaf::Punct(punct)) = tkn {
- if punct.spacing == Spacing::Joint {
- last_to_joint = true;
- }
+ if let TokenTree::Leaf(Leaf::Punct(punct)) = tkn
+ && punct.spacing == Spacing::Joint
+ {
+ last_to_joint = true;
}
}
last
diff --git a/crates/vfs-notify/src/lib.rs b/crates/vfs-notify/src/lib.rs
index a03337d..c6393cc 100644
--- a/crates/vfs-notify/src/lib.rs
+++ b/crates/vfs-notify/src/lib.rs
@@ -194,52 +194,49 @@
}
},
Event::NotifyEvent(event) => {
- if let Some(event) = log_notify_error(event) {
- if let EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_) =
+ if let Some(event) = log_notify_error(event)
+ && let EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_) =
event.kind
- {
- let files = event
- .paths
- .into_iter()
- .filter_map(|path| {
- Some(
- AbsPathBuf::try_from(
- Utf8PathBuf::from_path_buf(path).ok()?,
- )
+ {
+ let files = event
+ .paths
+ .into_iter()
+ .filter_map(|path| {
+ Some(
+ AbsPathBuf::try_from(Utf8PathBuf::from_path_buf(path).ok()?)
.expect("path is absolute"),
- )
- })
- .filter_map(|path| -> Option<(AbsPathBuf, Option<Vec<u8>>)> {
- let meta = fs::metadata(&path).ok()?;
- if meta.file_type().is_dir()
- && self
- .watched_dir_entries
- .iter()
- .any(|dir| dir.contains_dir(&path))
- {
- self.watch(path.as_ref());
- return None;
- }
+ )
+ })
+ .filter_map(|path| -> Option<(AbsPathBuf, Option<Vec<u8>>)> {
+ let meta = fs::metadata(&path).ok()?;
+ if meta.file_type().is_dir()
+ && self
+ .watched_dir_entries
+ .iter()
+ .any(|dir| dir.contains_dir(&path))
+ {
+ self.watch(path.as_ref());
+ return None;
+ }
- if !meta.file_type().is_file() {
- return None;
- }
+ if !meta.file_type().is_file() {
+ return None;
+ }
- if !(self.watched_file_entries.contains(&path)
- || self
- .watched_dir_entries
- .iter()
- .any(|dir| dir.contains_file(&path)))
- {
- return None;
- }
+ if !(self.watched_file_entries.contains(&path)
+ || self
+ .watched_dir_entries
+ .iter()
+ .any(|dir| dir.contains_file(&path)))
+ {
+ return None;
+ }
- let contents = read(&path);
- Some((path, contents))
- })
- .collect();
- self.send(loader::Message::Changed { files });
- }
+ let contents = read(&path);
+ Some((path, contents))
+ })
+ .collect();
+ self.send(loader::Message::Changed { files });
}
}
}
diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs
index 19ca62e..bc7eb88 100644
--- a/xtask/src/codegen.rs
+++ b/xtask/src/codegen.rs
@@ -173,11 +173,11 @@
#[allow(clippy::print_stderr)]
fn ensure_file_contents(cg: CodegenType, file: &Path, contents: &str, check: bool) -> bool {
let contents = normalize_newlines(contents);
- if let Ok(old_contents) = fs::read_to_string(file) {
- if normalize_newlines(&old_contents) == contents {
- // File is already up to date.
- return false;
- }
+ if let Ok(old_contents) = fs::read_to_string(file)
+ && normalize_newlines(&old_contents) == contents
+ {
+ // File is already up to date.
+ return false;
}
let display_path = file.strip_prefix(project_root()).unwrap_or(file);
diff --git a/xtask/src/publish/notes.rs b/xtask/src/publish/notes.rs
index 93592d4..8d36fcb 100644
--- a/xtask/src/publish/notes.rs
+++ b/xtask/src/publish/notes.rs
@@ -72,13 +72,13 @@
}
fn process_document_title(&mut self) -> anyhow::Result<()> {
- if let Some(Ok(line)) = self.iter.next() {
- if let Some((level, title)) = get_title(&line) {
- let title = process_inline_macros(title)?;
- if level == 1 {
- self.write_title(level, &title);
- return Ok(());
- }
+ if let Some(Ok(line)) = self.iter.next()
+ && let Some((level, title)) = get_title(&line)
+ {
+ let title = process_inline_macros(title)?;
+ if level == 1 {
+ self.write_title(level, &title);
+ return Ok(());
}
}
bail!("document title not found")
@@ -141,39 +141,39 @@
}
fn process_source_code_block(&mut self, level: usize) -> anyhow::Result<()> {
- if let Some(Ok(line)) = self.iter.next() {
- if let Some(styles) = line.strip_prefix("[source").and_then(|s| s.strip_suffix(']')) {
- let mut styles = styles.split(',');
- if !styles.next().unwrap().is_empty() {
- bail!("not a source code block");
- }
- let language = styles.next();
- return self.process_listing_block(language, level);
+ if let Some(Ok(line)) = self.iter.next()
+ && let Some(styles) = line.strip_prefix("[source").and_then(|s| s.strip_suffix(']'))
+ {
+ let mut styles = styles.split(',');
+ if !styles.next().unwrap().is_empty() {
+ bail!("not a source code block");
}
+ let language = styles.next();
+ return self.process_listing_block(language, level);
}
bail!("not a source code block")
}
fn process_listing_block(&mut self, style: Option<&str>, level: usize) -> anyhow::Result<()> {
- if let Some(Ok(line)) = self.iter.next() {
- if line == LISTING_DELIMITER {
- self.write_indent(level);
- self.output.push_str("```");
- if let Some(style) = style {
- self.output.push_str(style);
- }
- self.output.push('\n');
- while let Some(line) = self.iter.next() {
- let line = line?;
- if line == LISTING_DELIMITER {
- self.write_line("```", level);
- return Ok(());
- } else {
- self.write_line(&line, level);
- }
- }
- bail!("listing block is not terminated")
+ if let Some(Ok(line)) = self.iter.next()
+ && line == LISTING_DELIMITER
+ {
+ self.write_indent(level);
+ self.output.push_str("```");
+ if let Some(style) = style {
+ self.output.push_str(style);
}
+ self.output.push('\n');
+ while let Some(line) = self.iter.next() {
+ let line = line?;
+ if line == LISTING_DELIMITER {
+ self.write_line("```", level);
+ return Ok(());
+ } else {
+ self.write_line(&line, level);
+ }
+ }
+ bail!("listing block is not terminated")
}
bail!("not a listing block")
}
@@ -200,49 +200,48 @@
}
fn process_image_block(&mut self, caption: Option<&str>, level: usize) -> anyhow::Result<()> {
- if let Some(Ok(line)) = self.iter.next() {
- if let Some((url, attrs)) = parse_media_block(&line, IMAGE_BLOCK_PREFIX) {
- let alt = if let Some(stripped) =
- attrs.strip_prefix('"').and_then(|s| s.strip_suffix('"'))
- {
+ if let Some(Ok(line)) = self.iter.next()
+ && let Some((url, attrs)) = parse_media_block(&line, IMAGE_BLOCK_PREFIX)
+ {
+ let alt =
+ if let Some(stripped) = attrs.strip_prefix('"').and_then(|s| s.strip_suffix('"')) {
stripped
} else {
attrs
};
- if let Some(caption) = caption {
- self.write_caption_line(caption, level);
- }
- self.write_indent(level);
- self.output.push_str(";
- self.output.push_str(url);
- self.output.push_str(")\n");
- return Ok(());
+ if let Some(caption) = caption {
+ self.write_caption_line(caption, level);
}
+ self.write_indent(level);
+ self.output.push_str(";
+ self.output.push_str(url);
+ self.output.push_str(")\n");
+ return Ok(());
}
bail!("not a image block")
}
fn process_video_block(&mut self, caption: Option<&str>, level: usize) -> anyhow::Result<()> {
- if let Some(Ok(line)) = self.iter.next() {
- if let Some((url, attrs)) = parse_media_block(&line, VIDEO_BLOCK_PREFIX) {
- let html_attrs = match attrs {
- "options=loop" => "controls loop",
- r#"options="autoplay,loop""# => "autoplay controls loop",
- _ => bail!("unsupported video syntax"),
- };
- if let Some(caption) = caption {
- self.write_caption_line(caption, level);
- }
- self.write_indent(level);
- self.output.push_str(r#"<video src=""#);
- self.output.push_str(url);
- self.output.push_str(r#"" "#);
- self.output.push_str(html_attrs);
- self.output.push_str(">Your browser does not support the video tag.</video>\n");
- return Ok(());
+ if let Some(Ok(line)) = self.iter.next()
+ && let Some((url, attrs)) = parse_media_block(&line, VIDEO_BLOCK_PREFIX)
+ {
+ let html_attrs = match attrs {
+ "options=loop" => "controls loop",
+ r#"options="autoplay,loop""# => "autoplay controls loop",
+ _ => bail!("unsupported video syntax"),
+ };
+ if let Some(caption) = caption {
+ self.write_caption_line(caption, level);
}
+ self.write_indent(level);
+ self.output.push_str(r#"<video src=""#);
+ self.output.push_str(url);
+ self.output.push_str(r#"" "#);
+ self.output.push_str(html_attrs);
+ self.output.push_str(">Your browser does not support the video tag.</video>\n");
+ return Ok(());
}
bail!("not a video block")
}
@@ -371,12 +370,11 @@
}
fn parse_media_block<'a>(line: &'a str, prefix: &str) -> Option<(&'a str, &'a str)> {
- if let Some(line) = line.strip_prefix(prefix) {
- if let Some((url, rest)) = line.split_once('[') {
- if let Some(attrs) = rest.strip_suffix(']') {
- return Some((url, attrs));
- }
- }
+ if let Some(line) = line.strip_prefix(prefix)
+ && let Some((url, rest)) = line.split_once('[')
+ && let Some(attrs) = rest.strip_suffix(']')
+ {
+ return Some((url, attrs));
}
None
}