@@ -32,38 +32,23 @@ impl fmt::Debug for GreenNode {
32
32
33
33
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
34
34
enum GreenChild {
35
- Node {
36
- // offset: TextSize,
37
- node : GreenNode ,
38
- } ,
39
- Token {
40
- // offset: TextSize,
41
- token : GreenToken ,
42
- } ,
43
- }
44
-
45
- impl From < GreenElement > for GreenChild {
46
- fn from ( e : GreenElement ) -> Self {
47
- match e {
48
- NodeOrToken :: Node ( node) => GreenChild :: Node { node } ,
49
- NodeOrToken :: Token ( token) => GreenChild :: Token { token } ,
50
- }
51
- }
35
+ Node { offset_in_parent : TextSize , node : GreenNode } ,
36
+ Token { offset_in_parent : TextSize , token : GreenToken } ,
52
37
}
53
38
54
39
impl GreenChild {
55
40
fn as_ref ( & self ) -> GreenElementRef {
56
41
match self {
57
- GreenChild :: Node { node } => NodeOrToken :: Node ( node) ,
58
- GreenChild :: Token { token } => NodeOrToken :: Token ( token) ,
42
+ GreenChild :: Node { node, .. } => NodeOrToken :: Node ( node) ,
43
+ GreenChild :: Token { token, .. } => NodeOrToken :: Token ( token) ,
59
44
}
60
45
}
61
46
}
62
47
63
48
#[ cfg( target_pointer_width = "64" ) ]
64
- const _: ( ) = {
49
+ const _: i32 = {
65
50
let cond = mem:: size_of :: < GreenChild > ( ) == mem:: size_of :: < usize > ( ) * 2 ;
66
- [ ( ) ] [ ( ! cond) as usize ]
51
+ 0 / cond as i32
67
52
} ;
68
53
69
54
impl GreenNode {
@@ -75,8 +60,14 @@ impl GreenNode {
75
60
I :: IntoIter : ExactSizeIterator ,
76
61
{
77
62
let mut text_len: TextSize = 0 . into ( ) ;
78
- let children =
79
- children. into_iter ( ) . inspect ( |it| text_len += it. text_len ( ) ) . map ( GreenChild :: from) ;
63
+ let children = children. into_iter ( ) . map ( |el| {
64
+ let offset_in_parent = text_len;
65
+ text_len += el. text_len ( ) ;
66
+ match el {
67
+ NodeOrToken :: Node ( node) => GreenChild :: Node { offset_in_parent, node } ,
68
+ NodeOrToken :: Token ( token) => GreenChild :: Token { offset_in_parent, token } ,
69
+ }
70
+ } ) ;
80
71
81
72
let data =
82
73
ThinArc :: from_header_and_iter ( GreenNodeHead { kind, text_len : 0 . into ( ) } , children) ;
@@ -113,6 +104,18 @@ impl GreenNode {
113
104
pub fn ptr ( & self ) -> * const c_void {
114
105
self . data . heap_ptr ( )
115
106
}
107
+
108
+ pub ( crate ) fn replace_child ( & self , idx : usize , new_child : GreenElement ) -> GreenNode {
109
+ let mut replacement = Some ( new_child) ;
110
+ let children = self . children ( ) . enumerate ( ) . map ( |( i, child) | {
111
+ if i == idx {
112
+ replacement. take ( ) . unwrap ( )
113
+ } else {
114
+ child. cloned ( )
115
+ }
116
+ } ) ;
117
+ GreenNode :: new ( self . kind ( ) , children)
118
+ }
116
119
}
117
120
118
121
#[ derive( Debug , Clone ) ]
0 commit comments