@@ -16,7 +16,7 @@ pub struct ElementJsonFile {
1616 source_code : String ,
1717 uri : Uri ,
1818 #[ cfg( not( test) ) ]
19- resource_directory : Reference < ElementDirectory > ,
19+ element_directory : Reference < ElementDirectory > ,
2020}
2121
2222#[ napi]
@@ -34,15 +34,15 @@ impl ElementJsonFile {
3434 }
3535
3636 #[ cfg( not( test) ) ]
37- pub fn new ( resource_directory : Reference < ElementDirectory > , uri : & Uri , source_code : String ) -> Self {
37+ pub fn new ( element_directory : Reference < ElementDirectory > , uri : & Uri , source_code : String ) -> Self {
3838 let mut parser = Parser :: new ( ) ;
3939 parser. set_language ( & tree_sitter_json:: LANGUAGE . into ( ) ) . unwrap ( ) ;
4040
4141 Self {
4242 parser,
4343 source_code,
4444 uri : uri. clone ( ) ,
45- resource_directory ,
45+ element_directory ,
4646 }
4747 }
4848
@@ -74,15 +74,19 @@ impl ElementJsonFile {
7474
7575 #[ napi]
7676 #[ cfg( not( test) ) ]
77- pub fn get_resource_directory ( & self , env : Env ) -> Reference < ElementDirectory > {
78- self . resource_directory . clone ( env) . unwrap ( )
77+ pub fn get_element_directory ( & self , env : Env ) -> Reference < ElementDirectory > {
78+ self . element_directory . clone ( env) . unwrap ( )
7979 }
8080
8181 #[ napi]
8282 pub fn get_content ( & self ) -> String {
8383 self . source_code . clone ( )
8484 }
8585
86+ fn byte_to_char_index ( & self , byte_offset : usize ) -> usize {
87+ self . source_code [ ..byte_offset] . chars ( ) . count ( )
88+ }
89+
8690 #[ napi]
8791 pub fn parse ( & mut self ) -> serde_json:: Value {
8892 serde_json5:: from_str ( & self . source_code ) . unwrap ( )
@@ -139,16 +143,16 @@ impl ElementJsonFile {
139143 Ok ( text) => text,
140144 Err ( _) => continue ,
141145 } ;
142- if key_text. contains ( "\" name\" " ) {
143- name_start = Some ( filtered_nodes[ 1 ] . start_byte ( ) ) ;
144- name_end = Some ( filtered_nodes[ 1 ] . end_byte ( ) ) ;
146+ if key_text == "\" name\" " {
147+ name_start = Some ( self . byte_to_char_index ( filtered_nodes[ 1 ] . start_byte ( ) ) ) ;
148+ name_end = Some ( self . byte_to_char_index ( filtered_nodes[ 1 ] . end_byte ( ) ) ) ;
145149 name_text = Some ( match filtered_nodes[ 1 ] . utf8_text ( self . source_code . as_bytes ( ) ) {
146150 Ok ( text) => text. to_string ( ) ,
147151 Err ( _) => continue ,
148152 } ) ;
149- } else if key_text. contains ( "\" value\" " ) {
150- value_start = Some ( filtered_nodes[ 1 ] . start_byte ( ) ) ;
151- value_end = Some ( filtered_nodes[ 1 ] . end_byte ( ) ) ;
153+ } else if key_text == "\" value\" " {
154+ value_start = Some ( self . byte_to_char_index ( filtered_nodes[ 1 ] . start_byte ( ) ) ) ;
155+ value_end = Some ( self . byte_to_char_index ( filtered_nodes[ 1 ] . end_byte ( ) ) ) ;
152156 value_text = Some ( match filtered_nodes[ 1 ] . utf8_text ( self . source_code . as_bytes ( ) ) {
153157 Ok ( text) => text. to_string ( ) ,
154158 Err ( _) => continue ,
@@ -161,14 +165,16 @@ impl ElementJsonFile {
161165 if let ( Some ( name_start) , Some ( name_end) , Some ( name_text) , Some ( value_start) , Some ( value_end) , Some ( value_text) ) =
162166 ( name_start, name_end, name_text, value_start, value_end, value_text)
163167 {
164- reference. push ( ElementJsonFileReference :: new (
165- name_start as u32 ,
166- name_end as u32 ,
167- name_text,
168- value_start as u32 ,
169- value_end as u32 ,
170- value_text,
171- ) )
168+ reference. push (
169+ ElementJsonFileReference :: new (
170+ name_start as u32 ,
171+ name_end as u32 ,
172+ name_text,
173+ value_start as u32 ,
174+ value_end as u32 ,
175+ value_text,
176+ )
177+ )
172178 }
173179 }
174180 }
@@ -183,17 +189,39 @@ impl ElementJsonFile {
183189mod tests {
184190 use super :: * ;
185191
192+ fn slice ( s : & str , start : usize , end_exclusive : usize ) -> String {
193+ let mut byte_start = 0usize ;
194+ let mut byte_end = s. len ( ) ;
195+ for ( i, ( bpos, _) ) in s. char_indices ( ) . enumerate ( ) {
196+ if i == start { byte_start = bpos; }
197+ if i == end_exclusive { byte_end = bpos; break ; }
198+ }
199+ s[ byte_start..byte_end] . to_string ( )
200+ }
201+
186202 #[ test]
187203 fn test_get_reference ( ) {
188204 let mock_str = String :: from ( "{ \" string\" : [{ \" name\" : \" test1\" , \" value\" : \" test1-value\" }] }" ) ;
189205 let mut element_json_file = ElementJsonFile :: new ( & Uri :: file ( "test.json" . to_string ( ) ) , mock_str. clone ( ) ) ;
190206 let references = element_json_file. get_reference ( ) ;
191207 assert_eq ! ( references. len( ) , 1 ) ;
192- assert_eq ! ( references[ 0 ] . get_name_text( ) , "\" test1\" " ) ;
193- assert_eq ! ( references[ 0 ] . get_value_text( ) , "\" test1-value\" " ) ;
194- assert_eq ! ( references[ 0 ] . get_name_start( ) , 23 ) ;
195- assert_eq ! ( references[ 0 ] . get_name_end( ) , 30 ) ;
196- assert_eq ! ( references[ 0 ] . get_value_start( ) , 41 ) ;
197- assert_eq ! ( references[ 0 ] . get_value_end( ) , 54 ) ;
208+ assert_eq ! ( references[ 0 ] . get_name_full_text( ) , "\" test1\" " ) ;
209+ assert_eq ! ( references[ 0 ] . get_value_full_text( ) , "\" test1-value\" " ) ;
210+ assert_eq ! (
211+ slice(
212+ & mock_str,
213+ references[ 0 ] . get_name_start( ) as usize ,
214+ references[ 0 ] . get_name_end( ) as usize
215+ ) ,
216+ references[ 0 ] . get_name_full_text( )
217+ ) ;
218+ assert_eq ! (
219+ slice(
220+ & mock_str,
221+ references[ 0 ] . get_value_start( ) as usize ,
222+ references[ 0 ] . get_value_end( ) as usize
223+ ) ,
224+ references[ 0 ] . get_value_full_text( )
225+ ) ;
198226 }
199227}
0 commit comments