Skip to content

Commit e492cb0

Browse files
authored
Introduce parser-level block comments (#1062)
* Introduce parser-level block comments * Polish
1 parent 4f4f19c commit e492cb0

File tree

6 files changed

+46
-3
lines changed

6 files changed

+46
-3
lines changed

doma-core/src/main/java/org/seasar/doma/internal/jdbc/sql/SqlParser.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ public SqlNode parse() {
172172
parseEmbeddedVariableBlockComment();
173173
break;
174174
}
175+
case PARSER_LEVEL_BLOCK_COMMENT:
176+
{
177+
parseParserLevelBlockComment();
178+
break;
179+
}
175180
case IF_BLOCK_COMMENT:
176181
{
177182
parseIfBlockComment();
@@ -456,6 +461,10 @@ protected void parseEmbeddedVariableBlockComment() {
456461
push(node);
457462
}
458463

464+
protected void parseParserLevelBlockComment() {
465+
// do nothing
466+
}
467+
459468
protected void parseIfBlockComment() {
460469
IfBlockNode ifBlockNode = new IfBlockNode();
461470
appendNode(ifBlockNode);

doma-core/src/main/java/org/seasar/doma/internal/jdbc/sql/SqlTokenType.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public enum SqlTokenType {
1616

1717
BLOCK_COMMENT,
1818

19+
PARSER_LEVEL_BLOCK_COMMENT,
20+
1921
BIND_VARIABLE_BLOCK_COMMENT {
2022

2123
@Override

doma-core/src/main/java/org/seasar/doma/internal/jdbc/sql/SqlTokenizer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.ORDER_BY_WORD;
2929
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.OR_WORD;
3030
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.OTHER;
31+
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.PARSER_LEVEL_BLOCK_COMMENT;
3132
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.POPULATE_BLOCK_COMMENT;
3233
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.QUOTE;
3334
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.SELECT_WORD;
@@ -380,7 +381,9 @@ protected void peekTwoChars(char c, char c2) {
380381
} else if (c3 == '%') {
381382
if (buf.hasRemaining()) {
382383
char c4 = buf.get();
383-
if (buf.hasRemaining()) {
384+
if (c4 == '!') {
385+
type = PARSER_LEVEL_BLOCK_COMMENT;
386+
} else if (buf.hasRemaining()) {
384387
char c5 = buf.get();
385388
if (c4 == 'i' && c5 == 'f') {
386389
if (isBlockCommentDirectiveTerminated()) {
@@ -467,7 +470,8 @@ protected void peekTwoChars(char c, char c2) {
467470
buf.position(buf.position() - 1);
468471
}
469472
}
470-
if (type != IF_BLOCK_COMMENT
473+
if (type != PARSER_LEVEL_BLOCK_COMMENT
474+
&& type != IF_BLOCK_COMMENT
471475
&& type != FOR_BLOCK_COMMENT
472476
&& type != END_BLOCK_COMMENT
473477
&& type != ELSE_BLOCK_COMMENT

doma-core/src/main/java/org/seasar/doma/message/Message.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public enum Message implements MessageResource {
150150
DOMA2119(
151151
"Failed to build the SQL on line {1} at column {2}. "
152152
+ "When the directive starts with \"/*%\", "
153-
+ "the following string must be either \"if\", \"else\", \"elseif\", \"for\", \"end\", \"expand\" or \"populate\". SQL=[{0}]"),
153+
+ "the following string must be either \"!\", \"if\", \"else\", \"elseif\", \"for\", \"end\", \"expand\" or \"populate\". SQL=[{0}]"),
154154
DOMA2120(
155155
"Failed to parse the SQL on line {1} at column {2}. "
156156
+ "While the bind variable directive \"{3}\" is defined, the expression is none. SQL=[{0}]"),

doma-core/src/test/java/org/seasar/doma/internal/jdbc/sql/SqlParserTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,18 @@ public void testFor_removeOr() {
801801
assertEquals(0, sql.getParameters().size());
802802
}
803803

804+
@Test
805+
public void testParserLevelBlockComment() {
806+
ExpressionEvaluator evaluator = new ExpressionEvaluator();
807+
SqlParser parser = new SqlParser("select /*%! comment */a from b");
808+
SqlNode sqlNode = parser.parse();
809+
PreparedSql sql =
810+
new NodePreparedSqlBuilder(
811+
config, SqlKind.SELECT, "dummyPath", evaluator, SqlLogType.FORMATTED)
812+
.build(sqlNode, Function.identity());
813+
assertEquals("select a from b", sql.getRawSql());
814+
}
815+
804816
@Test
805817
public void testFor_index() {
806818
ExpressionEvaluator evaluator = new ExpressionEvaluator();

doma-core/src/test/java/org/seasar/doma/internal/jdbc/sql/SqlTokenizerTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.ORDER_BY_WORD;
2828
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.OR_WORD;
2929
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.OTHER;
30+
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.PARSER_LEVEL_BLOCK_COMMENT;
3031
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.POPULATE_BLOCK_COMMENT;
3132
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.QUOTE;
3233
import static org.seasar.doma.internal.jdbc.sql.SqlTokenType.SELECT_WORD;
@@ -125,6 +126,21 @@ public void testBlockComment_empty() {
125126
assertNull(tokenizer.getToken());
126127
}
127128

129+
@Test
130+
public void testParserLevelBlockComment() {
131+
SqlTokenizer tokenizer = new SqlTokenizer("where /*%!aaa*/bbb");
132+
assertEquals(WHERE_WORD, tokenizer.next());
133+
assertEquals("where", tokenizer.getToken());
134+
assertEquals(WHITESPACE, tokenizer.next());
135+
assertEquals(" ", tokenizer.getToken());
136+
assertEquals(PARSER_LEVEL_BLOCK_COMMENT, tokenizer.next());
137+
assertEquals("/*%!aaa*/", tokenizer.getToken());
138+
assertEquals(WORD, tokenizer.next());
139+
assertEquals("bbb", tokenizer.getToken());
140+
assertEquals(EOF, tokenizer.next());
141+
assertNull(tokenizer.getToken());
142+
}
143+
128144
@Test
129145
public void testQuote() {
130146
SqlTokenizer tokenizer = new SqlTokenizer("where 'aaa'");

0 commit comments

Comments
 (0)