Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
[*.{kt,kts}]
[*.{kt,kts}]

[src/test/testData/sql/**.sql]
trim_trailing_whitespace = false
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,14 @@ Along with the Dao name change, we will refactor the SQL file directory and file
- After refactoring the Dao method name, we will also change the SQL file name.
- After refactoring the Dao package, we will also change the SQL directory.

## Formatter(Preview)
Provides code formatting for SQL syntax.

This feature is in preview. You cannot customize the indentation or keywords to be broken down!

You can reformat entire directories and files with "Code > Reformat Code".

If you want to enable the plugin's formatting function, check "Enable SQL Format" in "Settings > Other Settings > Doma Tools". (The default is OFF.)
## Settings
Some functions of "Doma Tools" can be customized from the settings screen.

Expand Down
60 changes: 38 additions & 22 deletions src/main/java/org/domaframework/doma/intellij/Sql.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -33,30 +33,30 @@
EL_POPULATE = "%populate"
EL_PARSER_LEVEL_COMMENT = "%!"
EL_END = "%end"
EL_HASH = "#"
EL_CARET = "^"
EL_SEPARATOR = ":"
EL_NULL = "null"
EL_BOOLEAN = "regexp:(true|false)"
EL_DOT = "."
EL_PLUS = "+"
EL_MINUS = "-"
EL_ASTERISK = "*"
EL_SLASH = "/"
EL_PERCENT = "%"
HASH = "#"
CARET = "^"
SEPARATOR = ":"
NULL = "null"
BOOLEAN = "regexp:(true|false)"
DOT = "."
PLUS = "+"
MINUS = "-"
ASTERISK = "*"
SLASH = "/"
PERCENT = "%"
EL_EQ = "=="
EL_NE = "!="
EL_LT = "<"
EL_LE = "<="
EL_GT = ">"
EL_GE = ">="
LT = "<"
LE = "<="
GT = ">"
GE = ">="
EL_NOT = "!"
EL_AND = "&&"
EL_OR = "||"
EL_COMMA = ","
EL_LEFT_PAREN = "("
EL_RIGHT_PAREN = ")"
EL_AT_SIGN = "@"
COMMA = ","
LEFT_PAREN = "("
RIGHT_PAREN = ")"
AT_SIGN = "@"
EL_NEW = "new"
EL_NUMBER = "regexp:\d+(L|(\.\d+)?[FDB])?"
EL_STRING = "regexp:\"([^\"\\]|\\\"|\\)*\""
Expand All @@ -74,10 +74,26 @@
sql_file ::= content *

private content ::= !<<eof>> item {pin=1 recoverWhile=content_recover}
private item ::= (comment | literal | word | OTHER)
private item ::= (comment | literal | word |
OTHER |
DOT |
COMMA |
ASTERISK |
LEFT_PAREN |
RIGHT_PAREN |
PLUS |
MINUS |
SLASH |
PERCENT |
LE |
GE |
LT |
GT |
NULL |
BOOLEAN )
private comment ::= (block_comment | LINE_COMMENT)
private literal ::= (STRING | NUMBER)
private word ::= (KEYWORD | WORD)
private word ::= (KEYWORD | WORD | DATATYPE)
block_comment ::= "/*" (el_directive | BLOCK_COMMENT_CONTENT?) "*/" {
pin=1
mixin="org.domaframework.doma.intellij.psi.SqlElCommentExprImpl"
Expand Down Expand Up @@ -149,6 +165,6 @@ el_parameters ::= "(" (el_expr ("," el_expr)*)? ")" {pin=1}

// primary
el_primary_expr ::= el_literal_expr | el_id_expr | el_paren_expr
private el_literal_expr ::= EL_NULL | EL_BOOLEAN | (EL_PLUS | EL_MINUS)? EL_NUMBER | EL_STRING | EL_CHAR
private el_literal_expr ::= EL_NULL | BOOLEAN | (EL_PLUS | EL_MINUS)? EL_NUMBER | EL_STRING | EL_CHAR
private el_id_expr ::= EL_IDENTIFIER
private el_paren_expr ::= "(" el_expr ")" {pin=1}
108 changes: 88 additions & 20 deletions src/main/java/org/domaframework/doma/intellij/Sql.flex
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,44 @@ import org.domaframework.doma.intellij.psi.SqlTypes;
%{
// SQL keywords
private static final Set<String> KEYWORDS = Set.of(
"add",
"after",
"alter",
"all",
"and",
"as",
"asc",
"between",
"by",
"case",
"change",
"check",
"column",
"comment",
"create",
"cross",
"database",
"default",
"delete",
"desc",
"distinct",
"drop",
"else",
"end",
"except",
"exists",
"first",
"foreign",
"from",
"full",
"group",
"having",
"if",
"in",
"index",
"inner",
"insert",
"intersect",
"into",
"is",
"join",
Expand All @@ -55,28 +68,68 @@ import org.domaframework.doma.intellij.psi.SqlTypes;
"limit",
"not",
"null",
"modify",
"offset",
"on",
"outer",
"or",
"order",
"primary",
"references",
"rename",
"right",
"select",
"set",
"table",
"temporary",
"then",
"to",
"truncate",
"union",
"unique",
"update",
"values",
"view",
"when",
"where"
);

// COLUMN DataTypes
private static final Set<String> DATATYPES = Set.of(
"int",
"integer",
"smallint",
"bigint",
"tinyint",
"float",
"double",
"decimal",
"numeric",
"char",
"varchar",
"text",
"date",
"time",
"timestamp",
"datetime",
"boolean",
"bit",
"binary",
"varbinary",
"blob",
"clob",
"json",
"enum",
"set"
);

private static boolean isKeyword(CharSequence word) {
return KEYWORDS.contains(word.toString().toLowerCase());
}

private static boolean isColumnDataType(CharSequence word) {
return DATATYPES.contains(word.toString().toLowerCase());
}
%}

%eof{ return;
Expand Down Expand Up @@ -113,37 +166,52 @@ El_NonWordPart = [=<>\-,/*();\R \n\t\f]
{LineComment} { return SqlTypes.LINE_COMMENT; }
{String} { return SqlTypes.STRING; }
{Number} { return SqlTypes.NUMBER; }
{Word} { return isKeyword(yytext()) ? SqlTypes.KEYWORD : SqlTypes.WORD; }
{Word} { return isKeyword(yytext()) ? SqlTypes.KEYWORD : isColumnDataType(yytext()) ? SqlTypes.DATATYPE : SqlTypes.WORD; }
"." { return SqlTypes.DOT; }
"," { return SqlTypes.COMMA; }
"+" { return SqlTypes.PLUS;}
"-" { return SqlTypes.MINUS;}
"*" { return SqlTypes.ASTERISK;}
"/" { return SqlTypes.SLASH;}
"%" { return SqlTypes.PERCENT;}
"(" { return SqlTypes.LEFT_PAREN; }
")" { return SqlTypes.RIGHT_PAREN; }
"<" { return SqlTypes.LT;}
"<=" { return SqlTypes.LE;}
">" { return SqlTypes.GT;}
">=" { return SqlTypes.GE;}
"true" { return SqlTypes.BOOLEAN;}
"false" { return SqlTypes.BOOLEAN;}
({LineTerminator}|{WhiteSpace})+ { return TokenType.WHITE_SPACE; }
[^] { return SqlTypes.OTHER; }
}

<EXPRESSION> {
{BlockCommentEnd} { yybegin(YYINITIAL); return SqlTypes.BLOCK_COMMENT_END; }
":" { return SqlTypes.EL_SEPARATOR; }
"." { return SqlTypes.EL_DOT; }
"," { return SqlTypes.EL_COMMA; }
"(" { return SqlTypes.EL_LEFT_PAREN; }
")" { return SqlTypes.EL_RIGHT_PAREN; }
"@" { return SqlTypes.EL_AT_SIGN; }
"+" { return SqlTypes.EL_PLUS;}
"-" { return SqlTypes.EL_MINUS;}
"*" { return SqlTypes.EL_ASTERISK;}
"/" { return SqlTypes.EL_SLASH;}
"%" { return SqlTypes.EL_PERCENT;}
":" { return SqlTypes.SEPARATOR; }
"." { return SqlTypes.DOT; }
"," { return SqlTypes.COMMA; }
"(" { return SqlTypes.LEFT_PAREN; }
")" { return SqlTypes.RIGHT_PAREN; }
"@" { return SqlTypes.AT_SIGN; }
"+" { return SqlTypes.PLUS;}
"-" { return SqlTypes.MINUS;}
"*" { return SqlTypes.ASTERISK;}
"/" { return SqlTypes.SLASH;}
"%" { return SqlTypes.PERCENT;}
"==" { return SqlTypes.EL_EQ;}
"!=" { return SqlTypes.EL_NE;}
"<" { return SqlTypes.EL_LT;}
"<=" { return SqlTypes.EL_LE;}
">" { return SqlTypes.EL_GT;}
">=" { return SqlTypes.EL_GE;}
"<" { return SqlTypes.LT;}
"<=" { return SqlTypes.LE;}
">" { return SqlTypes.GT;}
">=" { return SqlTypes.GE;}
"!" { return SqlTypes.EL_NOT;}
"&&" { return SqlTypes.EL_AND;}
"||" { return SqlTypes.EL_OR;}
"new" { return SqlTypes.EL_NEW;}
"null" { return SqlTypes.EL_NULL;}
"true" { return SqlTypes.EL_BOOLEAN;}
"false" { return SqlTypes.EL_BOOLEAN;}
"true" { return SqlTypes.BOOLEAN;}
"false" { return SqlTypes.BOOLEAN;}
{El_Number} { return SqlTypes.EL_NUMBER; }
{El_String} { return SqlTypes.EL_STRING; }
{El_Char} { return SqlTypes.EL_CHAR; }
Expand All @@ -162,8 +230,8 @@ El_NonWordPart = [=<>\-,/*();\R \n\t\f]
"%populate"/{El_NonWordPart} { yybegin(EXPRESSION); return SqlTypes.EL_POPULATE; }
"%end"/{El_NonWordPart} { yybegin(EXPRESSION); return SqlTypes.EL_END; }
"%!" { yybegin(PARSER_LEVEL_COMMENT); return SqlTypes.EL_PARSER_LEVEL_COMMENT; }
"#" { yybegin(EXPRESSION); return SqlTypes.EL_HASH; }
"^" { yybegin(EXPRESSION); return SqlTypes.EL_CARET; }
"#" { yybegin(EXPRESSION); return SqlTypes.HASH; }
"^" { yybegin(EXPRESSION); return SqlTypes.CARET; }
({LineTerminator}|{WhiteSpace})+ { return TokenType.WHITE_SPACE; }
[^] { return TokenType.BAD_CHARACTER; }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class SqlColorSettingsPage implements ColorSettingsPage {
new AttributesDescriptor("SQL//Literal//String", SqlSyntaxHighlighter.STRING),
new AttributesDescriptor("SQL//Literal//Number", SqlSyntaxHighlighter.NUMBER),
new AttributesDescriptor("SQL//Syntax//Keyword", SqlSyntaxHighlighter.KEYWORD),
new AttributesDescriptor("SQL//Syntax//DataType", SqlSyntaxHighlighter.DATATYPE),
new AttributesDescriptor("SQL//Syntax//Other", SqlSyntaxHighlighter.OTHER),
new AttributesDescriptor("SQL//Syntax//Word", SqlSyntaxHighlighter.WORD),
new AttributesDescriptor("SQL//Comment//Line comment", SqlSyntaxHighlighter.LINE_COMMENT),
Expand Down Expand Up @@ -76,9 +77,9 @@ public class SqlColorSettingsPage implements ColorSettingsPage {
new AttributesDescriptor("Expression//Operator///", SqlSyntaxHighlighter.EL_SLASH),
new AttributesDescriptor("Expression//Operator//==", SqlSyntaxHighlighter.EL_EQ),
new AttributesDescriptor("Expression//Operator//!=", SqlSyntaxHighlighter.EL_NE),
new AttributesDescriptor("Expression//Operator//>=", SqlSyntaxHighlighter.EL_GE),
new AttributesDescriptor("Expression//Operator//<=", SqlSyntaxHighlighter.EL_LE),
new AttributesDescriptor("Expression//Operator//>", SqlSyntaxHighlighter.EL_GT),
new AttributesDescriptor("Expression//Operator//>=", SqlSyntaxHighlighter.GE),
new AttributesDescriptor("Expression//Operator//<=", SqlSyntaxHighlighter.LE),
new AttributesDescriptor("Expression//Operator//>", SqlSyntaxHighlighter.GT),
new AttributesDescriptor("Expression//Operator//&&", SqlSyntaxHighlighter.EL_AND),
new AttributesDescriptor("Expression//Operator//||", SqlSyntaxHighlighter.EL_OR),
// Comment
Expand Down
Loading
Loading