Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/patterns.rs')
| -rw-r--r-- | crates/ide-completion/src/patterns.rs | 72 |
1 files changed, 2 insertions, 70 deletions
diff --git a/crates/ide-completion/src/patterns.rs b/crates/ide-completion/src/patterns.rs index bc46ff7f2d..88cb486f5d 100644 --- a/crates/ide-completion/src/patterns.rs +++ b/crates/ide-completion/src/patterns.rs @@ -7,23 +7,15 @@ use hir::Semantics; use ide_db::RootDatabase; use syntax::{ - ast::{self, HasLoopBody, HasName}, + ast::{self, HasLoopBody}, match_ast, AstNode, SyntaxElement, SyntaxKind::*, - SyntaxNode, SyntaxToken, TextRange, TextSize, + SyntaxNode, SyntaxToken, TextSize, }; #[cfg(test)] use crate::tests::check_pattern_is_applicable; -#[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) enum TypeAnnotation { - Let(Option<ast::Pat>), - FnParam(Option<ast::Pat>), - RetType(Option<ast::Expr>), - Const(Option<ast::Expr>), -} - /// Direct parent "thing" of what we are currently completing. /// /// This may contain nodes of the fake file as well as the original, comments on the variants specify @@ -31,8 +23,6 @@ pub(crate) enum TypeAnnotation { #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) enum ImmediateLocation { TypeBound, - /// Original file ast node - TypeAnnotation(TypeAnnotation), // Only set from a type arg /// Original file ast node GenericArgList(ast::GenericArgList), @@ -84,62 +74,9 @@ pub(crate) fn determine_location( ast::GenericArgList(_) => sema .find_node_at_offset_with_macros(original_file, offset) .map(ImmediateLocation::GenericArgList)?, - ast::Const(it) => { - if !it.ty().map_or(false, |x| x.syntax().text_range().contains(offset)) { - return None; - } - let name = find_in_original_file(it.name(), original_file)?; - let original = ast::Const::cast(name.syntax().parent()?)?; - ImmediateLocation::TypeAnnotation(TypeAnnotation::Const(original.body())) - }, - ast::RetType(it) => { - if it.thin_arrow_token().is_none() { - return None; - } - if !it.ty().map_or(false, |x| x.syntax().text_range().contains(offset)) { - return None; - } - let parent = match ast::Fn::cast(parent.parent()?) { - Some(x) => x.param_list(), - None => ast::ClosureExpr::cast(parent.parent()?)?.param_list(), - }; - let parent = find_in_original_file(parent, original_file)?.syntax().parent()?; - ImmediateLocation::TypeAnnotation(TypeAnnotation::RetType(match_ast! { - match parent { - ast::ClosureExpr(it) => { - it.body() - }, - ast::Fn(it) => { - it.body().map(ast::Expr::BlockExpr) - }, - _ => return None, - } - })) - }, - ast::Param(it) => { - if it.colon_token().is_none() { - return None; - } - if !it.ty().map_or(false, |x| x.syntax().text_range().contains(offset)) { - return None; - } - ImmediateLocation::TypeAnnotation(TypeAnnotation::FnParam(find_in_original_file(it.pat(), original_file))) - }, - ast::LetStmt(it) => { - if it.colon_token().is_none() { - return None; - } - if !it.ty().map_or(false, |x| x.syntax().text_range().contains(offset)) { - return None; - } - ImmediateLocation::TypeAnnotation(TypeAnnotation::Let(find_in_original_file(it.pat(), original_file))) - }, _ => return None, } }; - fn find_in_original_file<N: AstNode>(x: Option<N>, original_file: &SyntaxNode) -> Option<N> { - x.map(|e| e.syntax().text_range()).and_then(|r| find_node_with_range(original_file, r)) - } Some(res) } @@ -164,11 +101,6 @@ fn maximize_name_ref(name_ref: &ast::NameRef) -> SyntaxNode { name_ref.syntax().clone() } -fn find_node_with_range<N: AstNode>(syntax: &SyntaxNode, range: TextRange) -> Option<N> { - let range = syntax.text_range().intersect(range)?; - syntax.covering_element(range).ancestors().find_map(N::cast) -} - pub(crate) fn previous_token(element: SyntaxElement) -> Option<SyntaxToken> { element.into_token().and_then(previous_non_trivia_token) } |