Skip to content

Commit b930638

Browse files
authored
Merge pull request #142 from supabase-community/naive-stmt-splitter
2 parents c20a293 + 5f08420 commit b930638

File tree

15 files changed

+668
-1393
lines changed

15 files changed

+668
-1393
lines changed

Cargo.lock

Lines changed: 80 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/pg_base_db/src/change.rs

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ impl ChangedStatement {
4242
}
4343
}
4444

45-
fn apply_text_change(text: &String, range: Option<TextRange>, change_text: &String) -> String {
45+
fn apply_text_change(text: &str, range: Option<TextRange>, change_text: &str) -> String {
4646
if range.is_none() {
47-
return change_text.clone();
47+
return change_text.to_string();
4848
}
4949

5050
let range = range.unwrap();
@@ -53,7 +53,7 @@ fn apply_text_change(text: &String, range: Option<TextRange>, change_text: &Stri
5353

5454
let mut new_text = String::new();
5555
new_text.push_str(&text[..start]);
56-
new_text.push_str(&change_text);
56+
new_text.push_str(change_text);
5757
new_text.push_str(&text[end..]);
5858

5959
new_text
@@ -97,7 +97,7 @@ impl Change {
9797
self.range.is_some() && self.text.len() < self.range.unwrap().len().into()
9898
}
9999

100-
pub fn apply_to_text(&self, text: &String) -> String {
100+
pub fn apply_to_text(&self, text: &str) -> String {
101101
if self.range.is_none() {
102102
return self.text.clone();
103103
}
@@ -122,14 +122,10 @@ impl Change {
122122
changed_statements.extend(
123123
doc.drain_statements()
124124
.into_iter()
125-
.map(|s| StatementChange::Deleted(s)),
125+
.map(StatementChange::Deleted),
126126
);
127127
// TODO also use errors returned by extract sql statement ranges
128-
doc.statement_ranges = pg_statement_splitter::split(&self.text)
129-
.ranges
130-
.iter()
131-
.map(|r| r.clone())
132-
.collect();
128+
doc.statement_ranges = pg_statement_splitter::split(&self.text).ranges.to_vec();
133129
doc.text = self.text.clone();
134130
doc.line_index = LineIndex::new(&doc.text);
135131

@@ -155,7 +151,7 @@ impl Change {
155151
changed_statements.push(StatementChange::Modified(ChangedStatement {
156152
statement: StatementRef {
157153
idx: pos,
158-
text: doc.text[r.clone()].to_string(),
154+
text: doc.text[*r].to_string(),
159155
document_url: doc.url.clone(),
160156
},
161157
// change must be relative to statement
@@ -166,15 +162,9 @@ impl Change {
166162
// if addition, expand the range
167163
// if deletion, shrink the range
168164
if self.is_addition() {
169-
*r = TextRange::new(
170-
r.start(),
171-
r.end() + TextSize::from(self.diff_size()),
172-
);
165+
*r = TextRange::new(r.start(), r.end() + self.diff_size());
173166
} else if self.is_deletion() {
174-
*r = TextRange::new(
175-
r.start(),
176-
r.end() - TextSize::from(self.diff_size()),
177-
);
167+
*r = TextRange::new(r.start(), r.end() - self.diff_size());
178168
}
179169
} else if self.is_addition() {
180170
*r += self.diff_size();
@@ -206,7 +196,7 @@ impl Change {
206196
{
207197
changed_statements.push(StatementChange::Deleted(StatementRef {
208198
idx,
209-
text: doc.text[r.clone()].to_string(),
199+
text: doc.text[*r].to_string(),
210200
document_url: doc.url.clone(),
211201
}));
212202

@@ -344,15 +334,14 @@ mod tests {
344334
assert_eq!(d.statement_ranges.len(), 2);
345335

346336
for r in &pg_statement_splitter::split(&d.text).ranges {
347-
assert_eq!(
348-
d.statement_ranges.iter().position(|x| r == x).is_some(),
349-
true,
337+
assert!(
338+
d.statement_ranges.iter().any(|x| r == x),
350339
"should have stmt with range {:#?}",
351340
r
352341
);
353342
}
354343

355-
assert_eq!(d.statement_ranges[0], TextRange::new(0.into(), 26.into()));
344+
assert_eq!(d.statement_ranges[0], TextRange::new(0.into(), 25.into()));
356345
assert_eq!(d.statement_ranges[1], TextRange::new(26.into(), 35.into()));
357346
}
358347

@@ -364,8 +353,8 @@ mod tests {
364353

365354
assert_eq!(d.statement_ranges.len(), 2);
366355

367-
let stmt_1_range = d.statement_ranges[0].clone();
368-
let stmt_2_range = d.statement_ranges[1].clone();
356+
let stmt_1_range = d.statement_ranges[0];
357+
let stmt_2_range = d.statement_ranges[1];
369358

370359
let update_text = " contacts;";
371360

@@ -522,8 +511,8 @@ mod tests {
522511

523512
assert_eq!(d.statement_ranges.len(), 2);
524513

525-
let stmt_1_range = d.statement_ranges[0].clone();
526-
let stmt_2_range = d.statement_ranges[1].clone();
514+
let stmt_1_range = d.statement_ranges[0];
515+
let stmt_2_range = d.statement_ranges[1];
527516

528517
let update_text = ",test";
529518

crates/pg_base_db/src/document.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{hash::Hash, hash::Hasher, ops::RangeBounds, usize};
1+
use std::{hash::Hash, hash::Hasher, ops::RangeBounds};
22

33
use line_index::LineIndex;
44
use text_size::{TextRange, TextSize};
@@ -44,18 +44,11 @@ impl Document {
4444
pub fn new(url: PgLspPath, text: Option<String>) -> Document {
4545
Document {
4646
version: 0,
47-
line_index: LineIndex::new(&text.as_ref().unwrap_or(&"".to_string())),
47+
line_index: LineIndex::new(text.as_ref().unwrap_or(&"".to_string())),
4848
// TODO: use errors returned by split
49-
statement_ranges: text.as_ref().map_or_else(
50-
|| Vec::new(),
51-
|f| {
52-
pg_statement_splitter::split(&f)
53-
.ranges
54-
.iter()
55-
.map(|range| range.clone())
56-
.collect()
57-
},
58-
),
49+
statement_ranges: text.as_ref().map_or_else(Vec::new, |f| {
50+
pg_statement_splitter::split(f).ranges.to_vec()
51+
}),
5952
text: text.unwrap_or("".to_string()),
6053
url,
6154
}
@@ -99,7 +92,7 @@ impl Document {
9992
.enumerate()
10093
.map(|(idx, range)| StatementRef {
10194
document_url: self.url.clone(),
102-
text: self.text[range.clone()].to_string(),
95+
text: self.text[range].to_string(),
10396
idx,
10497
})
10598
.collect()
@@ -112,10 +105,10 @@ impl Document {
112105
.enumerate()
113106
.map(|(idx, range)| {
114107
(
115-
range.clone(),
108+
*range,
116109
StatementRef {
117110
document_url: self.url.clone(),
118-
text: self.text[range.clone()].to_string(),
111+
text: self.text[*range].to_string(),
119112
idx,
120113
},
121114
)
@@ -130,7 +123,7 @@ impl Document {
130123
.enumerate()
131124
.map(|(idx, range)| StatementRef {
132125
document_url: self.url.clone(),
133-
text: self.text[range.clone()].to_string(),
126+
text: self.text[*range].to_string(),
134127
idx,
135128
})
136129
.collect()
@@ -142,7 +135,7 @@ impl Document {
142135
.get(pos)
143136
.map(|range| StatementRef {
144137
document_url: self.url.clone(),
145-
text: self.text[range.clone()].to_string(),
138+
text: self.text[*range].to_string(),
146139
idx: pos,
147140
})
148141
.unwrap()
@@ -154,10 +147,10 @@ impl Document {
154147
.get(pos)
155148
.map(|range| {
156149
(
157-
range.clone(),
150+
*range,
158151
StatementRef {
159152
document_url: self.url.clone(),
160-
text: self.text[range.clone()].to_string(),
153+
text: self.text[*range].to_string(),
161154
idx: pos,
162155
},
163156
)

crates/pg_lexer/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ static PATTERN_LEXER: LazyLock<Regex> =
6565
fn whitespace_tokens(input: &str) -> VecDeque<Token> {
6666
let mut tokens = VecDeque::new();
6767

68-
for cap in PATTERN_LEXER.captures_iter(&input) {
68+
for cap in PATTERN_LEXER.captures_iter(input) {
6969
if let Some(whitespace) = cap.name("whitespace") {
7070
tokens.push_back(Token {
7171
token_type: TokenType::Whitespace,
@@ -139,8 +139,8 @@ pub fn lex(text: &str) -> Vec<Token> {
139139
kind: SyntaxKind::from(&pg_query_token),
140140
text: token_text,
141141
span: TextRange::new(
142-
TextSize::try_from(u32::try_from(pg_query_token.start).unwrap()).unwrap(),
143-
TextSize::try_from(u32::try_from(pg_query_token.end).unwrap()).unwrap(),
142+
TextSize::from(u32::try_from(pg_query_token.start).unwrap()),
143+
TextSize::from(u32::try_from(pg_query_token.end).unwrap()),
144144
),
145145
});
146146
pos += len;

crates/pg_lsp/src/server/debouncer/thread.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(dead_code)]
2+
13
use std::sync::atomic::{AtomicBool, Ordering};
24
use std::sync::{Arc, Mutex};
35
use std::thread::{self, JoinHandle};

crates/pg_statement_splitter/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ text-size = "1.1.1"
99

1010
[dev-dependencies]
1111
pg_query = "0.8"
12+
ntest = "0.9.3"
1213

0 commit comments

Comments
 (0)