Skip to content

Commit 5ff699e

Browse files
authored
Merge pull request #69 from domaframework/feature/sql-formatter-dev
Implementing SQL formatting functionality(preview)
2 parents 3bdbed3 + 53a9855 commit 5ff699e

File tree

84 files changed

+5818
-528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+5818
-528
lines changed

.editorconfig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
[*.{kt,kts}]
1+
[*.{kt,kts}]
2+
3+
[src/test/testData/sql/**.sql]
4+
trim_trailing_whitespace = false

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ Along with the Dao name change, we will refactor the SQL file directory and file
5959
- After refactoring the Dao method name, we will also change the SQL file name.
6060
- After refactoring the Dao package, we will also change the SQL directory.
6161

62+
## Formatter(Preview)
63+
Provides code formatting for SQL syntax.
64+
65+
This feature is in preview. You cannot customize the indentation or keywords to be broken down!
66+
67+
You can reformat entire directories and files with "Code > Reformat Code".
68+
69+
If you want to enable the plugin's formatting function, check "Enable SQL Format" in "Settings > Other Settings > Doma Tools". (The default is OFF.)
6270
## Settings
6371
Some functions of "Doma Tools" can be customized from the settings screen.
6472

src/main/java/org/domaframework/doma/intellij/Sql.bnf

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,30 +33,30 @@
3333
EL_POPULATE = "%populate"
3434
EL_PARSER_LEVEL_COMMENT = "%!"
3535
EL_END = "%end"
36-
EL_HASH = "#"
37-
EL_CARET = "^"
38-
EL_SEPARATOR = ":"
39-
EL_NULL = "null"
40-
EL_BOOLEAN = "regexp:(true|false)"
41-
EL_DOT = "."
42-
EL_PLUS = "+"
43-
EL_MINUS = "-"
44-
EL_ASTERISK = "*"
45-
EL_SLASH = "/"
46-
EL_PERCENT = "%"
36+
HASH = "#"
37+
CARET = "^"
38+
SEPARATOR = ":"
39+
NULL = "null"
40+
BOOLEAN = "regexp:(true|false)"
41+
DOT = "."
42+
PLUS = "+"
43+
MINUS = "-"
44+
ASTERISK = "*"
45+
SLASH = "/"
46+
PERCENT = "%"
4747
EL_EQ = "=="
4848
EL_NE = "!="
49-
EL_LT = "<"
50-
EL_LE = "<="
51-
EL_GT = ">"
52-
EL_GE = ">="
49+
LT = "<"
50+
LE = "<="
51+
GT = ">"
52+
GE = ">="
5353
EL_NOT = "!"
5454
EL_AND = "&&"
5555
EL_OR = "||"
56-
EL_COMMA = ","
57-
EL_LEFT_PAREN = "("
58-
EL_RIGHT_PAREN = ")"
59-
EL_AT_SIGN = "@"
56+
COMMA = ","
57+
LEFT_PAREN = "("
58+
RIGHT_PAREN = ")"
59+
AT_SIGN = "@"
6060
EL_NEW = "new"
6161
EL_NUMBER = "regexp:\d+(L|(\.\d+)?[FDB])?"
6262
EL_STRING = "regexp:\"([^\"\\]|\\\"|\\)*\""
@@ -74,10 +74,26 @@
7474
sql_file ::= content *
7575

7676
private content ::= !<<eof>> item {pin=1 recoverWhile=content_recover}
77-
private item ::= (comment | literal | word | OTHER)
77+
private item ::= (comment | literal | word |
78+
OTHER |
79+
DOT |
80+
COMMA |
81+
ASTERISK |
82+
LEFT_PAREN |
83+
RIGHT_PAREN |
84+
PLUS |
85+
MINUS |
86+
SLASH |
87+
PERCENT |
88+
LE |
89+
GE |
90+
LT |
91+
GT |
92+
NULL |
93+
BOOLEAN )
7894
private comment ::= (block_comment | LINE_COMMENT)
7995
private literal ::= (STRING | NUMBER)
80-
private word ::= (KEYWORD | WORD)
96+
private word ::= (KEYWORD | WORD | DATATYPE)
8197
block_comment ::= "/*" (el_directive | BLOCK_COMMENT_CONTENT?) "*/" {
8298
pin=1
8399
mixin="org.domaframework.doma.intellij.psi.SqlElCommentExprImpl"
@@ -149,6 +165,6 @@ el_parameters ::= "(" (el_expr ("," el_expr)*)? ")" {pin=1}
149165

150166
// primary
151167
el_primary_expr ::= el_literal_expr | el_id_expr | el_paren_expr
152-
private el_literal_expr ::= EL_NULL | EL_BOOLEAN | (EL_PLUS | EL_MINUS)? EL_NUMBER | EL_STRING | EL_CHAR
168+
private el_literal_expr ::= EL_NULL | BOOLEAN | (EL_PLUS | EL_MINUS)? EL_NUMBER | EL_STRING | EL_CHAR
153169
private el_id_expr ::= EL_IDENTIFIER
154170
private el_paren_expr ::= "(" el_expr ")" {pin=1}

src/main/java/org/domaframework/doma/intellij/Sql.flex

Lines changed: 88 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,44 @@ import org.domaframework.doma.intellij.psi.SqlTypes;
2121
%{
2222
// SQL keywords
2323
private static final Set<String> KEYWORDS = Set.of(
24+
"add",
25+
"after",
2426
"alter",
2527
"all",
2628
"and",
29+
"as",
2730
"asc",
31+
"between",
2832
"by",
2933
"case",
34+
"change",
3035
"check",
36+
"column",
37+
"comment",
3138
"create",
39+
"cross",
40+
"database",
3241
"default",
3342
"delete",
3443
"desc",
3544
"distinct",
3645
"drop",
3746
"else",
3847
"end",
48+
"except",
3949
"exists",
50+
"first",
4051
"foreign",
4152
"from",
4253
"full",
4354
"group",
4455
"having",
56+
"if",
4557
"in",
4658
"index",
4759
"inner",
4860
"insert",
61+
"intersect",
4962
"into",
5063
"is",
5164
"join",
@@ -55,28 +68,68 @@ import org.domaframework.doma.intellij.psi.SqlTypes;
5568
"limit",
5669
"not",
5770
"null",
71+
"modify",
5872
"offset",
5973
"on",
74+
"outer",
6075
"or",
6176
"order",
6277
"primary",
6378
"references",
79+
"rename",
6480
"right",
6581
"select",
6682
"set",
6783
"table",
84+
"temporary",
6885
"then",
86+
"to",
87+
"truncate",
6988
"union",
7089
"unique",
7190
"update",
7291
"values",
92+
"view",
7393
"when",
7494
"where"
7595
);
7696

97+
// COLUMN DataTypes
98+
private static final Set<String> DATATYPES = Set.of(
99+
"int",
100+
"integer",
101+
"smallint",
102+
"bigint",
103+
"tinyint",
104+
"float",
105+
"double",
106+
"decimal",
107+
"numeric",
108+
"char",
109+
"varchar",
110+
"text",
111+
"date",
112+
"time",
113+
"timestamp",
114+
"datetime",
115+
"boolean",
116+
"bit",
117+
"binary",
118+
"varbinary",
119+
"blob",
120+
"clob",
121+
"json",
122+
"enum",
123+
"set"
124+
);
125+
77126
private static boolean isKeyword(CharSequence word) {
78127
return KEYWORDS.contains(word.toString().toLowerCase());
79128
}
129+
130+
private static boolean isColumnDataType(CharSequence word) {
131+
return DATATYPES.contains(word.toString().toLowerCase());
132+
}
80133
%}
81134

82135
%eof{ return;
@@ -113,37 +166,52 @@ El_NonWordPart = [=<>\-,/*();\R \n\t\f]
113166
{LineComment} { return SqlTypes.LINE_COMMENT; }
114167
{String} { return SqlTypes.STRING; }
115168
{Number} { return SqlTypes.NUMBER; }
116-
{Word} { return isKeyword(yytext()) ? SqlTypes.KEYWORD : SqlTypes.WORD; }
169+
{Word} { return isKeyword(yytext()) ? SqlTypes.KEYWORD : isColumnDataType(yytext()) ? SqlTypes.DATATYPE : SqlTypes.WORD; }
170+
"." { return SqlTypes.DOT; }
171+
"," { return SqlTypes.COMMA; }
172+
"+" { return SqlTypes.PLUS;}
173+
"-" { return SqlTypes.MINUS;}
174+
"*" { return SqlTypes.ASTERISK;}
175+
"/" { return SqlTypes.SLASH;}
176+
"%" { return SqlTypes.PERCENT;}
177+
"(" { return SqlTypes.LEFT_PAREN; }
178+
")" { return SqlTypes.RIGHT_PAREN; }
179+
"<" { return SqlTypes.LT;}
180+
"<=" { return SqlTypes.LE;}
181+
">" { return SqlTypes.GT;}
182+
">=" { return SqlTypes.GE;}
183+
"true" { return SqlTypes.BOOLEAN;}
184+
"false" { return SqlTypes.BOOLEAN;}
117185
({LineTerminator}|{WhiteSpace})+ { return TokenType.WHITE_SPACE; }
118186
[^] { return SqlTypes.OTHER; }
119187
}
120188

121189
<EXPRESSION> {
122190
{BlockCommentEnd} { yybegin(YYINITIAL); return SqlTypes.BLOCK_COMMENT_END; }
123-
":" { return SqlTypes.EL_SEPARATOR; }
124-
"." { return SqlTypes.EL_DOT; }
125-
"," { return SqlTypes.EL_COMMA; }
126-
"(" { return SqlTypes.EL_LEFT_PAREN; }
127-
")" { return SqlTypes.EL_RIGHT_PAREN; }
128-
"@" { return SqlTypes.EL_AT_SIGN; }
129-
"+" { return SqlTypes.EL_PLUS;}
130-
"-" { return SqlTypes.EL_MINUS;}
131-
"*" { return SqlTypes.EL_ASTERISK;}
132-
"/" { return SqlTypes.EL_SLASH;}
133-
"%" { return SqlTypes.EL_PERCENT;}
191+
":" { return SqlTypes.SEPARATOR; }
192+
"." { return SqlTypes.DOT; }
193+
"," { return SqlTypes.COMMA; }
194+
"(" { return SqlTypes.LEFT_PAREN; }
195+
")" { return SqlTypes.RIGHT_PAREN; }
196+
"@" { return SqlTypes.AT_SIGN; }
197+
"+" { return SqlTypes.PLUS;}
198+
"-" { return SqlTypes.MINUS;}
199+
"*" { return SqlTypes.ASTERISK;}
200+
"/" { return SqlTypes.SLASH;}
201+
"%" { return SqlTypes.PERCENT;}
134202
"==" { return SqlTypes.EL_EQ;}
135203
"!=" { return SqlTypes.EL_NE;}
136-
"<" { return SqlTypes.EL_LT;}
137-
"<=" { return SqlTypes.EL_LE;}
138-
">" { return SqlTypes.EL_GT;}
139-
">=" { return SqlTypes.EL_GE;}
204+
"<" { return SqlTypes.LT;}
205+
"<=" { return SqlTypes.LE;}
206+
">" { return SqlTypes.GT;}
207+
">=" { return SqlTypes.GE;}
140208
"!" { return SqlTypes.EL_NOT;}
141209
"&&" { return SqlTypes.EL_AND;}
142210
"||" { return SqlTypes.EL_OR;}
143211
"new" { return SqlTypes.EL_NEW;}
144212
"null" { return SqlTypes.EL_NULL;}
145-
"true" { return SqlTypes.EL_BOOLEAN;}
146-
"false" { return SqlTypes.EL_BOOLEAN;}
213+
"true" { return SqlTypes.BOOLEAN;}
214+
"false" { return SqlTypes.BOOLEAN;}
147215
{El_Number} { return SqlTypes.EL_NUMBER; }
148216
{El_String} { return SqlTypes.EL_STRING; }
149217
{El_Char} { return SqlTypes.EL_CHAR; }
@@ -162,8 +230,8 @@ El_NonWordPart = [=<>\-,/*();\R \n\t\f]
162230
"%populate"/{El_NonWordPart} { yybegin(EXPRESSION); return SqlTypes.EL_POPULATE; }
163231
"%end"/{El_NonWordPart} { yybegin(EXPRESSION); return SqlTypes.EL_END; }
164232
"%!" { yybegin(PARSER_LEVEL_COMMENT); return SqlTypes.EL_PARSER_LEVEL_COMMENT; }
165-
"#" { yybegin(EXPRESSION); return SqlTypes.EL_HASH; }
166-
"^" { yybegin(EXPRESSION); return SqlTypes.EL_CARET; }
233+
"#" { yybegin(EXPRESSION); return SqlTypes.HASH; }
234+
"^" { yybegin(EXPRESSION); return SqlTypes.CARET; }
167235
({LineTerminator}|{WhiteSpace})+ { return TokenType.WHITE_SPACE; }
168236
[^] { return TokenType.BAD_CHARACTER; }
169237
}

src/main/java/org/domaframework/doma/intellij/highlighter/SqlColorSettingsPage.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class SqlColorSettingsPage implements ColorSettingsPage {
3737
new AttributesDescriptor("SQL//Literal//String", SqlSyntaxHighlighter.STRING),
3838
new AttributesDescriptor("SQL//Literal//Number", SqlSyntaxHighlighter.NUMBER),
3939
new AttributesDescriptor("SQL//Syntax//Keyword", SqlSyntaxHighlighter.KEYWORD),
40+
new AttributesDescriptor("SQL//Syntax//DataType", SqlSyntaxHighlighter.DATATYPE),
4041
new AttributesDescriptor("SQL//Syntax//Other", SqlSyntaxHighlighter.OTHER),
4142
new AttributesDescriptor("SQL//Syntax//Word", SqlSyntaxHighlighter.WORD),
4243
new AttributesDescriptor("SQL//Comment//Line comment", SqlSyntaxHighlighter.LINE_COMMENT),
@@ -76,9 +77,9 @@ public class SqlColorSettingsPage implements ColorSettingsPage {
7677
new AttributesDescriptor("Expression//Operator///", SqlSyntaxHighlighter.EL_SLASH),
7778
new AttributesDescriptor("Expression//Operator//==", SqlSyntaxHighlighter.EL_EQ),
7879
new AttributesDescriptor("Expression//Operator//!=", SqlSyntaxHighlighter.EL_NE),
79-
new AttributesDescriptor("Expression//Operator//>=", SqlSyntaxHighlighter.EL_GE),
80-
new AttributesDescriptor("Expression//Operator//<=", SqlSyntaxHighlighter.EL_LE),
81-
new AttributesDescriptor("Expression//Operator//>", SqlSyntaxHighlighter.EL_GT),
80+
new AttributesDescriptor("Expression//Operator//>=", SqlSyntaxHighlighter.GE),
81+
new AttributesDescriptor("Expression//Operator//<=", SqlSyntaxHighlighter.LE),
82+
new AttributesDescriptor("Expression//Operator//>", SqlSyntaxHighlighter.GT),
8283
new AttributesDescriptor("Expression//Operator//&&", SqlSyntaxHighlighter.EL_AND),
8384
new AttributesDescriptor("Expression//Operator//||", SqlSyntaxHighlighter.EL_OR),
8485
// Comment

0 commit comments

Comments
 (0)