From 7bfd29c887ea66ee063f397c7dab3a70edf98219 Mon Sep 17 00:00:00 2001 From: Merlin Ran Date: Fri, 28 Nov 2025 19:12:02 -0500 Subject: [PATCH 1/3] fix: escape double quotes if they appear in constant str --- internal/printer/printer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/printer/printer.go b/internal/printer/printer.go index 0660c6a..eca3080 100644 --- a/internal/printer/printer.go +++ b/internal/printer/printer.go @@ -282,7 +282,7 @@ func (w *writer) printConstant(c *ast.Constant, indent int32) { str = `"""` } w.print(str) - w.print(n.Str) + w.print(strings.ReplaceAll(n.Str, `"`, `\"`)) w.print(str) default: From 0eafb3297b6aaed8c60534937e2759e7d6f72fc0 Mon Sep 17 00:00:00 2001 From: Merlin Ran Date: Fri, 28 Nov 2025 20:30:52 -0500 Subject: [PATCH 2/3] more fixes to docstring and comments in general --- internal/printer/printer.go | 57 ++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/internal/printer/printer.go b/internal/printer/printer.go index eca3080..c5f2c4e 100644 --- a/internal/printer/printer.go +++ b/internal/printer/printer.go @@ -37,6 +37,22 @@ func (w *writer) printIndent(indent int32) { } } +func (w *writer) printCommentText(text string, indent int32) { + lines := strings.Split(text, "\n") + for _, line := range lines { + w.print("#") + // trim right space which is usually unintended, + // but leave left space untouched in case if it's intentionally formatted. + trimmed := strings.TrimRight(line, " ") + if trimmed != "" { + w.print(" ") + w.print(trimmed) + } + w.print("\n") + w.printIndent(indent) + } +} + func (w *writer) printNode(node *ast.Node, indent int32) { switch n := node.Node.(type) { @@ -132,10 +148,7 @@ func (w *writer) printNode(node *ast.Node, indent int32) { func (w *writer) printAnnAssign(aa *ast.AnnAssign, indent int32) { if aa.Comment != "" { - w.print("# ") - w.print(aa.Comment) - w.print("\n") - w.printIndent(indent) + w.printCommentText(aa.Comment, indent) } w.printName(aa.Target, indent) w.print(": ") @@ -255,10 +268,7 @@ func (w *writer) printClassDef(cd *ast.ClassDef, indent int32) { if i == 0 { if e, ok := node.Node.(*ast.Node_Expr); ok { if c, ok := e.Expr.Value.Node.(*ast.Node_Constant); ok { - w.print(`""`) - w.printConstant(c.Constant, indent) - w.print(`""`) - w.print("\n") + w.printDocString(c.Constant, indent) continue } } @@ -268,6 +278,33 @@ func (w *writer) printClassDef(cd *ast.ClassDef, indent int32) { } } +func (w *writer) printDocString(c *ast.Constant, indent int32) { + switch n := c.Value.(type) { + case *ast.Constant_Str: + w.print(`"""`) + lines := strings.Split(n.Str, "\n") + printedN := 0 + for n, line := range lines { + // trim right space which is usually unintended, + // but leave left space untouched in case if it's intentionally formatted. + trimmed := strings.TrimRight(line, " ") + if trimmed == "" { + continue + } + if printedN > 0 && n < len(lines)-1 { + w.print("\n") + w.printIndent(indent) + } + w.print(strings.ReplaceAll(trimmed, `"`, `\"`)) + printedN++ + } + w.print(`"""`) + w.print("\n") + default: + panic(n) + } +} + func (w *writer) printConstant(c *ast.Constant, indent int32) { switch n := c.Value.(type) { case *ast.Constant_Int: @@ -291,9 +328,7 @@ func (w *writer) printConstant(c *ast.Constant, indent int32) { } func (w *writer) printComment(c *ast.Comment, indent int32) { - w.print("# ") - w.print(c.Text) - w.print("\n") + w.printCommentText(c.Text, 0) } func (w *writer) printCompare(c *ast.Compare, indent int32) { From da71e49d8d2d865a384749fef28fcb53bef41c95 Mon Sep 17 00:00:00 2001 From: Merlin Ran Date: Fri, 28 Nov 2025 20:52:50 -0500 Subject: [PATCH 3/3] add more python keywords --- .../sqlc.yaml | 2 +- .../testdata/emit_pydantic_models/sqlc.yaml | 2 +- .../sqlc.yaml | 2 +- .../endtoend/testdata/emit_str_enum/sqlc.yaml | 2 +- .../testdata/emit_type_overrides/sqlc.yaml | 2 +- .../endtoend/testdata/exec_result/sqlc.yaml | 2 +- .../endtoend/testdata/exec_rows/sqlc.yaml | 2 +- .../inflection_exclude_table_names/sqlc.yaml | 2 +- .../query_parameter_limit_two/sqlc.yaml | 2 +- .../query_parameter_limit_undefined/sqlc.yaml | 2 +- .../query_parameter_limit_zero/sqlc.yaml | 2 +- .../query_parameter_no_limit/sqlc.yaml | 2 +- internal/poet/reserved.go | 34 +++++++++++++------ 13 files changed, 35 insertions(+), 23 deletions(-) diff --git a/internal/endtoend/testdata/dataclasses_with_reserved_keywords/sqlc.yaml b/internal/endtoend/testdata/dataclasses_with_reserved_keywords/sqlc.yaml index 00b04dd..cde7ecf 100644 --- a/internal/endtoend/testdata/dataclasses_with_reserved_keywords/sqlc.yaml +++ b/internal/endtoend/testdata/dataclasses_with_reserved_keywords/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/emit_pydantic_models/sqlc.yaml b/internal/endtoend/testdata/emit_pydantic_models/sqlc.yaml index 443e70c..4f2c5ac 100644 --- a/internal/endtoend/testdata/emit_pydantic_models/sqlc.yaml +++ b/internal/endtoend/testdata/emit_pydantic_models/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/emit_pydantic_models_with_reserved_keywords/sqlc.yaml b/internal/endtoend/testdata/emit_pydantic_models_with_reserved_keywords/sqlc.yaml index 443e70c..4f2c5ac 100644 --- a/internal/endtoend/testdata/emit_pydantic_models_with_reserved_keywords/sqlc.yaml +++ b/internal/endtoend/testdata/emit_pydantic_models_with_reserved_keywords/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/emit_str_enum/sqlc.yaml b/internal/endtoend/testdata/emit_str_enum/sqlc.yaml index a2c1205..6abf32c 100644 --- a/internal/endtoend/testdata/emit_str_enum/sqlc.yaml +++ b/internal/endtoend/testdata/emit_str_enum/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/emit_type_overrides/sqlc.yaml b/internal/endtoend/testdata/emit_type_overrides/sqlc.yaml index 8d4a71d..2e4d0eb 100644 --- a/internal/endtoend/testdata/emit_type_overrides/sqlc.yaml +++ b/internal/endtoend/testdata/emit_type_overrides/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/exec_result/sqlc.yaml b/internal/endtoend/testdata/exec_result/sqlc.yaml index 91f8683..e30e2ba 100644 --- a/internal/endtoend/testdata/exec_result/sqlc.yaml +++ b/internal/endtoend/testdata/exec_result/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/exec_rows/sqlc.yaml b/internal/endtoend/testdata/exec_rows/sqlc.yaml index 91f8683..e30e2ba 100644 --- a/internal/endtoend/testdata/exec_rows/sqlc.yaml +++ b/internal/endtoend/testdata/exec_rows/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/inflection_exclude_table_names/sqlc.yaml b/internal/endtoend/testdata/inflection_exclude_table_names/sqlc.yaml index c88e1bc..bdca6e1 100644 --- a/internal/endtoend/testdata/inflection_exclude_table_names/sqlc.yaml +++ b/internal/endtoend/testdata/inflection_exclude_table_names/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/query_parameter_limit_two/sqlc.yaml b/internal/endtoend/testdata/query_parameter_limit_two/sqlc.yaml index c567982..5f31358 100644 --- a/internal/endtoend/testdata/query_parameter_limit_two/sqlc.yaml +++ b/internal/endtoend/testdata/query_parameter_limit_two/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/query_parameter_limit_undefined/sqlc.yaml b/internal/endtoend/testdata/query_parameter_limit_undefined/sqlc.yaml index 94d6928..b7b76d5 100644 --- a/internal/endtoend/testdata/query_parameter_limit_undefined/sqlc.yaml +++ b/internal/endtoend/testdata/query_parameter_limit_undefined/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/query_parameter_limit_zero/sqlc.yaml b/internal/endtoend/testdata/query_parameter_limit_zero/sqlc.yaml index cacf527..58ceeb0 100644 --- a/internal/endtoend/testdata/query_parameter_limit_zero/sqlc.yaml +++ b/internal/endtoend/testdata/query_parameter_limit_zero/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/endtoend/testdata/query_parameter_no_limit/sqlc.yaml b/internal/endtoend/testdata/query_parameter_no_limit/sqlc.yaml index cc1124c..14fe66c 100644 --- a/internal/endtoend/testdata/query_parameter_no_limit/sqlc.yaml +++ b/internal/endtoend/testdata/query_parameter_no_limit/sqlc.yaml @@ -3,7 +3,7 @@ plugins: - name: py wasm: url: file://../../../../bin/sqlc-gen-python.wasm - sha256: "e212bfb4896bcc02d4b4b48085e2171c91f395f1866254750560e7db23f712be" + sha256: "d575f13bc504e0ea5eae11c081add2b9c74bf723f518f4508638603461edc8ec" sql: - schema: schema.sql queries: query.sql diff --git a/internal/poet/reserved.go b/internal/poet/reserved.go index d9d3198..6077ae6 100644 --- a/internal/poet/reserved.go +++ b/internal/poet/reserved.go @@ -4,25 +4,37 @@ import "slices" // TODO(quentin@escape.tech): check if this is complete var reservedKeywords = []string{ - "class", - "if", - "else", - "elif", - "not", - "for", "and", - "in", - "is", - "or", - "with", "as", "assert", + "async", + "await", "break", + "class", + "continue", + "def", + "del", + "elif", + "else", "except", "finally", - "try", + "for", + "from", + "global", + "if", + "import", + "in", + "is", + "lambda", + "nonlocal", + "not", + "or", + "pass", "raise", "return", + "try", + "while", + "with", "yield", }