Skip to content

Commit 2ea7358

Browse files
merge
2 parents 19937a3 + 451579d commit 2ea7358

File tree

4 files changed

+170
-32
lines changed

4 files changed

+170
-32
lines changed

.github/workflows/publish.reusable.yml

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ jobs:
1616
runs-on: ubuntu-latest
1717
permissions:
1818
contents: write
19-
# ? what's this?! required for executing the node script?
2019
id-token: write
2120
steps:
2221
- uses: actions/checkout@v4

.github/workflows/pull_request.yml

+9-7
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,20 @@ jobs:
102102
version: latest
103103
- name: Run Lints
104104
run: |
105+
cargo sqlx prepare --check --workspace
105106
cargo clippy
106107
cargo run -p rules_check
107108
biome lint
108-
cargo sqlx prepare --check --workspace
109109
110110
test:
111111
name: Test
112112
runs-on: ${{ matrix.os }}
113113
strategy:
114114
matrix:
115115
include:
116-
# reactive once we upgrade to the latest version of pg_query that is windows-compatible
117-
- os: windows-latest
118-
- os: ubuntu-latest
116+
# use the same images we use for compiling
117+
- os: windows-2022
118+
- os: ubuntu-22.04
119119
steps:
120120
- name: Checkout PR branch
121121
uses: actions/checkout@v4
@@ -138,8 +138,10 @@ jobs:
138138
run: cargo test --workspace
139139

140140
test-js-bindings:
141-
name: Test JS Bindings
142-
runs-on: ubuntu-latest
141+
name:
142+
Test JS Bindings
143+
# use the same image we use for compiling
144+
runs-on: ubuntu-22.04
143145
services:
144146
postgres:
145147
image: postgres:latest
@@ -173,7 +175,7 @@ jobs:
173175

174176
codegen:
175177
name: Check Codegen
176-
runs-on: ubuntu-latest
178+
runs-on: ubuntu-22.04
177179
services:
178180
postgres:
179181
image: postgres:latest

.github/workflows/release.yml

+8-8
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ jobs:
3737
strategy:
3838
matrix:
3939
config:
40-
- { os: ubuntu-latest, target: x86_64-unknown-linux-gnu }
41-
- { os: ubuntu-latest, target: aarch64-unknown-linux-gnu }
42-
- { os: macos-latest, target: x86_64-apple-darwin }
43-
- { os: macos-latest, target: aarch64-apple-darwin }
44-
- { os: windows-latest, target: x86_64-pc-windows-msvc }
45-
- { os: windows-latest, target: aarch64-pc-windows-msvc }
40+
- { os: ubuntu-22.04, target: x86_64-unknown-linux-gnu }
41+
- { os: ubuntu-22.04, target: aarch64-unknown-linux-gnu }
42+
- { os: macos-14, target: x86_64-apple-darwin }
43+
- { os: macos-14, target: aarch64-apple-darwin }
44+
- { os: windows-2022, target: x86_64-pc-windows-msvc }
45+
- { os: windows-2022, target: aarch64-pc-windows-msvc }
4646

4747
runs-on: ${{ matrix.config.os }}
4848

@@ -87,12 +87,12 @@ jobs:
8787

8888
# windows is a special snowflake too, it saves binaries as .exe
8989
- name: 👦 Name the Binary
90-
if: matrix.config.os == 'windows-latest'
90+
if: matrix.config.os == 'windows-2022'
9191
run: |
9292
mkdir dist
9393
cp target/${{ matrix.config.target }}/release/postgrestools.exe ./dist/postgrestools_${{ matrix.config.target }}
9494
- name: 👦 Name the Binary
95-
if: matrix.config.os != 'windows-latest'
95+
if: matrix.config.os != 'windows-2022'
9696
run: |
9797
mkdir dist
9898
cp target/${{ matrix.config.target }}/release/postgrestools ./dist/postgrestools_${{ matrix.config.target }}

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

+153-16
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ impl Document {
140140
let mut start = change_range.start();
141141
let mut end = change_range.end().min(content_size);
142142

143+
let is_trim = change_range.start() >= content_size;
144+
143145
let mut affected_indices = Vec::new();
144146
let mut prev_index = None;
145147
let mut next_index = None;
@@ -157,23 +159,20 @@ impl Document {
157159
}
158160
}
159161

160-
let start_incl = prev_index
162+
let first_affected_stmt_start = prev_index
161163
.map(|i| self.positions[i].1.start())
162164
.unwrap_or(start);
163-
let end_incl = next_index
165+
166+
let mut last_affected_stmt_end = next_index
164167
.map(|i| self.positions[i].1.end())
165168
.unwrap_or_else(|| end);
166169

167-
let end_incl = if is_addition {
168-
end_incl.add(diff_size)
169-
} else {
170-
end_incl.sub(diff_size)
171-
};
172-
173-
let end = if is_addition {
174-
end.add(diff_size)
175-
} else {
176-
end.sub(diff_size)
170+
if is_addition {
171+
end = end.add(diff_size);
172+
last_affected_stmt_end = last_affected_stmt_end.add(diff_size);
173+
} else if !is_trim {
174+
end = end.sub(diff_size);
175+
last_affected_stmt_end = last_affected_stmt_end.sub(diff_size)
177176
};
178177

179178
Affected {
@@ -185,8 +184,10 @@ impl Document {
185184
prev_index,
186185
next_index,
187186
full_affected_range: TextRange::new(
188-
start_incl,
189-
end_incl.min(content_size).max(start_incl),
187+
first_affected_stmt_start,
188+
last_affected_stmt_end
189+
.min(content_size)
190+
.max(first_affected_stmt_start),
190191
),
191192
}
192193
}
@@ -221,6 +222,7 @@ impl Document {
221222
let mut changed: Vec<StatementChange> = Vec::with_capacity(self.positions.len());
222223

223224
let change_range = change.range.unwrap();
225+
let previous_content = self.content.clone();
224226
let new_content = change.apply_to_text(&self.content);
225227

226228
// we first need to determine the affected range and all affected statements, as well as
@@ -261,15 +263,15 @@ impl Document {
261263
let new_range = new_ranges[0].add(affected_range.start());
262264
let (old_id, old_range) = self.positions[affected_idx].clone();
263265

264-
// move all statements after the afffected range
266+
// move all statements after the affected range
265267
self.move_ranges(old_range.end(), change.diff_size(), change.is_addition());
266268

267269
let new_id = self.id_generator.next();
268270
self.positions[affected_idx] = (new_id.clone(), new_range);
269271

270272
changed.push(StatementChange::Modified(ModifiedStatement {
271273
old_stmt: old_id.clone(),
272-
old_stmt_text: self.content[old_range].to_string(),
274+
old_stmt_text: previous_content[old_range].to_string(),
273275

274276
new_stmt: new_id,
275277
new_stmt_text: changed_content[new_ranges[0]].to_string(),
@@ -1285,4 +1287,139 @@ mod tests {
12851287

12861288
assert_document_integrity(&d);
12871289
}
1290+
1291+
#[test]
1292+
fn remove_trailing_whitespace() {
1293+
let path = PgTPath::new("test.sql");
1294+
1295+
let mut doc = Document::new(path.clone(), "select * from ".to_string(), 0);
1296+
1297+
let change = ChangeFileParams {
1298+
path: path.clone(),
1299+
version: 1,
1300+
changes: vec![ChangeParams {
1301+
text: "".to_string(),
1302+
range: Some(TextRange::new(13.into(), 14.into())),
1303+
}],
1304+
};
1305+
1306+
let changed = doc.apply_file_change(&change);
1307+
1308+
assert_eq!(doc.content, "select * from");
1309+
1310+
assert_eq!(changed.len(), 1);
1311+
1312+
match &changed[0] {
1313+
StatementChange::Modified(stmt) => {
1314+
let ModifiedStatement {
1315+
change_range,
1316+
change_text,
1317+
new_stmt_text,
1318+
old_stmt_text,
1319+
..
1320+
} = stmt;
1321+
1322+
assert_eq!(change_range, &TextRange::new(13.into(), 14.into()));
1323+
assert_eq!(change_text, "");
1324+
assert_eq!(new_stmt_text, "select * from");
1325+
1326+
// the whitespace was not considered
1327+
// to be a part of the statement
1328+
assert_eq!(old_stmt_text, "select * from");
1329+
}
1330+
1331+
_ => assert!(false, "Did not yield a modified statement."),
1332+
}
1333+
1334+
assert_document_integrity(&doc);
1335+
}
1336+
1337+
#[test]
1338+
fn remove_trailing_whitespace_and_last_char() {
1339+
let path = PgTPath::new("test.sql");
1340+
1341+
let mut doc = Document::new(path.clone(), "select * from ".to_string(), 0);
1342+
1343+
let change = ChangeFileParams {
1344+
path: path.clone(),
1345+
version: 1,
1346+
changes: vec![ChangeParams {
1347+
text: "".to_string(),
1348+
range: Some(TextRange::new(12.into(), 14.into())),
1349+
}],
1350+
};
1351+
1352+
let changed = doc.apply_file_change(&change);
1353+
1354+
assert_eq!(doc.content, "select * fro");
1355+
1356+
assert_eq!(changed.len(), 1);
1357+
1358+
match &changed[0] {
1359+
StatementChange::Modified(stmt) => {
1360+
let ModifiedStatement {
1361+
change_range,
1362+
change_text,
1363+
new_stmt_text,
1364+
old_stmt_text,
1365+
..
1366+
} = stmt;
1367+
1368+
assert_eq!(change_range, &TextRange::new(12.into(), 14.into()));
1369+
assert_eq!(change_text, "");
1370+
assert_eq!(new_stmt_text, "select * fro");
1371+
1372+
// the whitespace was not considered
1373+
// to be a part of the statement
1374+
assert_eq!(old_stmt_text, "select * from");
1375+
}
1376+
1377+
_ => assert!(false, "Did not yield a modified statement."),
1378+
}
1379+
1380+
assert_document_integrity(&doc);
1381+
}
1382+
1383+
#[test]
1384+
fn remove_inbetween_whitespace() {
1385+
let path = PgTPath::new("test.sql");
1386+
1387+
let mut doc = Document::new(path.clone(), "select * from users".to_string(), 0);
1388+
1389+
let change = ChangeFileParams {
1390+
path: path.clone(),
1391+
version: 1,
1392+
changes: vec![ChangeParams {
1393+
text: "".to_string(),
1394+
range: Some(TextRange::new(9.into(), 11.into())),
1395+
}],
1396+
};
1397+
1398+
let changed = doc.apply_file_change(&change);
1399+
1400+
assert_eq!(doc.content, "select * from users");
1401+
1402+
assert_eq!(changed.len(), 1);
1403+
1404+
match &changed[0] {
1405+
StatementChange::Modified(stmt) => {
1406+
let ModifiedStatement {
1407+
change_range,
1408+
change_text,
1409+
new_stmt_text,
1410+
old_stmt_text,
1411+
..
1412+
} = stmt;
1413+
1414+
assert_eq!(change_range, &TextRange::new(9.into(), 11.into()));
1415+
assert_eq!(change_text, "");
1416+
assert_eq!(old_stmt_text, "select * from users");
1417+
assert_eq!(new_stmt_text, "select * from users");
1418+
}
1419+
1420+
_ => assert!(false, "Did not yield a modified statement."),
1421+
}
1422+
1423+
assert_document_integrity(&doc);
1424+
}
12881425
}

0 commit comments

Comments
 (0)