diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/inspector/SqlBindVariableValidInspector.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/inspector/SqlBindVariableValidInspector.kt index 53718969..de558c52 100644 --- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/inspector/SqlBindVariableValidInspector.kt +++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/sql/inspector/SqlBindVariableValidInspector.kt @@ -43,7 +43,6 @@ import org.domaframework.doma.intellij.common.psi.PsiParentClass import org.domaframework.doma.intellij.extension.expr.accessElements import org.domaframework.doma.intellij.extension.expr.fqdn import org.domaframework.doma.intellij.extension.getJavaClazz -import org.domaframework.doma.intellij.extension.psi.findNodeParent import org.domaframework.doma.intellij.extension.psi.getDomaAnnotationType import org.domaframework.doma.intellij.extension.psi.getForItem import org.domaframework.doma.intellij.extension.psi.getIterableClazz @@ -164,9 +163,6 @@ class SqlBindVariableValidInspector : LocalInspectionTool() { // Exclude fixed Literal if (isLiteralOrStatic(element)) return - // TODO Check function parameters in the same way as bind variables. - if (element.findNodeParent(SqlTypes.EL_PARAMETERS) != null) return - // For static property references, match against properties in the class definition if (element.parent is SqlElStaticFieldAccessExpr) { checkStaticFieldAndMethodAccess( diff --git a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/DomaUseVariableTest.kt b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/DomaUseVariableTest.kt index 5eb8b6b8..910056de 100644 --- a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/DomaUseVariableTest.kt +++ b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/DomaUseVariableTest.kt @@ -34,6 +34,7 @@ class DomaUseVariableTest : DomaSqlTest() { "$testDaoName/selectOptionDoesNotCauseError.sql", "$testDaoName/collectDoesNotCauseError.sql", "$testDaoName/collectDoesCauseError.sql", + "$testDaoName/noErrorWhenUsedInFunctionParameters.sql", ) myFixture.enableInspections(DaoMethodVariableInspector()) } diff --git a/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/ParameterDefinedTest.kt b/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/ParameterDefinedTest.kt index b26f1868..99a6df0d 100644 --- a/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/ParameterDefinedTest.kt +++ b/src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/ParameterDefinedTest.kt @@ -22,17 +22,20 @@ import org.domaframework.doma.intellij.inspection.sql.inspector.SqlBindVariableV * A test that inspects whether a bind variable's parameters are defined. */ class ParameterDefinedTest : DomaSqlTest() { + private val testDaoName = "EmployeeSummaryDao" + override fun setUp() { super.setUp() addDaoJavaFile( - "EmployeeSummaryDao.java", + "$testDaoName.java", ) addSqlFile( - "EmployeeSummaryDao/bindVariableForEntityAndNonEntityParentClass.sql", - "EmployeeSummaryDao/bindVariableForNonEntityClass.sql", - "EmployeeSummaryDao/accessStaticProperty.sql", - "EmployeeSummaryDao/batchAnnotationResolvesClassInList.sql", - "EmployeeSummaryDao/resolveDaoArgumentOfListType.sql", + "$testDaoName/bindVariableForEntityAndNonEntityParentClass.sql", + "$testDaoName/bindVariableForNonEntityClass.sql", + "$testDaoName/accessStaticProperty.sql", + "$testDaoName/batchAnnotationResolvesClassInList.sql", + "$testDaoName/resolveDaoArgumentOfListType.sql", + "$testDaoName/bindVariableInFunctionParameters.sql", ) myFixture.enableInspections(SqlBindVariableValidInspector()) } @@ -42,7 +45,7 @@ class ParameterDefinedTest : DomaSqlTest() { * + Non-Entity parent class field, method reference test */ fun testBindVariableForEntityAndNonEntityParentClass() { - val sqlFile = findSqlFile("EmployeeSummaryDao/bindVariableForEntityAndNonEntityParentClass.sql") + val sqlFile = findSqlFile("$testDaoName/bindVariableForEntityAndNonEntityParentClass.sql") assertNotNull("Not Found SQL File", sqlFile) if (sqlFile == null) return @@ -50,7 +53,7 @@ class ParameterDefinedTest : DomaSqlTest() { } fun testBindVariableForNonEntityClass() { - val sqlFile = findSqlFile("EmployeeSummaryDao/bindVariableForNonEntityClass.sql") + val sqlFile = findSqlFile("$testDaoName/bindVariableForNonEntityClass.sql") assertNotNull("Not Found SQL File", sqlFile) if (sqlFile == null) return @@ -58,7 +61,7 @@ class ParameterDefinedTest : DomaSqlTest() { } fun testAccessStaticProperty() { - val sqlFile = findSqlFile("EmployeeSummaryDao/accessStaticProperty.sql") + val sqlFile = findSqlFile("$testDaoName/accessStaticProperty.sql") assertNotNull("Not Found SQL File", sqlFile) if (sqlFile == null) return @@ -67,7 +70,7 @@ class ParameterDefinedTest : DomaSqlTest() { fun testBatchAnnotationResolvesClassInList() { val sqlFile = - findSqlFile("EmployeeSummaryDao/batchAnnotationResolvesClassInList.sql") + findSqlFile("$testDaoName/batchAnnotationResolvesClassInList.sql") assertNotNull("Not Found SQL File", sqlFile) if (sqlFile == null) return @@ -76,7 +79,16 @@ class ParameterDefinedTest : DomaSqlTest() { fun testResolveDaoArgumentOfListType() { val sqlFile = - findSqlFile("EmployeeSummaryDao/resolveDaoArgumentOfListType.sql") + findSqlFile("$testDaoName/resolveDaoArgumentOfListType.sql") + assertNotNull("Not Found SQL File", sqlFile) + if (sqlFile == null) return + + myFixture.testHighlighting(false, false, false, sqlFile) + } + + fun testBindVariableInFunctionParameters() { + val sqlFile = + findSqlFile("$testDaoName/bindVariableInFunctionParameters.sql") assertNotNull("Not Found SQL File", sqlFile) if (sqlFile == null) return diff --git a/src/test/testData/src/main/java/doma/example/dao/DaoMethodVariableInspectionTestDao.java b/src/test/testData/src/main/java/doma/example/dao/DaoMethodVariableInspectionTestDao.java index 83c1e6d6..05da5b26 100644 --- a/src/test/testData/src/main/java/doma/example/dao/DaoMethodVariableInspectionTestDao.java +++ b/src/test/testData/src/main/java/doma/example/dao/DaoMethodVariableInspectionTestDao.java @@ -47,5 +47,7 @@ interface DaoMethodVariableInspectionTestDao { @Select Project collectDoesCauseError(Employee employee,String searchName,Collector collector); + @Select + Project noErrorWhenUsedInFunctionParameters(Employee employee, Integer count); } \ No newline at end of file diff --git a/src/test/testData/src/main/java/doma/example/dao/EmployeeSummaryDao.java b/src/test/testData/src/main/java/doma/example/dao/EmployeeSummaryDao.java index 2fc1f01f..7c8c49a6 100644 --- a/src/test/testData/src/main/java/doma/example/dao/EmployeeSummaryDao.java +++ b/src/test/testData/src/main/java/doma/example/dao/EmployeeSummaryDao.java @@ -26,4 +26,7 @@ interface EmployeeSummaryDao { @BatchInsert(sqlFile=true) int[] batchAnnotationResolvesClassInList(List employees); + + @Insert(sqlFile=true) + EmployeeSummary bindVariableInFunctionParameters(Employee employee, User user); } \ No newline at end of file diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/DaoMethodVariableInspectionTestDao/noErrorWhenUsedInFunctionParameters.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/DaoMethodVariableInspectionTestDao/noErrorWhenUsedInFunctionParameters.sql new file mode 100644 index 00000000..3ea54734 --- /dev/null +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/DaoMethodVariableInspectionTestDao/noErrorWhenUsedInFunctionParameters.sql @@ -0,0 +1,6 @@ +select + p.project_id + , p.project_name + , p.project_number +from project p +where p.project_id = /* employee.employeeParam(count, 1) */0 \ No newline at end of file diff --git a/src/test/testData/src/main/resources/META-INF/doma/example/dao/EmployeeSummaryDao/bindVariableInFunctionParameters.sql b/src/test/testData/src/main/resources/META-INF/doma/example/dao/EmployeeSummaryDao/bindVariableInFunctionParameters.sql new file mode 100644 index 00000000..f91e5787 --- /dev/null +++ b/src/test/testData/src/main/resources/META-INF/doma/example/dao/EmployeeSummaryDao/bindVariableInFunctionParameters.sql @@ -0,0 +1,10 @@ +-- Check BindVariable Definition In Function Parameters +SELECT + e.employee_id + , u.user_id + , u.user_name +FROM user u +WHERE p.employee_id = /* employee.employeeParam(employee.dist, employee.employeeId) */0 +AND p.base_rank = /* employee.employeeParam(user.userId, count) */0 +AND p.employee_id = /* employee.employeeParam(employee.dist, rank) */0 +/*%end */ \ No newline at end of file