Skip to content

Commit ffb0509

Browse files
committed
fix: convert to byte indices
1 parent 2f73594 commit ffb0509

File tree

2 files changed

+51
-29
lines changed

2 files changed

+51
-29
lines changed

crates/pgt_lsp/tests/server.rs

+25-21
Original file line numberDiff line numberDiff line change
@@ -747,27 +747,31 @@ async fn test_issue_281() -> Result<()> {
747747

748748
server.load_configuration().await?;
749749

750-
server.open_document("select a").await?;
751-
752-
server
753-
.change_document(
754-
3,
755-
vec![TextDocumentContentChangeEvent {
756-
range: Some(Range {
757-
start: Position {
758-
line: 0,
759-
character: 7,
760-
},
761-
end: Position {
762-
line: 0,
763-
character: 7,
764-
},
765-
}),
766-
range_length: Some(0),
767-
text: "ы".to_string(),
768-
}],
769-
)
770-
.await?;
750+
server.open_document("\n------------- Meta -------------\n\n-- name: GetValueFromMetaKVStore :one\nSELECT value FROM meta_kv\nWHERE key = $1;\n\n-- name: SetValueToMetaKVStore :exec\nINSERT INTO meta_kv (key, value)\nVALUES ($1, $2)\nON CONFLICT (key) DO UPDATE\nSET value = excluded.value;\n\n\nasdsadsad\n\nыывфыв khgk\nasdыdsf\ndsdsjdfnfmdsвтьвыаыdsfsmndf,m\nы\n").await?;
751+
752+
let chars = ["s", "n", ",", "d", "f", "j", "s", "d", "f", "в"];
753+
754+
for (i, c) in chars.iter().enumerate() {
755+
server
756+
.change_document(
757+
i as i32 + 4,
758+
vec![TextDocumentContentChangeEvent {
759+
range: Some(Range {
760+
start: Position {
761+
line: 20,
762+
character: i as u32,
763+
},
764+
end: Position {
765+
line: 20,
766+
character: i as u32,
767+
},
768+
}),
769+
range_length: Some(0),
770+
text: c.to_string(),
771+
}],
772+
)
773+
.await?;
774+
}
771775

772776
server.shutdown().await?;
773777
reader.abort();

crates/pgt_workspace/src/workspace/server/change.rs

+26-8
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,19 @@ impl Document {
249249

250250
// if within a statement, we can modify it if the change results in also a single statement
251251
if affected_indices.len() == 1 {
252-
let changed_content = new_content
253-
.as_str()
254-
.get(usize::from(affected_range.start())..usize::from(affected_range.end()))
255-
.unwrap();
252+
let start_byte = new_content
253+
.char_indices()
254+
.nth(usize::from(affected_range.start()))
255+
.map(|(i, _)| i)
256+
.unwrap_or(new_content.len());
257+
258+
let end_byte = new_content
259+
.char_indices()
260+
.nth(usize::from(affected_range.end()))
261+
.map(|(i, _)| i)
262+
.unwrap_or(new_content.len());
263+
264+
let changed_content = &new_content[start_byte..end_byte];
256265

257266
let (new_ranges, diags) =
258267
document::split_with_diagnostics(changed_content, Some(affected_range.start()));
@@ -305,10 +314,19 @@ impl Document {
305314
}
306315

307316
// in any other case, parse the full affected range
308-
let changed_content = new_content
309-
.as_str()
310-
.get(usize::from(full_affected_range.start())..usize::from(full_affected_range.end()))
311-
.unwrap();
317+
let start_byte = new_content
318+
.char_indices()
319+
.nth(usize::from(full_affected_range.start()))
320+
.map(|(i, _)| i)
321+
.unwrap_or(new_content.len());
322+
323+
let end_byte = new_content
324+
.char_indices()
325+
.nth(usize::from(full_affected_range.end()))
326+
.map(|(i, _)| i)
327+
.unwrap_or(new_content.len());
328+
329+
let changed_content = &new_content[start_byte..end_byte];
312330

313331
let (new_ranges, diags) =
314332
document::split_with_diagnostics(changed_content, Some(full_affected_range.start()));

0 commit comments

Comments
 (0)