Files
neovim/runtime/doc
Tristan Knight 230b0c7f02 feat(stdlib): overload vim.str_byteindex, vim.str_utfindex #30735
PROBLEM:
There are several limitations to vim.str_byteindex, vim.str_utfindex:
1. They throw given out-of-range indexes. An invalid (often user/lsp-provided)
   index doesn't feel exceptional and should be handled by the caller.
   `:help dev-error-patterns` suggests that `retval, errmsg` is the preferred
   way to handle this kind of failure.
2. They cannot accept an encoding. So LSP needs wrapper functions. #25272
3. The current signatures are not extensible.
    * Calling: The function currently uses a fairly opaque boolean value to
      indicate to identify the encoding.
    * Returns: The fact it can throw requires wrapping in pcall.
4. The current name doesn't follow suggestions in `:h dev-naming` and I think
   `get` would be suitable.

SOLUTION:
- Because these are performance-sensitive, don't introduce `opts`.
- Introduce an "overload" that accepts `encoding:string` and
  `strict_indexing:bool` params.

```lua
local col = vim.str_utfindex(line, encoding, [index, [no_out_of_range]])
```

Support the old versions by dispatching on the type of argument 2, and
deprecate that form.

```lua
vim.str_utfindex(line)                             -- (utf-32 length, utf-16 length), deprecated
vim.str_utfindex(line, index)                      -- (utf-32 index, utf-16 index), deprecated
vim.str_utfindex(line, 'utf-16')                   -- utf-16 length
vim.str_utfindex(line, 'utf-16', index)            -- utf-16 index
vim.str_utfindex(line, 'utf-16', math.huge)        -- error: index out of range
vim.str_utfindex(line, 'utf-16', math.huge, false) -- utf-16 length
```
2024-10-23 06:33:57 -07:00
..
2023-07-25 05:07:13 -07:00
2024-10-23 14:13:42 +02:00
2023-10-29 16:02:32 +08:00
2024-10-23 14:13:42 +02:00
2024-05-15 23:19:26 +02:00
2024-10-23 14:13:42 +02:00
2021-09-10 08:48:27 +02:00
2023-06-25 17:14:28 +02:00
2023-10-29 16:02:32 +08:00
2024-09-01 13:01:24 -07:00
2024-04-11 07:39:29 +08:00
2024-07-15 06:54:45 +08:00
2023-05-13 21:33:22 +02:00
2024-10-23 14:13:42 +02:00
2024-03-12 13:51:53 +08:00
2024-02-22 10:07:04 +01:00
2022-10-14 08:01:13 -07:00
2023-11-14 23:29:09 +01:00
2018-10-29 09:55:07 +01:00
2024-05-11 18:14:03 +08:00
2015-08-15 15:25:30 -03:00
2023-11-06 19:03:08 +08:00
2024-01-18 00:14:48 -08:00
2024-04-30 04:30:21 -07:00
2023-01-01 15:05:13 +01:00
2023-06-19 08:40:33 -07:00
2024-09-24 04:46:50 -07:00
2023-08-10 17:28:02 +08:00
2024-04-23 08:20:36 +08:00
2024-05-11 18:14:03 +08:00
2023-04-23 15:22:55 +02:00
2023-01-03 10:07:43 +00:00
2023-06-25 17:14:28 +02:00
2023-06-19 08:40:33 -07:00
2023-06-25 17:14:28 +02:00
2023-06-25 17:14:28 +02:00
2021-05-01 22:29:03 -04:00
2023-06-25 17:14:28 +02:00
2018-10-29 10:01:44 +01:00
2021-04-29 09:27:19 -04:00
2023-06-25 17:14:28 +02:00
2024-04-30 05:54:03 +08:00
2021-04-29 20:42:16 -04:00
2023-06-26 11:29:12 +02:00
2023-07-25 05:07:13 -07:00
2021-04-27 09:21:34 -04:00
2023-06-19 08:40:33 -07:00
2023-06-25 17:14:28 +02:00