1- use crate :: compiling_rules:: { Region , Rules , RegionMap } ;
2- use super :: reader:: Reader ;
31use super :: reader:: ReadMode ;
2+ use super :: reader:: Reader ;
3+ use crate :: compiling_rules:: { Region , RegionMap , Rules } ;
44
55#[ cfg( feature = "serde" ) ]
66use serde:: { Serialize , Deserialize } ;
@@ -10,20 +10,20 @@ use serde::{Serialize, Deserialize};
1010pub enum RegionReaction {
1111 Begin ( bool ) ,
1212 End ( bool ) ,
13- Pass
13+ Pass ,
1414}
1515
1616#[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
1717pub struct RegionHandler {
1818 region_stack : Vec < Region > ,
19- region_map : RegionMap
19+ region_map : RegionMap ,
2020}
2121
2222impl RegionHandler {
2323 pub fn new ( rules : & Rules ) -> Self {
2424 RegionHandler {
2525 region_stack : vec ! [ rules. region_tree. clone( ) ] ,
26- region_map : rules. region_tree . clone ( ) . generate_region_map ( )
26+ region_map : rules. region_tree . clone ( ) . generate_region_map ( ) ,
2727 }
2828 }
2929
@@ -35,7 +35,7 @@ impl RegionHandler {
3535 // Error if after code lexing
3636 // some region was left unclosed
3737 #[ inline]
38- pub fn is_region_closed ( & self , reader : & Reader ) -> Result < ( ) , ( ( usize , usize ) , Region ) > {
38+ pub fn is_region_closed ( & self , reader : & Reader ) -> Result < ( ) , ( ( usize , usize ) , Region ) > {
3939 if let Some ( region) = self . region_stack . last ( ) {
4040 if !region. allow_unclosed_region {
4141 let pos = reader. get_position ( ) ;
@@ -46,12 +46,12 @@ impl RegionHandler {
4646 }
4747
4848 // Check where we are in code and open / close some region if matched
49- pub fn handle_region ( & mut self , reader : & Reader , is_escaped : bool ) -> RegionReaction {
49+ pub fn handle_region ( & mut self , reader : & Reader ) -> RegionReaction {
5050 // If we are not in the global scope
5151 if let Some ( region) = self . get_region ( ) {
5252 for interp_region in region. interp . iter ( ) {
5353 // The region that got matched based on current code lexing state
54- if let Some ( mut begin_region) = self . match_region_by_begin ( reader, is_escaped ) {
54+ if let Some ( mut begin_region) = self . match_region_by_begin ( reader) {
5555 if begin_region. name == * interp_region. name {
5656 // Save the tokenize state here to preserve borrow rules
5757 let tokenize = begin_region. tokenize ;
@@ -64,7 +64,7 @@ impl RegionHandler {
6464 // If success, then we want to do the replace
6565 Some ( target_region) => {
6666 begin_region. interp = target_region. interp . clone ( ) ;
67- } ,
67+ }
6868 // If fail then it means that we have invalid reference name
6969 None => {
7070 panic ! ( "Could not find region with id '{}'" , reference_name) ;
@@ -77,12 +77,12 @@ impl RegionHandler {
7777 }
7878 }
7979 // Let's check if we can close current region
80- if let Some ( end_region) = self . match_region_by_end ( reader, is_escaped ) {
80+ if let Some ( end_region) = self . match_region_by_end ( reader) {
8181 if end_region. name == region. name {
8282 // Save the tokenize state here to preserve borrow rules
8383 let tokenize = end_region. tokenize ;
8484 self . region_stack . pop ( ) ;
85- return RegionReaction :: End ( tokenize)
85+ return RegionReaction :: End ( tokenize) ;
8686 }
8787 }
8888 }
@@ -97,48 +97,49 @@ impl RegionHandler {
9797 cb : impl Fn ( & Region ) -> & String ,
9898 candidates : & [ Region ] ,
9999 read_mode : ReadMode ,
100- is_escaped : bool
101100 ) -> Option < Region > {
102101 // Closure that checks if for each given Region is there any that matches current history state
103- let predicate = |candidate : & Region | match reader. get_history_or_future ( cb ( candidate) . len ( ) , & read_mode) {
104- Some ( code_chunk) => !is_escaped && & code_chunk == cb ( candidate) ,
105- None => false
102+ let predicate = |candidate : & Region | match reader
103+ . get_history_or_future ( cb ( candidate) . len ( ) , & read_mode)
104+ {
105+ Some ( code_chunk) => & code_chunk == cb ( candidate) ,
106+ None => false ,
106107 } ;
107108 self . get_region_by ( predicate, candidates)
108109 }
109110
110111 #[ inline]
111- fn match_region_by_begin ( & self , reader : & Reader , is_escaped : bool ) -> Option < Region > {
112+ fn match_region_by_begin ( & self , reader : & Reader ) -> Option < Region > {
112113 let region = self . get_region ( ) . unwrap ( ) ;
113114 self . match_region_by (
114115 reader,
115116 |candidate : & Region | & candidate. begin ,
116117 & region. interp ,
117118 ReadMode :: Future ,
118- is_escaped
119119 )
120120 }
121121
122122 #[ inline]
123- fn match_region_by_end ( & self , reader : & Reader , is_escaped : bool ) -> Option < Region > {
123+ fn match_region_by_end ( & self , reader : & Reader ) -> Option < Region > {
124124 let region = self . get_region ( ) . unwrap ( ) ;
125125 if !region. global {
126126 self . match_region_by (
127127 reader,
128128 |candidate : & Region | & candidate. end ,
129129 & [ region. clone ( ) ] ,
130130 ReadMode :: History ,
131- is_escaped
132131 )
133- } else { None }
132+ } else {
133+ None
134+ }
134135 }
135136
136137 // Target region is a region on which we want to search the interpolations
137138 #[ inline]
138139 fn get_region_by ( & self , cb : impl Fn ( & Region ) -> bool , candidates : & [ Region ] ) -> Option < Region > {
139140 for region in candidates. iter ( ) {
140141 if cb ( region) {
141- return Some ( region. clone ( ) )
142+ return Some ( region. clone ( ) ) ;
142143 }
143144 }
144145 None
@@ -147,30 +148,21 @@ impl RegionHandler {
147148
148149#[ cfg( test) ]
149150mod test {
150- use crate :: reg;
151- use crate :: compiling_rules:: Region ;
152- use super :: { RegionHandler , RegionReaction } ;
153151 use super :: Reader ;
152+ use super :: { RegionHandler , RegionReaction } ;
153+ use crate :: compiling_rules:: Region ;
154+ use crate :: reg;
154155
155156 #[ test]
156157 fn match_region ( ) {
157- let lines = vec ! [
158- "begin" ,
159- "\\ begin" ,
160- "end"
161- ] ;
162- let expected = vec ! [
163- ( 0 , String :: from( "begin" ) ) ,
164- ( 15 , String :: from( "end" ) )
165- ] ;
158+ let lines = vec ! [ "begin" , "\\ begin" , "end" ] ;
159+ let expected = vec ! [ ( 0 , String :: from( "begin" ) ) , ( 15 , String :: from( "end" ) ) ] ;
166160 let code = lines. join ( " " ) ;
167161 let mut reader = Reader :: new ( & code) ;
168- let region = reg ! [
169- reg!( module as "Module literal" => {
170- begin: "begin" ,
171- end: "end"
172- } )
173- ] ;
162+ let region = reg ! [ reg!( module as "Module literal" => {
163+ begin: "begin" ,
164+ end: "end"
165+ } ) ] ;
174166 let mut rh = RegionHandler {
175167 region_stack : vec ! [ region. clone( ) ] ,
176168 region_map : region. generate_region_map ( ) ,
@@ -180,58 +172,58 @@ mod test {
180172 let mut is_escaped = false ;
181173 // Simulate matching regions
182174 while let Some ( letter) = reader. next ( ) {
183- if let Some ( begin) = rh. match_region_by_begin ( & reader, is_escaped) {
175+ if is_escaped {
176+ is_escaped = !is_escaped && letter == '\\' ;
177+ continue ;
178+ }
179+
180+ if let Some ( begin) = rh. match_region_by_begin ( & reader) {
184181 rh. region_stack . push ( begin. clone ( ) ) ;
185182 result. push ( ( reader. get_index ( ) , begin. begin ) ) ;
186183 }
187- if let Some ( end) = rh. match_region_by_end ( & reader, is_escaped ) {
184+ if let Some ( end) = rh. match_region_by_end ( & reader) {
188185 result. push ( ( reader. get_index ( ) , end. end ) ) ;
189186 }
190187 // Handle the escape key
191- is_escaped = ( !is_escaped && letter == '\\' )
192- . then ( || !is_escaped)
193- . unwrap_or ( false ) ;
188+ is_escaped = !is_escaped && letter == '\\' ;
194189 }
195190 assert_eq ! ( expected, result) ;
196191 }
197192
198193 #[ test]
199194 fn handle_region ( ) {
200- let lines = vec ! [
201- "'My name is \\ \\ \\ '{name}.\\ \\ '"
202- ] ;
203- let expected = vec ! [
204- 0 , 16 , 21 , 25
205- ] ;
195+ let lines = vec ! [ "'My name is \\ \\ \\ '{name}.\\ \\ '" ] ;
196+ let expected = vec ! [ 0 , 16 , 21 , 25 ] ;
206197 let code = lines. join ( "\n " ) ;
207- let region = reg ! [
208- reg!( string as "String literal" => {
209- begin: "'" ,
210- end: "'"
211- } => [
212- reg!( interp as "Interpolation" => {
213- begin: "{" ,
214- end: "}"
215- } )
216- ] )
217- ] ;
198+ let region = reg ! [ reg!( string as "String literal" => {
199+ begin: "'" ,
200+ end: "'"
201+ } => [
202+ reg!( interp as "Interpolation" => {
203+ begin: "{" ,
204+ end: "}"
205+ } )
206+ ] ) ] ;
218207 let mut reader = Reader :: new ( & code) ;
219208 let mut rh = RegionHandler {
220209 region_stack : vec ! [ region. clone( ) ] ,
221- region_map : region. generate_region_map ( )
210+ region_map : region. generate_region_map ( ) ,
222211 } ;
223212 let mut result = vec ! [ ] ;
224213 let mut is_escaped = false ;
225214 // Simulate matching regions
226215 while let Some ( letter) = reader. next ( ) {
227- let region_mutated = rh. handle_region ( & reader, is_escaped) ;
216+ if is_escaped {
217+ is_escaped = !is_escaped && letter == '\\' ;
218+ continue ;
219+ }
220+
221+ let region_mutated = rh. handle_region ( & reader) ;
228222 if let RegionReaction :: Begin ( _) | RegionReaction :: End ( _) = region_mutated {
229223 result. push ( reader. get_index ( ) ) ;
230224 }
231225 // Handle the escape key
232- is_escaped = ( !is_escaped && letter == '\\' )
233- . then ( || !is_escaped)
234- . unwrap_or ( false ) ;
226+ is_escaped = !is_escaped && letter == '\\' ;
235227 }
236228 assert_eq ! ( expected, result) ;
237229 }
0 commit comments