]> git.lizzy.rs Git - rust.git/commitdiff
Add name_range field to FileSymbol
authorVille Penttinen <villem.penttinen@gmail.com>
Sat, 23 Feb 2019 11:05:45 +0000 (13:05 +0200)
committerVille Penttinen <villem.penttinen@gmail.com>
Sat, 23 Feb 2019 11:05:45 +0000 (13:05 +0200)
This contains the syntax range of the name itself, allowing NavigationTarget to
properly set the focus_range. This should make it so that when using symbol
based navigation, we should always focus on the name, instead of the full range.

crates/ra_ide_api/src/navigation_target.rs
crates/ra_ide_api/src/symbol_index.rs

index 2c9ec970a7121c2036cb4d0a1d69fbf21014ff9a..ce5ae0363193337a10d72c67e525f1cbdbdd6149 100644 (file)
@@ -67,7 +67,7 @@ pub(crate) fn from_symbol(symbol: FileSymbol) -> NavigationTarget {
             name: symbol.name.clone(),
             kind: symbol.ptr.kind(),
             full_range: symbol.ptr.range(),
             name: symbol.name.clone(),
             kind: symbol.ptr.kind(),
             full_range: symbol.ptr.range(),
-            focus_range: None,
+            focus_range: symbol.name_range,
             container_name: symbol.container_name.clone(),
         }
     }
             container_name: symbol.container_name.clone(),
         }
     }
index afb10fa9289024c9aed3d67e87729fc630f36d78..93bdf05d8fca696391973262522083457654ff76 100644 (file)
@@ -33,6 +33,7 @@
     SyntaxKind::{self, *},
     ast::{self, NameOwner},
     WalkEvent,
     SyntaxKind::{self, *},
     ast::{self, NameOwner},
     WalkEvent,
+    TextRange,
 };
 use ra_db::{
     SourceRootId, SourceDatabase,
 };
 use ra_db::{
     SourceRootId, SourceDatabase,
@@ -70,7 +71,7 @@ fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex>
         let node = find_covering_node(source_file.syntax(), text_range);
         let ptr = SyntaxNodePtr::new(node);
         // TODO: Should we get container name for macro symbols?
         let node = find_covering_node(source_file.syntax(), text_range);
         let ptr = SyntaxNodePtr::new(node);
         // TODO: Should we get container name for macro symbols?
-        symbols.push(FileSymbol { file_id, name, ptr, container_name: None })
+        symbols.push(FileSymbol { file_id, name, ptr, name_range: None, container_name: None })
     }
 
     Arc::new(SymbolIndex::new(symbols))
     }
 
     Arc::new(SymbolIndex::new(symbols))
@@ -207,6 +208,7 @@ pub(crate) struct FileSymbol {
     pub(crate) file_id: FileId,
     pub(crate) name: SmolStr,
     pub(crate) ptr: SyntaxNodePtr,
     pub(crate) file_id: FileId,
     pub(crate) name: SmolStr,
     pub(crate) ptr: SyntaxNodePtr,
+    pub(crate) name_range: Option<TextRange>,
     pub(crate) container_name: Option<SmolStr>,
 }
 
     pub(crate) container_name: Option<SmolStr>,
 }
 
@@ -236,12 +238,14 @@ fn source_file_to_file_symbols(source_file: &SourceFile, file_id: FileId) -> Vec
     symbols
 }
 
     symbols
 }
 
-fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr)> {
-    fn decl<N: NameOwner>(node: &N) -> Option<(SmolStr, SyntaxNodePtr)> {
-        let name = node.name()?.text().clone();
+fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
+    fn decl<N: NameOwner>(node: &N) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
+        let name = node.name()?;
+        let name_range = name.syntax().range();
+        let name = name.text().clone();
         let ptr = SyntaxNodePtr::new(node.syntax());
 
         let ptr = SyntaxNodePtr::new(node.syntax());
 
-        Some((name, ptr))
+        Some((name, ptr, name_range))
     }
     visitor()
         .visit(decl::<ast::FnDef>)
     }
     visitor()
         .visit(decl::<ast::FnDef>)
@@ -256,5 +260,11 @@ fn decl<N: NameOwner>(node: &N) -> Option<(SmolStr, SyntaxNodePtr)> {
 }
 
 fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> {
 }
 
 fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> {
-    to_symbol(node).map(move |(name, ptr)| FileSymbol { name, ptr, file_id, container_name: None })
+    to_symbol(node).map(move |(name, ptr, name_range)| FileSymbol {
+        name,
+        ptr,
+        file_id,
+        name_range: Some(name_range),
+        container_name: None,
+    })
 }
 }