@@ -51,18 +51,6 @@ impl LineNumbers {
5151 + 1
5252 }
5353
54- pub fn line_and_column_number_utf8 ( & self , byte_index : u32 ) -> LineColumn {
55- let line = self . line_number ( byte_index) ;
56- let column = byte_index
57- - self
58- . line_starts
59- . get ( line as usize - 1 )
60- . copied ( )
61- . unwrap_or_default ( )
62- + 1 ;
63- LineColumn { line, column }
64- }
65-
6654 pub fn line_and_column_number ( & self , byte_index : u32 ) -> LineColumn {
6755 let line = self . line_number ( byte_index) ;
6856 let line_start = self
@@ -138,6 +126,59 @@ pub fn main() {
138126 assert_eq ! ( line_numbers. byte_index( 2 , 1 ) , 18 ) ;
139127}
140128
129+ // https://github.com/gleam-lang/gleam/issues/3628
130+ #[ test]
131+ fn byte_index_with_multibyte_characters ( ) {
132+ let src = r#"fn wibble(_a, _b, _c) {
133+ todo
134+ }
135+
136+ pub fn main() {
137+ wibble("क्षि", 10, <<"abc">>)
138+ }
139+ "# ;
140+ let line_numbers = LineNumbers :: new ( src) ;
141+
142+ assert_eq ! ( line_numbers. byte_index( 1 , 6 ) , 30 ) ;
143+ assert_eq ! ( line_numbers. byte_index( 5 , 2 ) , 52 ) ;
144+ assert_eq ! ( line_numbers. byte_index( 5 , 17 ) , 75 ) ;
145+ assert_eq ! ( line_numbers. byte_index( 6 , 1 ) , 91 ) ;
146+ }
147+
148+ // https://github.com/gleam-lang/gleam/issues/3628
149+ #[ test]
150+ fn line_and_column_with_multibyte_characters ( ) {
151+ let src = r#"fn wibble(_a, _b, _c) {
152+ todo
153+ }
154+
155+ pub fn main() {
156+ wibble("क्षि", 10, <<"abc">>)
157+ }
158+ "# ;
159+ let line_numbers = LineNumbers :: new ( src) ;
160+
161+ assert_eq ! (
162+ line_numbers. line_and_column_number( 30 ) ,
163+ LineColumn { line: 2 , column: 7 }
164+ ) ;
165+ assert_eq ! (
166+ line_numbers. line_and_column_number( 52 ) ,
167+ LineColumn { line: 6 , column: 3 }
168+ ) ;
169+ assert_eq ! (
170+ line_numbers. line_and_column_number( 75 ) ,
171+ LineColumn {
172+ line: 6 ,
173+ column: 18
174+ }
175+ ) ;
176+ assert_eq ! (
177+ line_numbers. line_and_column_number( 91 ) ,
178+ LineColumn { line: 7 , column: 2 }
179+ ) ;
180+ }
181+
141182#[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
142183pub struct LineColumn {
143184 pub line : u32 ,
0 commit comments