Skip to content

Commit 4d0d075

Browse files
committed
fix: make sure range is correct for eof deletions
1 parent b978a5a commit 4d0d075

File tree

2 files changed

+137
-2
lines changed

2 files changed

+137
-2
lines changed

crates/pgt_lsp/tests/server.rs

+133-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use sqlx::Executor;
2323
use std::any::type_name;
2424
use std::fmt::Display;
2525
use std::time::Duration;
26+
use test_log::test;
2627
use tower::timeout::Timeout;
2728
use tower::{Service, ServiceExt};
2829
use tower_lsp::LspService;
@@ -457,7 +458,7 @@ async fn server_shutdown() -> Result<()> {
457458
Ok(())
458459
}
459460

460-
#[tokio::test]
461+
#[test(tokio::test)]
461462
async fn test_completions() -> Result<()> {
462463
let factory = ServerFactory::default();
463464
let mut fs = MemoryFileSystem::default();
@@ -981,3 +982,134 @@ async fn test_issue_281() -> Result<()> {
981982

982983
Ok(())
983984
}
985+
986+
#[tokio::test]
987+
async fn test_issue_303() -> Result<()> {
988+
let factory = ServerFactory::default();
989+
let mut fs = MemoryFileSystem::default();
990+
let test_db = get_new_test_db().await;
991+
992+
let setup = r#"
993+
create table public.users (
994+
id serial primary key,
995+
name varchar(255) not null
996+
);
997+
"#;
998+
999+
test_db
1000+
.execute(setup)
1001+
.await
1002+
.expect("Failed to setup test database");
1003+
1004+
let mut conf = PartialConfiguration::init();
1005+
conf.merge_with(PartialConfiguration {
1006+
db: Some(PartialDatabaseConfiguration {
1007+
database: Some(
1008+
test_db
1009+
.connect_options()
1010+
.get_database()
1011+
.unwrap()
1012+
.to_string(),
1013+
),
1014+
..Default::default()
1015+
}),
1016+
..Default::default()
1017+
});
1018+
fs.insert(
1019+
url!("postgrestools.jsonc").to_file_path().unwrap(),
1020+
serde_json::to_string_pretty(&conf).unwrap(),
1021+
);
1022+
1023+
let (service, client) = factory
1024+
.create_with_fs(None, DynRef::Owned(Box::new(fs)))
1025+
.into_inner();
1026+
1027+
let (stream, sink) = client.split();
1028+
let mut server = Server::new(service);
1029+
1030+
let (sender, _) = channel(CHANNEL_BUFFER_SIZE);
1031+
let reader = tokio::spawn(client_handler(stream, sink, sender));
1032+
1033+
server.initialize().await?;
1034+
server.initialized().await?;
1035+
1036+
server.load_configuration().await?;
1037+
1038+
server.open_document("").await?;
1039+
1040+
let chars = [
1041+
"c", "r", "e", "a", "t", "e", " ", "t", "a", "b", "l", "e", " ", "\"\"", "h", "e", "l",
1042+
"l", "o",
1043+
];
1044+
let mut version = 1;
1045+
1046+
for (i, c) in chars.iter().enumerate() {
1047+
version += 1;
1048+
server
1049+
.change_document(
1050+
version,
1051+
vec![TextDocumentContentChangeEvent {
1052+
range: Some(Range {
1053+
start: Position {
1054+
line: 0,
1055+
character: i as u32,
1056+
},
1057+
end: Position {
1058+
line: 0,
1059+
character: i as u32,
1060+
},
1061+
}),
1062+
range_length: Some(0),
1063+
text: c.to_string(),
1064+
}],
1065+
)
1066+
.await?;
1067+
}
1068+
1069+
version += 1;
1070+
server
1071+
.change_document(
1072+
version,
1073+
vec![TextDocumentContentChangeEvent {
1074+
range: Some(Range {
1075+
start: Position {
1076+
line: 0,
1077+
character: 20,
1078+
},
1079+
end: Position {
1080+
line: 0,
1081+
character: 20,
1082+
},
1083+
}),
1084+
range_length: Some(0),
1085+
text: " ".to_string(),
1086+
}],
1087+
)
1088+
.await?;
1089+
1090+
version += 1;
1091+
server
1092+
.change_document(
1093+
version,
1094+
vec![TextDocumentContentChangeEvent {
1095+
range: Some(Range {
1096+
start: Position {
1097+
line: 0,
1098+
character: 20,
1099+
},
1100+
end: Position {
1101+
line: 0,
1102+
character: 21,
1103+
},
1104+
}),
1105+
range_length: Some(0),
1106+
text: "".to_string(),
1107+
}],
1108+
)
1109+
.await?;
1110+
1111+
server.shutdown().await?;
1112+
reader.abort();
1113+
1114+
Ok(())
1115+
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,10 @@ impl Document {
195195
affected_indices,
196196
prev_index,
197197
next_index,
198-
full_affected_range: TextRange::new(start_incl, end_incl.min(content_size)),
198+
full_affected_range: TextRange::new(
199+
start_incl,
200+
end_incl.min(content_size).max(start_incl),
201+
),
199202
}
200203
}
201204

0 commit comments

Comments
 (0)