From 8c412490b989f1fab58cb24bdce18ad33229730e Mon Sep 17 00:00:00 2001 From: xterao Date: Mon, 16 Jun 2025 10:29:32 +0900 Subject: [PATCH 1/2] Add expand directive handling and related tests for SQL inspections --- .../visitor/SqlTestDataInspectionVisitor.kt | 15 +++++++++++++- .../messages/DomaToolsBundle.properties | 1 + .../messages/DomaToolsBundle_ja.properties | 1 + .../inspection/sql/TestDataCheckTest.kt | 20 +++++++++++++++++++ .../dao/inspection/TestDataCheckDao.java | 6 ++++++ .../TestDataCheckDao/expandDirective.sql | 2 ++ .../invalidExpandDirective.sql | 2 ++ 7 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql create mode 100644 src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/visitor/SqlTestDataInspectionVisitor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/visitor/SqlTestDataInspectionVisitor.kt index 37e3db09..01a541ea 100644 --- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/visitor/SqlTestDataInspectionVisitor.kt +++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/visitor/SqlTestDataInspectionVisitor.kt @@ -51,12 +51,20 @@ class SqlTestDataInspectionVisitor( super.visitBlockComment(element) if (hasOtherBindVariable(element)) return - val result = ValidationTestDataResult(element, shortName) val nextElement = element.nextSibling + val expand = isExpand(element) + val result = ValidationTestDataResult(element, shortName, expand) + + if (expand) { + if (!checkExpandDirective(nextElement)) result.highlightElement(holder) + return + } + if (nextElement == null) { result.highlightElement(holder) return } + if (isSqlLiteral(nextElement)) return if (isMatchListTestData(element)) return @@ -91,6 +99,11 @@ class SqlTestDataInspectionVisitor( listOf("true", "false", "null").contains(element.text.lowercase()) || element.text.matches(Regex("^\\d+$")) + private fun isExpand(element: PsiElement): Boolean = + PsiTreeUtil.getChildOfType(element, PsiElement::class.java)?.nextSibling?.elementType == SqlTypes.EL_EXPAND + + private fun checkExpandDirective(element: PsiElement): Boolean = element.elementType == SqlTypes.ASTERISK + /** * Determines if the given element matches the pattern for "List type test data." * diff --git a/src/main/resources/messages/DomaToolsBundle.properties b/src/main/resources/messages/DomaToolsBundle.properties index 2d5cd80b..aa7e804f 100644 --- a/src/main/resources/messages/DomaToolsBundle.properties +++ b/src/main/resources/messages/DomaToolsBundle.properties @@ -9,6 +9,7 @@ inspection.invalid.dao.parameter=The bind variable [{1}] does not exist in the D inspection.invalid.sql.topType=Can't get type of first element inspection.invalid.sql.staticProperty=[{0}] is not a public or static property in the class [{1}] inspection.invalid.sql.testdata=Test data is required after a bind variable directive or a literal variable directive +inspection.invalid.sql.expand=Asterisk is required after expand variable inspection.invalid.sql.classpath=A non-existent package or class name was specified [{0}] inspection.invalid.sql.iterable=The type that can be used in the loop directive is an Iterable type inspection.invalid.dao.duplicate=An element name that is a duplicate of an element name defined in SQL is used diff --git a/src/main/resources/messages/DomaToolsBundle_ja.properties b/src/main/resources/messages/DomaToolsBundle_ja.properties index 4c27b0eb..44949746 100644 --- a/src/main/resources/messages/DomaToolsBundle_ja.properties +++ b/src/main/resources/messages/DomaToolsBundle_ja.properties @@ -9,6 +9,7 @@ inspection.invalid.dao.parameter=DAO\u30E1\u30BD\u30C3\u30C9[{0}]\u306B\u5B58\u5 inspection.invalid.sql.topType=\u6700\u521D\u306E\u8981\u7D20\u306E\u578B\u304C\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093 inspection.invalid.sql.staticProperty=[{0}]\u0020\u306F\u30AF\u30E9\u30B9\u0020[{1}]\u0020\u306E\u0020\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u307E\u305F\u0020\u0073\u0074\u0061\u0074\u0069\u0063\u0020\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u306F\u3042\u308A\u307E\u305B\u3093 inspection.invalid.sql.testdata=\u30D0\u30A4\u30F3\u30C9\u5909\u6570\u30C7\u30A3\u30EC\u30AF\u30C6\u30A3\u30D6\u3001\u30EA\u30C6\u30E9\u30EB\u5909\u6570\u30C7\u30A3\u30EC\u30AF\u30C6\u30A3\u30D6\u306E\u5F8C\u308D\u306B\u306F\u30C6\u30B9\u30C8\u30C7\u30FC\u30BF\u304C\u5FC5\u8981\u3067\u3059 +inspection.invalid.sql.expand=\u0045\u0078\u0070\u0061\u006E\u0064\u30C7\u30A3\u30EC\u30AF\u30C6\u30A3\u30D6\u306E\u5F8C\u308D\u306B\u306F\u30A2\u30B9\u30BF\u30EA\u30B9\u30AF\u304C\u5FC5\u8981\u3067\u3059 inspection.invalid.sql.classpath=\u5B58\u5728\u3057\u306A\u3044\u30D1\u30C3\u30B1\u30FC\u30B8\u307E\u305F\u306F\u30AF\u30E9\u30B9\u540D\u304C\u6307\u5B9A\u3055\u308C\u307E\u3057\u305F\u3002:[{0}] inspection.invalid.sql.iterable=\u30EB\u30FC\u30D7\u30C7\u30A3\u30EC\u30AF\u30C6\u30A3\u30D6\u306B\u4F7F\u7528\u3067\u304D\u308B\u578B\u306F\u0049\u0074\u0065\u0072\u0061\u0062\u006C\u0065\u578B\u3067\u3059 inspection.invalid.dao.duplicate=\u0053\u0051\u004C\u5185\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u8981\u7D20\u540D\u3068\u91CD\u8907\u3057\u305F\u8981\u7D20\u540D\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059 diff --git a/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/TestDataCheckTest.kt b/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/TestDataCheckTest.kt index 6070089b..71b73bbb 100644 --- a/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/TestDataCheckTest.kt +++ b/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/TestDataCheckTest.kt @@ -34,6 +34,8 @@ class TestDataCheckTest : DomaSqlTest() { "$packageName/$testDaoName/commentBlock.sql", "$packageName/$testDaoName/populateDirective.sql", "$packageName/$testDaoName/invalidTestData.sql", + "$packageName/$testDaoName/expandDirective.sql", + "$packageName/$testDaoName/invalidExpandDirective.sql", ) myFixture.enableInspections(SqlTestDataInspection()) } @@ -88,4 +90,22 @@ class TestDataCheckTest : DomaSqlTest() { myFixture.testHighlighting(false, false, false, sqlFile) } + + fun testExpandDirective() { + val sqlFile = + findSqlFile("$packageName/$testDaoName/expandDirective.sql") + assertNotNull("Not Found SQL File", sqlFile) + if (sqlFile == null) return + + myFixture.testHighlighting(false, false, false, sqlFile) + } + + fun testInvalidExpandDirective() { + val sqlFile = + findSqlFile("$packageName/$testDaoName/invalidExpandDirective.sql") + assertNotNull("Not Found SQL File", sqlFile) + if (sqlFile == null) return + + myFixture.testHighlighting(false, false, false, sqlFile) + } } diff --git a/src/test/testData/src/main/java/doma/example/dao/inspection/TestDataCheckDao.java b/src/test/testData/src/main/java/doma/example/dao/inspection/TestDataCheckDao.java index 5068665d..4b3041a2 100644 --- a/src/test/testData/src/main/java/doma/example/dao/inspection/TestDataCheckDao.java +++ b/src/test/testData/src/main/java/doma/example/dao/inspection/TestDataCheckDao.java @@ -30,5 +30,11 @@ interface TestDataCheckDao { @Insert(sqlFile=true) int invalidTestData(Employee employee); + @Select + int expandDirective(Employee employee); + + @Select + int invalidExpandDirective(Employee employee); + } diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql new file mode 100644 index 00000000..981cb84f --- /dev/null +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql @@ -0,0 +1,2 @@ +SELECT /*%expand*/* FROM employee + WHERE rank < /* emplotee.rank */* diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql new file mode 100644 index 00000000..d1beab82 --- /dev/null +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql @@ -0,0 +1,2 @@ +SELECT /*%expand*/0 FROM employee + WHERE rank < /* emplotee.rank */0 From a8f5e297a5f55ec4c7ef8356ab644b3e2856d945 Mon Sep 17 00:00:00 2001 From: xterao Date: Mon, 16 Jun 2025 10:40:40 +0900 Subject: [PATCH 2/2] Fix expand directive handling in SQL validation and correct variable names in test data --- .../common/validation/result/ValidationTestDataResult.kt | 9 ++++++++- .../dao/inspection/TestDataCheckDao/expandDirective.sql | 2 +- .../TestDataCheckDao/invalidExpandDirective.sql | 2 +- .../inspection/TestDataCheckDao/populateDirective.sql | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationTestDataResult.kt b/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationTestDataResult.kt index ce4ef937..d90101e9 100644 --- a/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationTestDataResult.kt +++ b/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationTestDataResult.kt @@ -24,6 +24,7 @@ import org.domaframework.doma.intellij.common.psi.PsiParentClass class ValidationTestDataResult( override val identify: PsiElement?, override val shortName: String = "", + private val expand: Boolean, ) : ValidationResult(identify, null, shortName) { override fun setHighlight( highlightRange: TextRange, @@ -31,10 +32,16 @@ class ValidationTestDataResult( holder: ProblemsHolder, parent: PsiParentClass?, ) { + val message = + if (expand) { + MessageBundle.message("inspection.invalid.sql.expand") + } else { + MessageBundle.message("inspection.invalid.sql.testdata") + } val project = identify.project holder.registerProblem( identify, - MessageBundle.message("inspection.invalid.sql.testdata"), + message, problemHighlightType(project, shortName), highlightRange, ) diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql index 981cb84f..1edbadb7 100644 --- a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/expandDirective.sql @@ -1,2 +1,2 @@ SELECT /*%expand*/* FROM employee - WHERE rank < /* emplotee.rank */* + WHERE rank < /* employee.rank */* diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql index d1beab82..cfbba6cc 100644 --- a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/invalidExpandDirective.sql @@ -1,2 +1,2 @@ SELECT /*%expand*/0 FROM employee - WHERE rank < /* emplotee.rank */0 + WHERE rank < /* employee.rank */0 diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/populateDirective.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/populateDirective.sql index 04fecd70..b25f6b38 100644 --- a/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/populateDirective.sql +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/inspection/TestDataCheckDao/populateDirective.sql @@ -1,3 +1,3 @@ UPDATE employee SET /*%populate*/id = id - WHERE rank < /* emplotee.rank */ + WHERE rank < /* employee.rank */