builtin: add string.runes() (#10611)
							parent
							
								
									1e896c7020
								
							
						
					
					
						commit
						6838030ab5
					
				|  | @ -68,6 +68,21 @@ pub fn vstrlen(s &byte) int { | ||||||
| 	return unsafe { C.strlen(&char(s)) } | 	return unsafe { C.strlen(&char(s)) } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | pub fn (s string) runes() []rune { | ||||||
|  | 	mut runes := []rune{cap: s.len} | ||||||
|  | 	for i := 0; i < s.len; i++ { | ||||||
|  | 		char_len := utf8_char_len(unsafe { s.str[i] }) | ||||||
|  | 		if char_len > 1 { | ||||||
|  | 			mut r := unsafe { s[i..i + char_len] } | ||||||
|  | 			runes << r.utf32_code() | ||||||
|  | 			i += char_len - 1 | ||||||
|  | 		} else { | ||||||
|  | 			runes << unsafe { s.str[i] } | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return runes | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // tos converts a C string to a V string.
 | // tos converts a C string to a V string.
 | ||||||
| // String data is reused, not copied.
 | // String data is reused, not copied.
 | ||||||
| [unsafe] | [unsafe] | ||||||
|  |  | ||||||
|  | @ -950,3 +950,13 @@ fn test_interpolation_after_quoted_variable_still_works() { | ||||||
| 	cccq := 'Replacing "$cc" with "$tt"' | 	cccq := 'Replacing "$cc" with "$tt"' | ||||||
| 	assert cccq == 'Replacing "abc" with "xyz"' | 	assert cccq == 'Replacing "abc" with "xyz"' | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn test_emoji_to_runes() { | ||||||
|  | 	x := '👋' | ||||||
|  | 	assert x.runes()[0] == `👋` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_string_to_rune() { | ||||||
|  | 	x := 'Hello World 👋' | ||||||
|  | 	assert x.runes().len == 13 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -3147,8 +3147,9 @@ fn (mut g Gen) expr(node ast.Expr) { | ||||||
| 			if node.val == r'\`' { | 			if node.val == r'\`' { | ||||||
| 				g.write("'`'") | 				g.write("'`'") | ||||||
| 			} else { | 			} else { | ||||||
|  | 				// TODO: optimize use L-char instead of u32 when possible
 | ||||||
| 				if utf8_str_len(node.val) < node.val.len { | 				if utf8_str_len(node.val) < node.val.len { | ||||||
| 					g.write("L'$node.val'") | 					g.write('((u32)0x$node.val.utf32_code().hex())') | ||||||
| 				} else { | 				} else { | ||||||
| 					g.write("'$node.val'") | 					g.write("'$node.val'") | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue