Skip to content

Commit 4583e45

Browse files
committed
Pass source token when formatting identifiers
1 parent ce0b624 commit 4583e45

7 files changed

Lines changed: 31 additions & 19 deletions

File tree

docs/lib/src/generated_snippets.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const generatedSnippets = {
3131
'lib/src/snippets/drift_files/nested.expr.temp.dart.snippet.json': {'(full)': '<span></span>\n',},
3232
'lib/src/snippets/drift_files/small_snippets.drift.snippet.json': {'(full)': '<span><span class="keyword">import</span> <span class="string">\'tables.drift\'</span>; <span class="comment">-- single quotes are required for imports</span>\n\n<span class="function declaration">myQuery</span>(<span class="variable">:variable</span> <span class="keyword">AS</span> TEXT): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;\n<span class="function declaration">myNullableQuery</span>(<span class="variable">:variable</span> <span class="keyword">AS</span> TEXT <span class="keyword">OR</span> <span class="keyword">NULL</span>): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;\n<span class="function declaration">myRequiredQuery</span>(<span class="keyword">REQUIRED</span> <span class="variable">:variable</span> <span class="keyword">AS</span> TEXT <span class="keyword">OR</span> <span class="keyword">NULL</span>): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;\n<span class="function declaration">entriesWithId</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> <span class="property">id</span> <span class="keyword">IN</span> <span class="variable">?</span>;\n<span class="function declaration">_filterTodos</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> \$predicate;</span>\n','import': '<span><span class="keyword">import</span> <span class="string">\'tables.drift\'</span>; <span class="comment">-- single quotes are required for imports</span></span>\n','q1': '<span><span class="function declaration">myQuery</span>(<span class="variable">:variable</span> <span class="keyword">AS</span> TEXT): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;</span>\n','q2': '<span><span class="function declaration">myNullableQuery</span>(<span class="variable">:variable</span> <span class="keyword">AS</span> TEXT <span class="keyword">OR</span> <span class="keyword">NULL</span>): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;</span>\n','q3': '<span><span class="function declaration">myRequiredQuery</span>(<span class="keyword">REQUIRED</span> <span class="variable">:variable</span> <span class="keyword">AS</span> TEXT <span class="keyword">OR</span> <span class="keyword">NULL</span>): <span class="keyword">SELECT</span> <span class="variable">:variable</span>;</span>\n','entries': '<span><span class="function declaration">entriesWithId</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> <span class="property">id</span> <span class="keyword">IN</span> <span class="variable">?</span>;</span>\n','filter': '<span><span class="function declaration">_filterTodos</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> \$predicate;</span>\n',},
3333
'lib/src/snippets/drift_files/small_snippets.expr.temp.dart.snippet.json': {'(full)': '<span></span>\n',},
34-
'lib/src/snippets/drift_files/tables.drift.snippet.json': {'(full)': '<span><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> <span class="class declaration">todos</span> (\n <span class="property">id</span> <span class="type">INT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> <span class="keyword">AUTOINCREMENT</span>,\n <span class="property">title</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>,\n <span class="property">content</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>,\n <span class="property">category</span> <span class="type">INTEGER</span> <span class="keyword">REFERENCES</span> <span class="class">categories</span>(<span class="property">id</span>)\n);\n\n<span class="keyword">CREATE</span> <span class="keyword">TABLE</span> <span class="class declaration">categories</span> (\n <span class="property">id</span> <span class="type">INT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> <span class="keyword">AUTOINCREMENT</span>,\n <span class="property">description</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>\n) <span class="keyword">AS</span> Category; <span class="comment">-- the AS xyz after the table defines the data class name</span>\n\n<span class="comment">-- You can also create an index or triggers with drift files</span>\n<span class="keyword">CREATE</span> <span class="keyword">INDEX</span> categories_description <span class="keyword">ON</span> categories(<span class="property">description</span>);\n\n<span class="comment">-- we can put named SQL queries in here as well:</span>\n<span class="function declaration">createEntry</span>: <span class="keyword">INSERT</span> <span class="keyword">INTO</span> <span class="class">todos</span> (<span class="property">title</span>, <span class="property">content</span>) <span class="keyword">VALUES</span> (<span class="variable">:title</span>, <span class="variable">:content</span>);\n<span class="function declaration">deleteById</span>: <span class="keyword">DELETE</span> <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> <span class="property">id</span> = <span class="variable">:id</span>;\n<span class="function declaration">allTodos</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span>;</span>\n',},
34+
'lib/src/snippets/drift_files/tables.drift.snippet.json': {'(full)': '<span><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> <span class="class declaration">todos</span> (\n <span class="property">id</span> <span class="type">INT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> <span class="keyword">AUTOINCREMENT</span>,\n <span class="property">title</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>,\n <span class="property">content</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>,\n <span class="property">category</span> <span class="type">INTEGER</span> <span class="keyword">REFERENCES</span> <span class="class">categories</span>(<span class="property">id</span>)\n);\n\n<span class="keyword">CREATE</span> <span class="keyword">TABLE</span> <span class="class declaration">categories</span> (\n <span class="property">id</span> <span class="type">INT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> <span class="keyword">AUTOINCREMENT</span>,\n <span class="property">description</span> <span class="type">TEXT</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>\n) <span class="keyword">AS</span> Category; <span class="comment">-- the AS xyz after the table defines the data class name</span>\n\n<span class="comment">-- You can also create an index or triggers with drift files</span>\n<span class="keyword">CREATE</span> <span class="keyword">INDEX</span> categories_description <span class="keyword">ON</span> <span class="class">categories</span>(<span class="property">description</span>);\n\n<span class="comment">-- we can put named SQL queries in here as well:</span>\n<span class="function declaration">createEntry</span>: <span class="keyword">INSERT</span> <span class="keyword">INTO</span> <span class="class">todos</span> (<span class="property">title</span>, <span class="property">content</span>) <span class="keyword">VALUES</span> (<span class="variable">:title</span>, <span class="variable">:content</span>);\n<span class="function declaration">deleteById</span>: <span class="keyword">DELETE</span> <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> <span class="property">id</span> = <span class="variable">:id</span>;\n<span class="function declaration">allTodos</span>: <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span>;</span>\n',},
3535
'lib/src/snippets/drift_files/tables.expr.temp.dart.snippet.json': {'(full)': '<span></span>\n',},
3636
'lib/src/snippets/drift_files/tables_comments.drift.snippet.json': {'(full)': '<span><span class="comment">--</span> <span class="keyword">import</span> <span class="string">\'tables.drift\'</span>;\n\n<span class="comment">-- we can put named SQL queries in here as well:</span>\n<span class="comment">--</span> <span class="function declaration">createEntry</span>:\n<span class="keyword">INSERT</span> <span class="keyword">INTO</span> <span class="class">todos</span> (<span class="property">title</span>, <span class="property">content</span>) <span class="keyword">VALUES</span> (<span class="variable">:title</span>, <span class="variable">:content</span>);\n\n<span class="comment">--</span> <span class="function declaration">deleteById</span>:\n<span class="keyword">DELETE</span> <span class="keyword">FROM</span> <span class="class">todos</span> <span class="keyword">WHERE</span> <span class="property">id</span> = <span class="variable">:id</span>;\n\n<span class="comment">--</span> <span class="function declaration">allTodos</span>:\n<span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="class">todos</span>;</span>\n',},
3737
'lib/src/snippets/drift_files/tables_comments.expr.temp.dart.snippet.json': {'(full)': '<span></span>\n',},

drift_dev/lib/src/writer/queries/sql_writer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extension ToSqlText on AstNode {
3535
}
3636
}
3737

38-
class SqlWriter extends NodeSqlBuilder {
38+
final class SqlWriter extends NodeSqlBuilder {
3939
final StringBuffer _out;
4040
final SqlQuery? query;
4141
final DriftOptions options;

sqlparser/lib/src/ast/common/queryables.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class TableReference extends TableOrSubquery
2323
with ReferenceOwner
2424
implements Renamable, ResolvesToResultSet, InExpressionTarget {
2525
final String? schemaName;
26-
Token? schemaNameToken;
26+
IdentifierToken? schemaNameToken;
2727
final String tableName;
28-
Token? tableNameToken;
28+
IdentifierToken? tableNameToken;
2929

3030
@override
3131
AliasClause? as;
@@ -210,7 +210,7 @@ class TableValuedFunction extends Queryable
210210
final String name;
211211

212212
@override
213-
Token? schemaNameToken;
213+
IdentifierToken? schemaNameToken;
214214

215215
@override
216216
Token? nameToken;

sqlparser/lib/src/ast/expressions/aggregate.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class AggregateFunctionInvocation extends Expression
1010
String get name => function.identifier;
1111

1212
@override
13-
Token? schemaNameToken;
13+
IdentifierToken? schemaNameToken;
1414

1515
@override
1616
Token? nameToken;

sqlparser/lib/src/ast/expressions/function.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ abstract class SqlInvocation implements AstNode {
1313
/// The name of the function being called
1414
String get name;
1515

16-
Token? schemaNameToken;
16+
IdentifierToken? schemaNameToken;
1717
Token? nameToken;
1818

1919
FunctionParameters get parameters;
@@ -41,7 +41,7 @@ class FunctionExpression extends Expression
4141
FunctionParameters parameters;
4242

4343
@override
44-
Token? schemaNameToken;
44+
IdentifierToken? schemaNameToken;
4545
@override
4646
Token? nameToken;
4747

sqlparser/lib/src/reader/parser.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3182,7 +3182,7 @@ final class _ExpressionParser extends ParserState {
31823182
}
31833183

31843184
AggregateFunctionInvocation _aggregate(
3185-
Token? schemaName,
3185+
IdentifierToken? schemaName,
31863186
IdentifierToken name,
31873187
FunctionParameters params,
31883188
OrderByBase? orderBy,

sqlparser/lib/utils/node_to_text.dart

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ library;
66
import 'package:charcode/charcode.dart';
77
import 'package:sqlparser/sqlparser.dart';
88

9-
class NodeSqlBuilder extends AstVisitor<void, void> {
9+
base class NodeSqlBuilder extends AstVisitor<void, void> {
1010
final StringSink buffer;
1111

1212
/// Whether we need to insert a space before writing the next identifier.
@@ -822,7 +822,8 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
822822
@override
823823
void visitFunction(FunctionExpression e, void arg) {
824824
if (e.schemaName != null) {
825-
identifier(e.schemaName!, spaceAfter: false);
825+
identifier(e.schemaName!,
826+
fromToken: e.schemaNameToken, spaceAfter: false);
826827
symbol('.');
827828
}
828829
identifier(e.name);
@@ -1080,25 +1081,30 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
10801081
var didWriteSpaceBefore = false;
10811082

10821083
if (e.schemaName != null) {
1083-
identifier(e.schemaName!, spaceAfter: false);
1084+
identifier(e.schemaName!,
1085+
fromToken: e.schemaNameToken, spaceAfter: false);
10841086
symbol('.');
10851087
didWriteSpaceBefore = true;
10861088
}
10871089
if (e.entityName != null) {
10881090
identifier(e.entityName!,
1089-
spaceAfter: false, spaceBefore: !didWriteSpaceBefore);
1091+
spaceAfter: false,
1092+
fromToken: e.entityNameToken,
1093+
spaceBefore: !didWriteSpaceBefore);
10901094
symbol('.');
10911095
didWriteSpaceBefore = true;
10921096
}
10931097

10941098
identifier(e.columnName,
1095-
spaceAfter: true, spaceBefore: !didWriteSpaceBefore);
1099+
fromToken: e.columnNameToken,
1100+
spaceAfter: true,
1101+
spaceBefore: !didWriteSpaceBefore);
10961102
}
10971103

10981104
@override
10991105
visitAliasClause(AliasClause e, void arg) {
11001106
keyword(TokenType.as);
1101-
identifier(e.name);
1107+
identifier(e.name, fromToken: e.nameToken);
11021108
}
11031109

11041110
@override
@@ -1251,10 +1257,12 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
12511257
@override
12521258
void visitTableReference(TableReference e, void arg) {
12531259
if (e.schemaName != null) {
1254-
identifier(e.schemaName!, spaceAfter: false);
1260+
identifier(e.schemaName!,
1261+
fromToken: e.schemaNameToken, spaceAfter: false);
12551262
symbol('.');
12561263
}
1257-
identifier(e.tableName, spaceBefore: e.schemaName == null);
1264+
identifier(e.tableName,
1265+
fromToken: e.tableNameToken, spaceBefore: e.schemaName == null);
12581266
visitNullable(e.as, arg);
12591267
}
12601268

@@ -1482,8 +1490,12 @@ class NodeSqlBuilder extends AstVisitor<void, void> {
14821490
}
14831491

14841492
/// Writes an identifier, escaping it if necessary.
1485-
void identifier(String identifier,
1486-
{bool spaceBefore = true, bool spaceAfter = true}) {
1493+
void identifier(
1494+
String identifier, {
1495+
IdentifierToken? fromToken,
1496+
bool spaceBefore = true,
1497+
bool spaceAfter = true,
1498+
}) {
14871499
if (isKeyword(identifier) || _notAKeywordRegex.hasMatch(identifier)) {
14881500
identifier = escapeIdentifier(identifier);
14891501
}

0 commit comments

Comments
 (0)