@@ -13,15 +13,18 @@ use crate::{
13
13
use ocamlrep:: rc:: RcOc ;
14
14
use oxidized:: pos:: Pos ;
15
15
16
+ #[ derive( Debug , Clone ) ]
17
+ pub struct Span {
18
+ pub left : PositionedToken ,
19
+ pub right : PositionedToken ,
20
+ }
21
+
16
22
#[ derive( Debug , Clone ) ]
17
23
pub enum PositionedValue {
18
24
/// value for a token node is token itself
19
25
TokenValue ( PositionedToken ) ,
20
26
/// value for a range denoted by pair of tokens
21
- TokenSpan {
22
- left : PositionedToken ,
23
- right : PositionedToken ,
24
- } ,
27
+ TokenSpan ( Box < Span > ) ,
25
28
Missing {
26
29
offset : usize ,
27
30
} ,
@@ -31,17 +34,19 @@ impl PositionedValue {
31
34
pub fn width ( & self ) -> usize {
32
35
match self {
33
36
PositionedValue :: TokenValue ( t) => t. width ( ) ,
34
- PositionedValue :: TokenSpan { left, right } => {
35
- ( right. end_offset ( ) - left. start_offset ( ) ) + 1
36
- }
37
+ PositionedValue :: TokenSpan ( x) => ( x. right . end_offset ( ) - x. left . start_offset ( ) ) + 1 ,
37
38
PositionedValue :: Missing { .. } => 0 ,
38
39
}
39
40
}
40
41
41
42
fn start_offset ( & self ) -> usize {
42
43
use PositionedValue :: * ;
43
44
match & self {
44
- TokenValue ( t) | TokenSpan { left : t, .. } => t
45
+ TokenValue ( t) => t
46
+ . leading_start_offset ( )
47
+ . expect ( "invariant violation for Positioned Syntax" ) ,
48
+ TokenSpan ( x) => x
49
+ . left
45
50
. leading_start_offset ( )
46
51
. expect ( "invariant violation for Positioned Syntax" ) ,
47
52
Missing { offset, .. } => * offset,
@@ -51,33 +56,55 @@ impl PositionedValue {
51
56
fn leading_width ( & self ) -> usize {
52
57
use PositionedValue :: * ;
53
58
match self {
54
- TokenValue ( t) | TokenSpan { left : t, .. } => t. leading_width ( ) ,
59
+ TokenValue ( t) => t. leading_width ( ) ,
60
+ TokenSpan ( x) => x. left . leading_width ( ) ,
55
61
Missing { .. } => 0 ,
56
62
}
57
63
}
58
64
59
65
fn trailing_width ( & self ) -> usize {
60
66
use PositionedValue :: * ;
61
67
match self {
62
- TokenValue ( t) | TokenSpan { right : t, .. } => t. trailing_width ( ) ,
68
+ TokenValue ( t) => t. trailing_width ( ) ,
69
+ TokenSpan ( x) => x. right . trailing_width ( ) ,
63
70
Missing { .. } => 0 ,
64
71
}
65
72
}
66
73
74
+ fn leading_token ( & self ) -> Option < & PositionedToken > {
75
+ use PositionedValue :: * ;
76
+ match self {
77
+ TokenValue ( l) => Some ( & l) ,
78
+ TokenSpan ( x) => Some ( & x. left ) ,
79
+ _ => None ,
80
+ }
81
+ }
82
+
83
+ fn trailing_token ( & self ) -> Option < & PositionedToken > {
84
+ use PositionedValue :: * ;
85
+ match self {
86
+ TokenValue ( r) => Some ( & r) ,
87
+ TokenSpan ( x) => Some ( & x. right ) ,
88
+ _ => None ,
89
+ }
90
+ }
91
+
67
92
fn value_from_outer_children ( first : & Self , last : & Self ) -> Self {
68
93
use PositionedValue :: * ;
69
94
match ( first, last) {
70
- ( TokenValue ( l) , TokenValue ( r) )
71
- | ( TokenSpan { left : l, .. } , TokenValue ( r) )
72
- | ( TokenValue ( l) , TokenSpan { right : r, .. } )
73
- | ( TokenSpan { left : l, .. } , TokenSpan { right : r, .. } ) => {
95
+ ( TokenValue ( _) , TokenValue ( _) )
96
+ | ( TokenSpan ( _) , TokenValue ( _) )
97
+ | ( TokenValue ( _) , TokenSpan ( _) )
98
+ | ( TokenSpan ( _) , TokenSpan ( _) ) => {
99
+ let l = first. leading_token ( ) . unwrap ( ) ;
100
+ let r = last. trailing_token ( ) . unwrap ( ) ;
74
101
if RcOc :: ptr_eq ( & l, & r) {
75
102
TokenValue ( RcOc :: clone ( & l) )
76
103
} else {
77
- TokenSpan {
104
+ TokenSpan ( Box :: new ( Span {
78
105
left : RcOc :: clone ( & l) ,
79
106
right : RcOc :: clone ( & r) ,
80
- }
107
+ } ) )
81
108
}
82
109
}
83
110
// can have two missing nodes if first and last child nodes of
0 commit comments