@@ -16,7 +16,6 @@ use itertools::Itertools;
1616use rustc_hash:: { FxHashMap , FxHashSet } ;
1717use smallvec:: { smallvec, SmallVec } ;
1818use syntax:: {
19- algo:: find_node_at_offset,
2019 ast:: { self , GenericParamsOwner , LoopBodyOwner } ,
2120 match_ast, AstNode , SyntaxNode , SyntaxNodePtr , SyntaxToken , TextRange , TextSize ,
2221} ;
@@ -241,10 +240,6 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> {
241240 node : & SyntaxNode ,
242241 offset : TextSize ,
243242 ) -> Option < N > {
244- if let Some ( it) = find_node_at_offset ( node, offset) {
245- return Some ( it) ;
246- }
247-
248243 self . imp . descend_node_at_offset ( node, offset) . flatten ( ) . find_map ( N :: cast)
249244 }
250245
@@ -567,16 +562,25 @@ impl<'db> SemanticsImpl<'db> {
567562
568563 // Note this return type is deliberate as [`find_nodes_at_offset_with_descend`] wants to stop
569564 // traversing the inner iterator when it finds a node.
565+ // The outer iterator is over the tokens descendants
566+ // The inner iterator is the ancestors of a descendant
570567 fn descend_node_at_offset (
571568 & self ,
572569 node : & SyntaxNode ,
573570 offset : TextSize ,
574571 ) -> impl Iterator < Item = impl Iterator < Item = SyntaxNode > + ' _ > + ' _ {
575- // Handle macro token cases
576572 node. token_at_offset ( offset)
577573 . map ( move |token| self . descend_into_macros ( token) )
578- . map ( |it| it. into_iter ( ) . map ( move |it| self . token_ancestors_with_macros ( it) ) )
579- . flatten ( )
574+ . map ( |descendants| {
575+ descendants. into_iter ( ) . map ( move |it| self . token_ancestors_with_macros ( it) )
576+ } )
577+ // re-order the tokens from token_at_offset by returning the ancestors with the smaller first nodes first
578+ // See algo::ancestors_at_offset, which uses the same approach
579+ . kmerge_by ( |left, right| {
580+ left. clone ( )
581+ . map ( |node| node. text_range ( ) . len ( ) )
582+ . lt ( right. clone ( ) . map ( |node| node. text_range ( ) . len ( ) ) )
583+ } )
580584 }
581585
582586 fn original_range ( & self , node : & SyntaxNode ) -> FileRange {
@@ -594,11 +598,14 @@ impl<'db> SemanticsImpl<'db> {
594598 fn token_ancestors_with_macros (
595599 & self ,
596600 token : SyntaxToken ,
597- ) -> impl Iterator < Item = SyntaxNode > + ' _ {
601+ ) -> impl Iterator < Item = SyntaxNode > + Clone + ' _ {
598602 token. parent ( ) . into_iter ( ) . flat_map ( move |parent| self . ancestors_with_macros ( parent) )
599603 }
600604
601- fn ancestors_with_macros ( & self , node : SyntaxNode ) -> impl Iterator < Item = SyntaxNode > + ' _ {
605+ fn ancestors_with_macros (
606+ & self ,
607+ node : SyntaxNode ,
608+ ) -> impl Iterator < Item = SyntaxNode > + Clone + ' _ {
602609 let node = self . find_file ( node) ;
603610 node. ancestors_with_macros ( self . db . upcast ( ) ) . map ( |it| it. value )
604611 }
0 commit comments