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