Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-ssr/src/resolving.rs')
-rw-r--r--crates/ide-ssr/src/resolving.rs85
1 files changed, 41 insertions, 44 deletions
diff --git a/crates/ide-ssr/src/resolving.rs b/crates/ide-ssr/src/resolving.rs
index 8f28a1cd3a..a48c0f8a57 100644
--- a/crates/ide-ssr/src/resolving.rs
+++ b/crates/ide-ssr/src/resolving.rs
@@ -48,16 +48,20 @@ impl<'db> ResolvedRule<'db> {
resolution_scope: &ResolutionScope<'db>,
index: usize,
) -> Result<ResolvedRule<'db>, SsrError> {
- let resolver =
- Resolver { resolution_scope, placeholders_by_stand_in: rule.placeholders_by_stand_in };
- let resolved_template = match rule.template {
- Some(template) => Some(resolver.resolve_pattern_tree(template)?),
- None => None,
- };
- Ok(ResolvedRule {
- pattern: resolver.resolve_pattern_tree(rule.pattern)?,
- template: resolved_template,
- index,
+ hir::attach_db(resolution_scope.scope.db, || {
+ let resolver = Resolver {
+ resolution_scope,
+ placeholders_by_stand_in: rule.placeholders_by_stand_in,
+ };
+ let resolved_template = match rule.template {
+ Some(template) => Some(resolver.resolve_pattern_tree(template)?),
+ None => None,
+ };
+ Ok(ResolvedRule {
+ pattern: resolver.resolve_pattern_tree(rule.pattern)?,
+ template: resolved_template,
+ index,
+ })
})
}
@@ -83,21 +87,17 @@ impl<'db> Resolver<'_, 'db> {
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 +153,11 @@ impl<'db> Resolver<'_, 'db> {
/// 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 +251,12 @@ impl<'db> ResolutionScope<'db> {
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 +296,11 @@ fn pick_node_for_resolution(node: SyntaxNode) -> SyntaxNode {
/// 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());
}