Skip to content

Commit 1308770

Browse files
committed
fix: cleanup and fix some clippy warnings (sorry, unrelated)
1 parent d21f261 commit 1308770

File tree

10 files changed

+122
-158
lines changed

10 files changed

+122
-158
lines changed

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_statement_splitter/src/lib.rs

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ pub fn split(sql: &str) -> Parse {
1717
#[cfg(test)]
1818
mod tests {
1919
use ntest::timeout;
20+
use pg_lexer::SyntaxKind;
21+
use syntax_error::SyntaxError;
22+
use text_size::TextRange;
2023

2124
use super::*;
2225

@@ -35,18 +38,42 @@ mod tests {
3538
}
3639

3740
impl Tester {
38-
fn expect_statements(&self, expected: Vec<&str>) {
41+
fn expect_statements(&self, expected: Vec<&str>) -> &Self {
3942
assert_eq!(
4043
self.parse.ranges.len(),
4144
expected.len(),
42-
"Expected {} statements, got {}",
45+
"Expected {} statements, got {}: {:?}",
4346
expected.len(),
44-
self.parse.ranges.len()
47+
self.parse.ranges.len(),
48+
self.parse
49+
.ranges
50+
.iter()
51+
.map(|r| &self.input[*r])
52+
.collect::<Vec<_>>()
4553
);
4654

4755
for (range, expected) in self.parse.ranges.iter().zip(expected.iter()) {
4856
assert_eq!(*expected, self.input[*range].to_string());
4957
}
58+
59+
self
60+
}
61+
62+
fn expect_errors(&self, expected: Vec<SyntaxError>) -> &Self {
63+
assert_eq!(
64+
self.parse.errors.len(),
65+
expected.len(),
66+
"Expected {} errors, got {}: {:?}",
67+
expected.len(),
68+
self.parse.errors.len(),
69+
self.parse.errors
70+
);
71+
72+
for (err, expected) in self.parse.errors.iter().zip(expected.iter()) {
73+
assert_eq!(expected, err);
74+
}
75+
76+
self
5077
}
5178
}
5279

@@ -72,6 +99,16 @@ mod tests {
7299
]);
73100
}
74101

102+
#[test]
103+
fn insert_expect_error() {
104+
Tester::from("\ninsert select 1\n\nselect 3")
105+
.expect_statements(vec!["insert select 1", "select 3"])
106+
.expect_errors(vec![SyntaxError::new(
107+
format!("Expected {:?}", SyntaxKind::Into),
108+
TextRange::new(8.into(), 14.into()),
109+
)]);
110+
}
111+
75112
#[test]
76113
fn insert_with_select() {
77114
Tester::from("\ninsert into tbl (id) select 1\n\nselect 3")
@@ -84,6 +121,28 @@ mod tests {
84121
.expect_statements(vec!["select case when select 2 then 1 else 0 end"]);
85122
}
86123

124+
#[test]
125+
#[timeout(1000)]
126+
fn simple_select() {
127+
Tester::from(
128+
"
129+
select id, name, test1231234123, unknown from co;
130+
131+
select 14433313331333
132+
133+
alter table test drop column id;
134+
135+
select lower('test');
136+
",
137+
)
138+
.expect_statements(vec![
139+
"select id, name, test1231234123, unknown from co;",
140+
"select 14433313331333",
141+
"alter table test drop column id;",
142+
"select lower('test');",
143+
]);
144+
}
145+
87146
#[test]
88147
fn create_rule() {
89148
Tester::from(
@@ -103,7 +162,7 @@ values ('insert', new.id, now());",
103162
#[test]
104163
fn insert_into() {
105164
Tester::from("randomness\ninsert into tbl (id) values (1)\nselect 3").expect_statements(
106-
vec!["randomness", "insert into tbl (id) values (1)", "select 3"],
165+
vec!["randomness", "insert into tbl (id) values (1)\nselect 3"],
107166
);
108167
}
109168

crates/pg_statement_splitter/src/parser.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,10 @@ impl Parser {
178178
return;
179179
}
180180

181-
self.error_at(format!("Expected {:#?}", kind));
182-
}
183-
184-
/// collects an SyntaxError with an `error` message at the current position
185-
fn error_at(&mut self, error: String) {
186-
todo!("{error}");
181+
self.errors.push(SyntaxError::new(
182+
format!("Expected {:#?}", kind),
183+
self.peek().span,
184+
));
187185
}
188186
}
189187

crates/pg_statement_splitter/src/parser/common.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use pg_lexer::{SyntaxKind, Token, TokenType};
22

33
use super::{
44
data::at_statement_start,
5-
ddl::create,
5+
ddl::{alter, create},
66
dml::{cte, delete, insert, select, update},
77
Parser,
88
};
@@ -52,8 +52,11 @@ pub(crate) fn statement(p: &mut Parser) {
5252
SyntaxKind::Create => {
5353
create(p);
5454
}
55+
SyntaxKind::Alter => {
56+
alter(p);
57+
}
5558
_ => {
56-
unknown(p);
59+
unknown(p, &[]);
5760
}
5861
}
5962
p.close_stmt();
@@ -91,7 +94,7 @@ pub(crate) fn case(p: &mut Parser) {
9194
}
9295
}
9396

94-
pub(crate) fn unknown(p: &mut Parser) {
97+
pub(crate) fn unknown(p: &mut Parser, exclude: &[SyntaxKind]) {
9598
loop {
9699
match p.peek() {
97100
Token {
@@ -119,7 +122,7 @@ pub(crate) fn unknown(p: &mut Parser) {
119122
} => {
120123
parenthesis(p);
121124
}
122-
t => match at_statement_start(t.kind) {
125+
t => match at_statement_start(t.kind, exclude) {
123126
Some(SyntaxKind::Select) => {
124127
// we need to check for `as` here to not break on `select as`
125128
if p.look_back().map(|t| t.kind) != Some(SyntaxKind::As) {

crates/pg_statement_splitter/src/parser/data.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@ use pg_lexer::SyntaxKind;
22

33
// All tokens listed here must be explicitly handled in the `unknown` function to ensure that we do
44
// not break in the middle of another statement that contains a statement start token.
5+
//
6+
// All of these statements must have a dedicated parser function called from the `statement` function
57
static STATEMENT_START_TOKENS: &[SyntaxKind] = &[
68
SyntaxKind::With,
79
SyntaxKind::Select,
810
SyntaxKind::Insert,
911
SyntaxKind::Update,
1012
SyntaxKind::DeleteP,
1113
SyntaxKind::Create,
14+
SyntaxKind::Alter,
1215
];
1316

14-
pub(crate) fn at_statement_start(kind: SyntaxKind) -> Option<SyntaxKind> {
15-
STATEMENT_START_TOKENS.iter().find(|&x| x == &kind).cloned()
17+
pub(crate) fn at_statement_start(kind: SyntaxKind, exclude: &[SyntaxKind]) -> Option<&SyntaxKind> {
18+
STATEMENT_START_TOKENS
19+
.iter()
20+
.filter(|&x| !exclude.contains(x))
21+
.find(|&x| x == &kind)
1622
}

0 commit comments

Comments
 (0)