@@ -29,18 +29,28 @@ use crate::{
29
29
30
30
struct AdapterChangeHandler < ' a > {
31
31
adapter : & ' a Adapter ,
32
+ added_nodes : HashSet < NodeId > ,
33
+ removed_nodes : HashSet < NodeId > ,
32
34
checked_text_change : HashSet < NodeId > ,
33
35
}
34
36
35
37
impl < ' a > AdapterChangeHandler < ' a > {
36
38
fn new ( adapter : & ' a Adapter ) -> Self {
37
39
Self {
38
40
adapter,
41
+ added_nodes : HashSet :: new ( ) ,
42
+ removed_nodes : HashSet :: new ( ) ,
39
43
checked_text_change : HashSet :: new ( ) ,
40
44
}
41
45
}
42
46
43
47
fn add_node ( & mut self , node : & Node ) {
48
+ let id = node. id ( ) ;
49
+ if self . added_nodes . contains ( & id) {
50
+ return ;
51
+ }
52
+ self . added_nodes . insert ( id) ;
53
+
44
54
let role = node. role ( ) ;
45
55
let is_root = node. is_root ( ) ;
46
56
let node = NodeWrapper ( node) ;
@@ -65,7 +75,20 @@ impl<'a> AdapterChangeHandler<'a> {
65
75
}
66
76
}
67
77
78
+ fn add_subtree ( & mut self , node : & Node ) {
79
+ self . add_node ( node) ;
80
+ for child in node. filtered_children ( & filter) {
81
+ self . add_subtree ( & child) ;
82
+ }
83
+ }
84
+
68
85
fn remove_node ( & mut self , node : & Node ) {
86
+ let id = node. id ( ) ;
87
+ if self . removed_nodes . contains ( & id) {
88
+ return ;
89
+ }
90
+ self . removed_nodes . insert ( id) ;
91
+
69
92
let role = node. role ( ) ;
70
93
let is_root = node. is_root ( ) ;
71
94
let node = NodeWrapper ( node) ;
@@ -78,6 +101,13 @@ impl<'a> AdapterChangeHandler<'a> {
78
101
. unregister_interfaces ( node. id ( ) , node. interfaces ( ) ) ;
79
102
}
80
103
104
+ fn remove_subtree ( & mut self , node : & Node ) {
105
+ for child in node. filtered_children ( & filter) {
106
+ self . remove_subtree ( & child) ;
107
+ }
108
+ self . remove_node ( node) ;
109
+ }
110
+
81
111
fn emit_text_change_if_needed_parent ( & mut self , old_node : & Node , new_node : & Node ) {
82
112
if !new_node. supports_text_ranges ( ) || !old_node. supports_text_ranges ( ) {
83
113
return ;
@@ -220,9 +250,17 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
220
250
let filter_new = filter ( new_node) ;
221
251
if filter_new != filter_old {
222
252
if filter_new == FilterResult :: Include {
223
- self . add_node ( new_node) ;
253
+ if filter_old == FilterResult :: ExcludeSubtree {
254
+ self . add_subtree ( new_node) ;
255
+ } else {
256
+ self . add_node ( new_node) ;
257
+ }
224
258
} else if filter_old == FilterResult :: Include {
225
- self . remove_node ( old_node) ;
259
+ if filter_new == FilterResult :: ExcludeSubtree {
260
+ self . remove_subtree ( old_node) ;
261
+ } else {
262
+ self . remove_node ( old_node) ;
263
+ }
226
264
}
227
265
} else if filter_new == FilterResult :: Include {
228
266
let old_wrapper = NodeWrapper ( old_node) ;
0 commit comments