@@ -144,10 +144,7 @@ impl YeastDisplay for Id {
144144
145145impl YeastSourceRange for Id {
146146 fn yeast_source_range ( & self , ast : & Ast ) -> Option < Range > {
147- ast. get_node ( * self ) . and_then ( |n| match & n. content {
148- NodeContent :: Range ( r) => Some ( * r) ,
149- _ => n. source_range ,
150- } )
147+ ast. get_node ( * self ) . and_then ( Node :: source_range)
151148 }
152149}
153150
@@ -598,7 +595,7 @@ impl Ast {
598595 . union_source_range_of_children ( & fields)
599596 . map_or ( source_range, |child_range| {
600597 Some ( match source_range {
601- Some ( source_range) => union_source_ranges ( child_range, source_range) ,
598+ Some ( source_range) => child_range. union ( source_range) ,
602599 None => child_range,
603600 } )
604601 } ) ,
@@ -631,7 +628,7 @@ impl Ast {
631628 panic ! ( "extend_source_range: cannot modify a parsed node" ) ;
632629 }
633630 node. source_range = Some ( match node. source_range {
634- Some ( existing) => union_source_ranges ( existing, source_range) ,
631+ Some ( existing) => existing. union ( source_range) ,
635632 None => source_range,
636633 } ) ;
637634 }
@@ -673,35 +670,30 @@ impl Ast {
673670 let Some ( child) = self . get_node ( child_id) else {
674671 continue ;
675672 } ;
676-
677- let child_start_byte = child. start_byte ( ) ;
678- let child_end_byte = child. end_byte ( ) ;
679-
680- // Skip children that carry no usable location.
681- if child_start_byte == 0 && child_end_byte == 0 {
673+ let Some ( child_range) = child. source_range ( ) else {
682674 continue ;
683- }
675+ } ;
684676
685677 match start_byte {
686678 None => {
687- start_byte = Some ( child_start_byte ) ;
688- start_point = child . start_position ( ) ;
679+ start_byte = Some ( child_range . start_byte ) ;
680+ start_point = child_range . start_point ;
689681 }
690- Some ( current_start) if child_start_byte < current_start => {
691- start_byte = Some ( child_start_byte ) ;
692- start_point = child . start_position ( ) ;
682+ Some ( current_start) if child_range . start_byte < current_start => {
683+ start_byte = Some ( child_range . start_byte ) ;
684+ start_point = child_range . start_point ;
693685 }
694686 _ => { }
695687 }
696688
697689 match end_byte {
698690 None => {
699- end_byte = Some ( child_end_byte ) ;
700- end_point = child . end_position ( ) ;
691+ end_byte = Some ( child_range . end_byte ) ;
692+ end_point = child_range . end_point ;
701693 }
702- Some ( current_end) if child_end_byte > current_end => {
703- end_byte = Some ( child_end_byte ) ;
704- end_point = child . end_position ( ) ;
694+ Some ( current_end) if child_range . end_byte > current_end => {
695+ end_byte = Some ( child_range . end_byte ) ;
696+ end_point = child_range . end_point ;
705697 }
706698 _ => { }
707699 }
@@ -810,25 +802,6 @@ impl Ast {
810802 }
811803}
812804
813- fn union_source_ranges ( first : Range , second : Range ) -> Range {
814- let ( start_byte, start_point) = if first. start_byte <= second. start_byte {
815- ( first. start_byte , first. start_point )
816- } else {
817- ( second. start_byte , second. start_point )
818- } ;
819- let ( end_byte, end_point) = if first. end_byte >= second. end_byte {
820- ( first. end_byte , first. end_point )
821- } else {
822- ( second. end_byte , second. end_point )
823- } ;
824- Range {
825- start_byte,
826- end_byte,
827- start_point,
828- end_point,
829- }
830- }
831-
832805/// A node in our AST
833806#[ derive( PartialEq , Eq , Debug , Clone , Serialize ) ]
834807pub struct Node {
@@ -871,36 +844,29 @@ impl Node {
871844 Point { row : 0 , column : 0 }
872845 }
873846
874- pub fn start_position ( & self ) -> Point {
847+ pub fn source_range ( & self ) -> Option < Range > {
875848 match self . content {
876- NodeContent :: Range ( range) => range. start_point ,
877- _ => self
878- . source_range
879- . map_or_else ( || self . fake_point ( ) , |r| r. start_point ) ,
849+ NodeContent :: Range ( range) => Some ( range) ,
850+ _ => self . source_range ,
880851 }
881852 }
882853
854+ pub fn start_position ( & self ) -> Point {
855+ self . source_range ( )
856+ . map_or_else ( || self . fake_point ( ) , |range| range. start_point )
857+ }
858+
883859 pub fn end_position ( & self ) -> Point {
884- match self . content {
885- NodeContent :: Range ( range) => range. end_point ,
886- _ => self
887- . source_range
888- . map_or_else ( || self . fake_point ( ) , |r| r. end_point ) ,
889- }
860+ self . source_range ( )
861+ . map_or_else ( || self . fake_point ( ) , |range| range. end_point )
890862 }
891863
892864 pub fn start_byte ( & self ) -> usize {
893- match self . content {
894- NodeContent :: Range ( range) => range. start_byte ,
895- _ => self . source_range . map_or ( 0 , |r| r. start_byte ) ,
896- }
865+ self . source_range ( ) . map_or ( 0 , |range| range. start_byte )
897866 }
898867
899868 pub fn end_byte ( & self ) -> usize {
900- match self . content {
901- NodeContent :: Range ( range) => range. end_byte ,
902- _ => self . source_range . map_or ( 0 , |r| r. end_byte ) ,
903- }
869+ self . source_range ( ) . map_or ( 0 , |range| range. end_byte )
904870 }
905871
906872 pub fn byte_range ( & self ) -> std:: ops:: Range < usize > {
0 commit comments