diff --git a/cmd/tools/vast/vast.v b/cmd/tools/vast/vast.v index 8d03e49963f6e9..f349d69f92575c 100644 --- a/cmd/tools/vast/vast.v +++ b/cmd/tools/vast/vast.v @@ -1823,6 +1823,8 @@ fn (t Tree) sql_stmt_line(node ast.SqlStmtLine) &Node { obj.add_terse('updated_columns', t.array_node_string(node.updated_columns)) obj.add_terse('update_exprs', t.array_node_expr(node.update_exprs)) obj.add('pos', t.pos(node.pos)) + obj.add('pre_comments', t.array_node_comment(node.pre_comments)) + obj.add('end_comments', t.array_node_comment(node.end_comments)) sub_struct_map := new_object() for key, val in node.sub_structs { diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 03e94d1ca37878..cb7c6b1d3336ef 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -2082,6 +2082,8 @@ pub mut: sub_structs map[int]SqlStmtLine where_expr Expr update_exprs []Expr // for `update` + pre_comments []Comment + end_comments []Comment } pub struct SqlExpr { diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index b81aaf6f13e976..47a9921533ad85 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1612,7 +1612,9 @@ pub fn (mut f Fmt) sql_stmt(node ast.SqlStmt) { f.writeln(' {') for line in node.lines { + f.comments(line.pre_comments, level: .indent) f.sql_stmt_line(line) + f.comments(line.end_comments, level: .indent) } f.write('}') f.or_expr(node.or_expr) diff --git a/vlib/v/fmt/tests/sqlstmt_comments_keep.vv b/vlib/v/fmt/tests/sqlstmt_comments_keep.vv new file mode 100644 index 00000000000000..9825ad05194de6 --- /dev/null +++ b/vlib/v/fmt/tests/sqlstmt_comments_keep.vv @@ -0,0 +1,22 @@ +import db.sqlite + +fn main() { + dblite := sqlite.connect(':memory:')! + sql dblite { + // some comment + insert address into Address + // some comment2 + }! + + sql dblite { + // some comment + drop table Address + // some comment2 + }! + + sql dblite { + // some comment + create table Address + // some comment2 + }! +} diff --git a/vlib/v/parser/orm.v b/vlib/v/parser/orm.v index 4f26b5ebb37a7c..e4d9ff7fd17381 100644 --- a/vlib/v/parser/orm.v +++ b/vlib/v/parser/orm.v @@ -199,6 +199,7 @@ fn (mut p Parser) parse_sql_or_block() ast.OrExpr { } fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { + pre_comments := p.eat_comments() mut n := p.check_name() // insert pos := p.tok.pos() mut kind := ast.SqlStmtKind.insert @@ -215,6 +216,7 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { } typ := p.parse_type() typ_pos := p.tok.pos() + end_comments := p.eat_comments() return ast.SqlStmtLine{ kind: kind pos: pos.extend(p.prev_tok.pos()) @@ -224,6 +226,8 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { } scope: p.scope is_generated: false + pre_comments: pre_comments + end_comments: end_comments } } else if n == 'drop' { kind = .drop @@ -234,6 +238,7 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { } typ := p.parse_type() typ_pos := p.tok.pos() + end_comments := p.eat_comments() return ast.SqlStmtLine{ kind: kind pos: pos.extend(p.prev_tok.pos()) @@ -243,6 +248,8 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { } is_generated: false scope: p.scope + pre_comments: pre_comments + end_comments: end_comments } } mut inserted_var := '' @@ -313,6 +320,7 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { return ast.SqlStmtLine{} } } + end_comments := p.eat_comments() return ast.SqlStmtLine{ table_expr: ast.TypeNode{ typ: table_type @@ -326,6 +334,8 @@ fn (mut p Parser) parse_sql_stmt_line() ast.SqlStmtLine { where_expr: where_expr is_generated: false scope: p.scope + pre_comments: pre_comments + end_comments: end_comments } }