@@ -19,6 +19,10 @@ macro_rules! ast_token {
1919 fn syntax( & self ) -> SyntaxElement {
2020 self . 0 . clone( ) . into( )
2121 }
22+
23+ fn range( & self ) -> TextRange {
24+ self . syntax( ) . text_range( )
25+ }
2226 }
2327
2428 impl fmt:: Debug for $kind {
@@ -49,6 +53,30 @@ macro_rules! ast_node {
4953 fn syntax( & self ) -> SyntaxElement {
5054 self . 0 . clone( ) . into( )
5155 }
56+
57+ fn range( & self ) -> TextRange {
58+ let total_range = self . syntax( ) . text_range( ) ;
59+
60+ self . 0
61+ . preorder_with_tokens( )
62+ . filter_map( |event| match event {
63+ rowan:: WalkEvent :: Enter ( element) => {
64+ match element {
65+ SyntaxElement :: Node ( _) => None , // Skip nodes in this pass
66+ SyntaxElement :: Token ( t) => Some ( t) ,
67+ }
68+ } ,
69+ _ => None ,
70+ } )
71+ . filter_map( |token| {
72+ if !token. kind( ) . is_trivia( ) {
73+ return Some ( token. text_range( ) ) ;
74+ }
75+ None
76+ } )
77+ . reduce( |acc, range| acc. cover( range) )
78+ . unwrap_or( total_range)
79+ }
5280 }
5381
5482 impl fmt:: Debug for $kind {
@@ -82,6 +110,12 @@ macro_rules! ast_union_node {
82110 $( Self :: $kind( s) => s. syntax( ) , ) +
83111 }
84112 }
113+
114+ fn range( & self ) -> TextRange {
115+ match self {
116+ $( Self :: $kind( kind) => kind. range( ) , ) +
117+ }
118+ }
85119 }
86120 } ;
87121
@@ -107,6 +141,13 @@ macro_rules! ast_union_node {
107141 $( Self :: $kind( s) => s. syntax( ) , ) +
108142 }
109143 }
144+
145+ fn range( & self ) -> TextRange {
146+ match self {
147+ Self :: $else( kind) => kind. range( ) ,
148+ $( Self :: $kind( kind) => kind. range( ) , ) +
149+ }
150+ }
110151 }
111152 } ;
112153}
@@ -165,9 +206,7 @@ pub trait AstElement: Sized {
165206 }
166207 }
167208
168- fn range ( & self ) -> TextRange {
169- self . syntax ( ) . text_range ( )
170- }
209+ fn range ( & self ) -> TextRange ;
171210}
172211
173212#[ derive( Debug ) ]
0 commit comments