aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/imp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_analysis/src/imp.rs')
-rw-r--r--crates/ra_analysis/src/imp.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs
index b01382808..40996bfd7 100644
--- a/crates/ra_analysis/src/imp.rs
+++ b/crates/ra_analysis/src/imp.rs
@@ -5,7 +5,8 @@ use std::{
5 5
6use ra_editor::{self, find_node_at_offset, FileSymbol, LineIndex, LocalEdit}; 6use ra_editor::{self, find_node_at_offset, FileSymbol, LineIndex, LocalEdit};
7use ra_syntax::{ 7use ra_syntax::{
8 ast::{self, ArgListOwner, Expr, NameOwner}, 8 ast::{self, ArgListOwner, Expr, NameOwner, FnDef},
9 algo::find_covering_node,
9 AstNode, SourceFileNode, 10 AstNode, SourceFileNode,
10 SyntaxKind::*, 11 SyntaxKind::*,
11 SyntaxNodeRef, TextRange, TextUnit, 12 SyntaxNodeRef, TextRange, TextUnit,
@@ -510,6 +511,23 @@ impl AnalysisImpl {
510 Ok(None) 511 Ok(None)
511 } 512 }
512 513
514 pub fn type_of(&self, file_id: FileId, range: TextRange) -> Cancelable<Option<String>> {
515 let file = self.db.source_file(file_id);
516 let syntax = file.syntax();
517 let node = find_covering_node(syntax, range);
518 let parent_fn = node.ancestors().filter_map(FnDef::cast).next();
519 let parent_fn = if let Some(p) = parent_fn {
520 p
521 } else {
522 return Ok(None);
523 };
524 let function = ctry!(source_binder::function_from_source(
525 &*self.db, file_id, parent_fn
526 )?);
527 let infer = function.infer(&*self.db)?;
528 Ok(infer.type_of_node(node).map(|t| t.to_string()))
529 }
530
513 fn index_resolve(&self, name_ref: ast::NameRef) -> Cancelable<Vec<(FileId, FileSymbol)>> { 531 fn index_resolve(&self, name_ref: ast::NameRef) -> Cancelable<Vec<(FileId, FileSymbol)>> {
514 let name = name_ref.text(); 532 let name = name_ref.text();
515 let mut query = Query::new(name.to_string()); 533 let mut query = Query::new(name.to_string());