Skip to content

Commit bf0cdb1

Browse files
committed
progress
1 parent c23a635 commit bf0cdb1

File tree

7 files changed

+72
-19
lines changed

7 files changed

+72
-19
lines changed

crates/pgt_pretty_print/src/nodes/boolean.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use crate::{
77

88
pub(super) fn emit_boolean(e: &mut EventEmitter, n: &Boolean) {
99
e.group_start(GroupKind::Boolean);
10-
// todo: user needs to be able to configure the case of boolean literals
11-
let val_str = if n.boolval { "TRUE" } else { "FALSE" };
12-
e.token(TokenKind::IDENT(val_str.to_string()));
10+
e.token(TokenKind::BOOLEAN(n.boolval));
1311
e.group_end();
1412
}

crates/pgt_pretty_print/src/nodes/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
macro_rules! assert_node_variant {
2+
($variant:ident, $expr:expr) => {
3+
match $expr.node.as_ref() {
4+
Some(pgt_query::NodeEnum::$variant(inner)) => inner,
5+
other => panic!("Expected {}, got {:?}", stringify!($variant), other),
6+
}
7+
};
8+
}
9+
110
mod a_const;
211
mod a_expr;
312
mod a_star;
@@ -26,7 +35,7 @@ use integer::emit_integer;
2635
use range_var::emit_range_var;
2736
use res_target::emit_res_target;
2837
use select_stmt::emit_select_stmt;
29-
use string::{emit_string, emit_string_identifier, emit_string_literal};
38+
use string::{emit_identifier, emit_string, emit_string_identifier, emit_string_literal};
3039
use update_stmt::emit_update_stmt;
3140

3241
use crate::emitter::EventEmitter;

crates/pgt_pretty_print/src/nodes/node_list.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ use pgt_query::Node;
33
use crate::TokenKind;
44
use crate::emitter::{EventEmitter, LineType};
55

6-
pub(super) fn emit_comma_separated_list(e: &mut EventEmitter, nodes: &[Node]) {
6+
pub(super) fn emit_comma_separated_list<F>(e: &mut EventEmitter, nodes: &[Node], render: F)
7+
where
8+
F: Fn(&Node, &mut EventEmitter),
9+
{
710
for (i, n) in nodes.iter().enumerate() {
811
if i > 0 {
912
e.token(TokenKind::COMMA);
1013
e.line(LineType::SoftOrSpace);
1114
}
12-
super::emit_node(n, e);
15+
render(n, e);
1316
}
1417
}
1518

crates/pgt_pretty_print/src/nodes/res_target.rs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,62 @@ use pgt_query::protobuf::ResTarget;
33
use crate::TokenKind;
44
use crate::emitter::{EventEmitter, GroupKind};
55

6+
use super::emit_identifier;
67
use super::emit_node;
78

89
pub(super) fn emit_res_target(e: &mut EventEmitter, n: &ResTarget) {
910
e.group_start(GroupKind::ResTarget);
1011

12+
if let Some(ref val) = n.val {
13+
emit_node(val, e);
14+
} else {
15+
return;
16+
}
17+
18+
emit_column_name_with_indirection(e, n);
19+
1120
if !n.name.is_empty() {
12-
e.token(TokenKind::IDENT(n.name.clone()));
13-
for i in &n.indirection {
14-
if !matches!(i.node, Some(pgt_query::protobuf::node::Node::AIndices(_))) {
15-
e.token(TokenKind::DOT);
16-
}
17-
emit_node(i, e);
18-
}
1921
e.space();
20-
e.token(TokenKind::IDENT("=".to_string()));
22+
e.token(TokenKind::AS_KW);
2123
e.space();
24+
emit_identifier(e, &n.name);
25+
}
26+
27+
e.group_end();
28+
}
29+
30+
pub(super) fn emit_set_clause(e: &mut EventEmitter, n: &ResTarget) {
31+
e.group_start(GroupKind::ResTarget);
32+
33+
if n.name.is_empty() {
34+
return;
2235
}
36+
37+
emit_column_name_with_indirection(e, n);
38+
2339
if let Some(ref val) = n.val {
40+
e.space();
41+
e.token(TokenKind::IDENT("=".to_string()));
42+
e.space();
2443
emit_node(val, e);
2544
}
2645

2746
e.group_end();
2847
}
48+
49+
pub(super) fn emit_column_name_with_indirection(e: &mut EventEmitter, n: &ResTarget) {
50+
if n.name.is_empty() {
51+
return;
52+
}
53+
54+
e.token(TokenKind::IDENT(n.name.clone()));
55+
56+
for i in &n.indirection {
57+
match &i.node {
58+
// Field selection
59+
Some(pgt_query::NodeEnum::String(n)) => super::emit_string_identifier(e, n),
60+
Some(n) => super::emit_node_enum(n, e),
61+
None => {}
62+
}
63+
}
64+
}

crates/pgt_pretty_print/src/nodes/select_stmt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub(super) fn emit_select_stmt(e: &mut EventEmitter, n: &SelectStmt) {
1414
e.indent_start();
1515
e.line(LineType::SoftOrSpace);
1616

17-
emit_comma_separated_list(e, &n.target_list);
17+
emit_comma_separated_list(e, &n.target_list, super::emit_node);
1818

1919
e.indent_end();
2020
}
@@ -26,7 +26,7 @@ pub(super) fn emit_select_stmt(e: &mut EventEmitter, n: &SelectStmt) {
2626

2727
e.indent_start();
2828

29-
emit_comma_separated_list(e, &n.from_clause);
29+
emit_comma_separated_list(e, &n.from_clause, super::emit_node);
3030

3131
e.indent_end();
3232
}

crates/pgt_pretty_print/src/nodes/string.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ pub(super) fn emit_string_literal(e: &mut EventEmitter, n: &String) {
1919

2020
pub(super) fn emit_string_identifier(e: &mut EventEmitter, n: &String) {
2121
e.group_start(GroupKind::String);
22-
e.token(TokenKind::IDENT(format!("\"{}\"", n.sval.clone())));
22+
emit_identifier(e, &n.sval);
2323
e.group_end();
2424
}
25+
26+
pub(super) fn emit_identifier(e: &mut EventEmitter, n: &str) {
27+
e.token(TokenKind::IDENT(format!("\"{}\"", n)));
28+
}

crates/pgt_pretty_print/src/nodes/update_stmt.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use pgt_query::protobuf::UpdateStmt;
1+
use pgt_query::protobuf::{ResTarget, UpdateStmt};
22

33
use crate::TokenKind;
44
use crate::emitter::{EventEmitter, GroupKind};
5+
use crate::nodes::res_target::emit_set_clause;
56

67
use super::emit_node;
78
use super::node_list::emit_comma_separated_list;
@@ -20,7 +21,9 @@ pub(super) fn emit_update_stmt(e: &mut EventEmitter, n: &UpdateStmt) {
2021
e.space();
2122
e.token(TokenKind::SET_KW);
2223
e.space();
23-
emit_comma_separated_list(e, &n.target_list);
24+
emit_comma_separated_list(e, &n.target_list, |n, e| {
25+
emit_set_clause(e, assert_node_variant!(ResTarget, n))
26+
});
2427
}
2528

2629
if let Some(ref where_clause) = n.where_clause {

0 commit comments

Comments
 (0)