diff --git a/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamEntityResult.kt b/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamTypeResult.kt
similarity index 94%
rename from src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamEntityResult.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamTypeResult.kt
index d1db7aec..625f8beb 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamEntityResult.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/common/validation/result/ValidationMethodParamTypeResult.kt
@@ -21,9 +21,10 @@ import com.intellij.psi.PsiElement
import org.domaframework.doma.intellij.bundle.MessageBundle
import org.domaframework.doma.intellij.common.psi.PsiParentClass
-class ValidationMethodParamEntityResult(
+class ValidationMethodParamTypeResult(
override val identify: PsiElement?,
override val shortName: String = "",
+ private val typeName: String,
) : ValidationResult(identify, null, shortName) {
override fun setHighlight(
highlightRange: TextRange,
@@ -34,7 +35,7 @@ class ValidationMethodParamEntityResult(
val project = identify.project
holder.registerProblem(
identify,
- MessageBundle.message("inspection.invalid.dao.params.entity"),
+ MessageBundle.message("inspection.invalid.dao.params.type", typeName),
problemHighlightType(project, shortName),
highlightRange,
)
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/extension/psi/DomaAnnotationType.kt b/src/main/kotlin/org/domaframework/doma/intellij/extension/psi/DomaAnnotationType.kt
index db3e42af..3363fbbb 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/extension/psi/DomaAnnotationType.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/extension/psi/DomaAnnotationType.kt
@@ -38,6 +38,11 @@ enum class DomaAnnotationType(
Insert("org.seasar.doma.Insert"),
Update("org.seasar.doma.Update"),
Delete("org.seasar.doma.Delete"),
+ ArrayFactory("org.seasar.doma.ArrayFactory"),
+ BlobFactory("org.seasar.doma.BlobFactory"),
+ ClobFactory("org.seasar.doma.ClobFactory"),
+ NClobFactory("org.seasar.doma.NClobFactory"),
+ SQLXMLFactory("org.seasar.doma.SQLXMLFactory"),
Sql("org.seasar.doma.Sql"),
Unknown("Unknown"),
;
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/FactoryAnnotationType.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/FactoryAnnotationType.kt
new file mode 100644
index 00000000..70b58d1a
--- /dev/null
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/FactoryAnnotationType.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright Doma Tools Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.domaframework.doma.intellij.inspection.dao.processor
+
+enum class FactoryAnnotationType(
+ val fqdn: String,
+ val returnType: String,
+ val paramCount: Int = 0,
+) {
+ ArrayFactory("org.seasar.doma.ArrayFactory", "java.sql.Array", 1),
+ BlobFactory("org.seasar.doma.BlobFactory", "java.sql.Blob"),
+ ClobFactory("org.seasar.doma.ClobFactory", "java.sql.Clob"),
+ NClobFactory("org.seasar.doma.NClobFactory", "java.sql.NClob"),
+ SQLXMLFactory("org.seasar.doma.SQLXMLFactory", "java.sql.SQLXML"),
+ ;
+
+ fun matchFactoryAnnotation(fqName: String): Boolean = this.fqdn == fqName
+}
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/FactoryParamTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/FactoryParamTypeCheckProcessor.kt
new file mode 100644
index 00000000..fcc63a6b
--- /dev/null
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/FactoryParamTypeCheckProcessor.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright Doma Tools Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.domaframework.doma.intellij.inspection.dao.processor.paramtype
+
+import com.intellij.codeInspection.ProblemsHolder
+import com.intellij.psi.PsiArrayType
+import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
+import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamTypeResult
+import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamsCountResult
+import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamsEmptyResult
+import org.domaframework.doma.intellij.inspection.dao.processor.FactoryAnnotationType
+
+class FactoryParamTypeCheckProcessor(
+ private val psiDaoMethod: PsiDaoMethod,
+ private val shortName: String,
+) : ParamTypeCheckProcessor(psiDaoMethod, shortName) {
+ override fun checkParams(holder: ProblemsHolder) {
+ val daoType = psiDaoMethod.daoType
+ val factoryAnnotationType =
+ FactoryAnnotationType.entries.find { annotation ->
+ annotation.matchFactoryAnnotation(daoType.fqdn)
+ } ?: return
+
+ val params = method.parameterList.parameters
+ if (factoryAnnotationType.paramCount != params.size) {
+ val paramCountResult =
+ when (factoryAnnotationType) {
+ FactoryAnnotationType.ArrayFactory ->
+ ValidationMethodParamsCountResult(
+ method.nameIdentifier,
+ shortName,
+ )
+
+ else ->
+ ValidationMethodParamsEmptyResult(
+ method.nameIdentifier,
+ shortName,
+ )
+ }
+ paramCountResult.highlightElement(holder)
+ return
+ }
+
+ if (factoryAnnotationType == FactoryAnnotationType.ArrayFactory) {
+ val arrayParam = params.firstOrNull() ?: return
+ if (arrayParam.type !is PsiArrayType) {
+ ValidationMethodParamTypeResult(
+ arrayParam.nameIdentifier ?: return,
+ shortName,
+ "an array type",
+ ).highlightElement(holder)
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/UpdateParamTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/UpdateParamTypeCheckProcessor.kt
index a996b6d3..9daaad2d 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/UpdateParamTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/UpdateParamTypeCheckProcessor.kt
@@ -17,7 +17,7 @@ package org.domaframework.doma.intellij.inspection.dao.processor.paramtype
import com.intellij.codeInspection.ProblemsHolder
import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
-import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamEntityResult
+import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamTypeResult
import org.domaframework.doma.intellij.extension.getJavaClazz
import org.domaframework.doma.intellij.extension.psi.isEntity
@@ -61,9 +61,10 @@ class UpdateParamTypeCheckProcessor(
val paramClass = project.getJavaClazz(param?.type?.canonicalText ?: "")
val identifier = param?.nameIdentifier ?: return
if (paramClass == null || !paramClass.isEntity()) {
- ValidationMethodParamEntityResult(
+ ValidationMethodParamTypeResult(
identifier,
shortName,
+ "an entity",
).highlightElement(holder)
}
}
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchReturnTypeCheckProcessor.kt
similarity index 98%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchReturnTypeCheckProcessor.kt
index 163bd429..16e914d4 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/BatchReturnTypeCheckProcessor.kt
@@ -29,7 +29,7 @@ import org.domaframework.doma.intellij.extension.getJavaClazz
* @property psiDaoMethod The target DAO method info to be checked.
* @property shortName The short name of inspection to check.
*/
-class BatchAnnotationReturnTypeCheckProcessor(
+class BatchReturnTypeCheckProcessor(
private val psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FactoryReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FactoryReturnTypeCheckProcessor.kt
new file mode 100644
index 00000000..2b5db84a
--- /dev/null
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FactoryReturnTypeCheckProcessor.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright Doma Tools Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.domaframework.doma.intellij.inspection.dao.processor.returntype
+
+import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
+import org.domaframework.doma.intellij.common.validation.result.ValidationResult
+import org.domaframework.doma.intellij.common.validation.result.ValidationReturnTypeResult
+import org.domaframework.doma.intellij.inspection.dao.processor.FactoryAnnotationType
+
+/**
+ * Processor for checking the return type of SqlProcessor annotation.
+ *
+ * @param psiDaoMethod The target DAO method info to be checked.
+ * @param shortName The short name of the inspection to check.
+ */
+class FactoryReturnTypeCheckProcessor(
+ private val psiDaoMethod: PsiDaoMethod,
+ private val shortName: String,
+) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
+ override fun checkReturnType(): ValidationResult? {
+ val daoType = psiDaoMethod.daoType
+ val factoryAnnotationType =
+ FactoryAnnotationType.entries.find { annotation ->
+ annotation.matchFactoryAnnotation(daoType.fqdn)
+ } ?: return null
+
+ val returnTypeResult =
+ ValidationReturnTypeResult(
+ method.nameIdentifier,
+ shortName,
+ factoryAnnotationType.returnType,
+ )
+
+ val returnType = method.returnType
+ return if (returnType?.canonicalText != factoryAnnotationType.returnType) {
+ returnTypeResult
+ } else {
+ null
+ }
+ }
+}
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionReturnTypeCheckProcessor.kt
similarity index 98%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionReturnTypeCheckProcessor.kt
index 349c2df1..07ecf50f 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionReturnTypeCheckProcessor.kt
@@ -27,7 +27,7 @@ import org.domaframework.doma.intellij.extension.getJavaClazz
import org.domaframework.doma.intellij.extension.psi.isDomain
import org.domaframework.doma.intellij.extension.psi.isEntity
-class FunctionAnnotationReturnTypeCheckProcessor(
+class FunctionReturnTypeCheckProcessor(
psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertReturnTypeCheckProcessor.kt
similarity index 98%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertReturnTypeCheckProcessor.kt
index 548ca22f..3d59720f 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/MultiInsertReturnTypeCheckProcessor.kt
@@ -31,7 +31,7 @@ import org.domaframework.doma.intellij.extension.psi.DomaAnnotationType
* @property psiDaoMethod The target DAO method info to be checked.
* @property shortName The short name of the inspection to check.
*/
-class MultiInsertAnnotationReturnTypeCheckProcessor(
+class MultiInsertReturnTypeCheckProcessor(
private val psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureReturnTypeCheckProcessor.kt
similarity index 96%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureReturnTypeCheckProcessor.kt
index 29054068..0ccd7a85 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureReturnTypeCheckProcessor.kt
@@ -19,7 +19,7 @@ import com.intellij.psi.PsiTypes
import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
import org.domaframework.doma.intellij.common.validation.result.ValidationResult
-class ScriptAnnotationReturnTypeCheckProcessor(
+class ProcedureReturnTypeCheckProcessor(
psiDaoMethod: PsiDaoMethod,
shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptReturnTypeCheckProcessor.kt
similarity index 96%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptReturnTypeCheckProcessor.kt
index fc24a6ac..4396bbe7 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ProcedureAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/ScriptReturnTypeCheckProcessor.kt
@@ -19,7 +19,7 @@ import com.intellij.psi.PsiTypes
import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
import org.domaframework.doma.intellij.common.validation.result.ValidationResult
-class ProcedureAnnotationReturnTypeCheckProcessor(
+class ScriptReturnTypeCheckProcessor(
psiDaoMethod: PsiDaoMethod,
shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectReturnTypeCheckProcessor.kt
similarity index 99%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectReturnTypeCheckProcessor.kt
index 8c1ebbb5..f30fe06d 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectReturnTypeCheckProcessor.kt
@@ -28,7 +28,7 @@ import org.domaframework.doma.intellij.extension.psi.isDomain
import org.domaframework.doma.intellij.extension.psi.isEntity
import org.domaframework.doma.intellij.inspection.dao.processor.StrategyParam
-class SelectAnnotationReturnTypeCheckProcessor(
+class SelectReturnTypeCheckProcessor(
private val psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorReturnTypeCheckProcessor.kt
similarity index 98%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorReturnTypeCheckProcessor.kt
index d9fc4a2d..0c5f7364 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SqlProcessorReturnTypeCheckProcessor.kt
@@ -30,7 +30,7 @@ import org.domaframework.doma.intellij.common.validation.result.ValidationSqlPro
* @param psiDaoMethod The target DAO method info to be checked.
* @param shortName The short name of the inspection to check.
*/
-class SqlProcessorAnnotationReturnTypeCheckProcessor(
+class SqlProcessorReturnTypeCheckProcessor(
psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateAnnotationReturnTypeCheckProcessor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateReturnTypeCheckProcessor.kt
similarity index 99%
rename from src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateAnnotationReturnTypeCheckProcessor.kt
rename to src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateReturnTypeCheckProcessor.kt
index e14eedc2..fd81f6cf 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateAnnotationReturnTypeCheckProcessor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/UpdateReturnTypeCheckProcessor.kt
@@ -33,7 +33,7 @@ import org.domaframework.doma.intellij.extension.psi.psiClassType
* @property psiDaoMethod The target DAO method info to be checked.
* @property shortName The short name of inspection.
*/
-class UpdateAnnotationReturnTypeCheckProcessor(
+class UpdateReturnTypeCheckProcessor(
private val psiDaoMethod: PsiDaoMethod,
private val shortName: String,
) : ReturnTypeCheckerProcessor(psiDaoMethod, shortName) {
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodParamTypeInspectionVisitor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodParamTypeInspectionVisitor.kt
index 94262a6a..631defd9 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodParamTypeInspectionVisitor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodParamTypeInspectionVisitor.kt
@@ -23,6 +23,7 @@ import org.domaframework.doma.intellij.common.isJavaOrKotlinFileType
import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
import org.domaframework.doma.intellij.extension.psi.DomaAnnotationType
import org.domaframework.doma.intellij.inspection.dao.processor.paramtype.BatchParamTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.paramtype.FactoryParamTypeCheckProcessor
import org.domaframework.doma.intellij.inspection.dao.processor.paramtype.MultiInsertParamTypeCheckProcessor
import org.domaframework.doma.intellij.inspection.dao.processor.paramtype.ParamTypeCheckProcessor
import org.domaframework.doma.intellij.inspection.dao.processor.paramtype.ProcedureParamTypeCheckProcessor
@@ -47,6 +48,13 @@ class DaoMethodParamTypeInspectionVisitor(
private fun getParamTypeCheckProcessor(psiDaoMethod: PsiDaoMethod): ParamTypeCheckProcessor? =
when (psiDaoMethod.daoType) {
+ DomaAnnotationType.Select -> {
+ SelectParamTypeCheckProcessor(
+ psiDaoMethod,
+ this.shortName,
+ )
+ }
+
DomaAnnotationType.Insert, DomaAnnotationType.Update, DomaAnnotationType.Delete -> {
UpdateParamTypeCheckProcessor(psiDaoMethod, this.shortName)
}
@@ -76,12 +84,15 @@ class DaoMethodParamTypeInspectionVisitor(
)
}
- DomaAnnotationType.Select -> {
- SelectParamTypeCheckProcessor(
+ DomaAnnotationType.ArrayFactory, DomaAnnotationType.BlobFactory, DomaAnnotationType.ClobFactory,
+ DomaAnnotationType.NClobFactory, DomaAnnotationType.SQLXMLFactory,
+ -> {
+ FactoryParamTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
}
+
DomaAnnotationType.Sql, DomaAnnotationType.Unknown -> null
}
}
diff --git a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodReturnTypeInspectionVisitor.kt b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodReturnTypeInspectionVisitor.kt
index 48c90a7c..e50ec7bb 100644
--- a/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodReturnTypeInspectionVisitor.kt
+++ b/src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/visitor/DaoMethodReturnTypeInspectionVisitor.kt
@@ -22,15 +22,16 @@ import org.domaframework.doma.intellij.common.dao.getDaoClass
import org.domaframework.doma.intellij.common.isJavaOrKotlinFileType
import org.domaframework.doma.intellij.common.psi.PsiDaoMethod
import org.domaframework.doma.intellij.extension.psi.DomaAnnotationType
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.BatchAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.FunctionAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.MultiInsertAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.ProcedureAnnotationReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.BatchReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.FactoryReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.FunctionReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.MultiInsertReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.ProcedureReturnTypeCheckProcessor
import org.domaframework.doma.intellij.inspection.dao.processor.returntype.ReturnTypeCheckerProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.ScriptAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.SelectAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.SqlProcessorAnnotationReturnTypeCheckProcessor
-import org.domaframework.doma.intellij.inspection.dao.processor.returntype.UpdateAnnotationReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.ScriptReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.SelectReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.SqlProcessorReturnTypeCheckProcessor
+import org.domaframework.doma.intellij.inspection.dao.processor.returntype.UpdateReturnTypeCheckProcessor
class DaoMethodReturnTypeInspectionVisitor(
private val holder: ProblemsHolder,
@@ -50,45 +51,55 @@ class DaoMethodReturnTypeInspectionVisitor(
private fun getReturnTypeCheckProcessor(psiDaoMethod: PsiDaoMethod): ReturnTypeCheckerProcessor? =
when (psiDaoMethod.daoType) {
DomaAnnotationType.Select -> {
- SelectAnnotationReturnTypeCheckProcessor(
+ SelectReturnTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
}
+
DomaAnnotationType.Insert, DomaAnnotationType.Update, DomaAnnotationType.Delete -> {
- UpdateAnnotationReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
+ UpdateReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
}
DomaAnnotationType.BatchInsert, DomaAnnotationType.BatchUpdate, DomaAnnotationType.BatchDelete -> {
- BatchAnnotationReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
+ BatchReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
}
DomaAnnotationType.Procedure -> {
- ProcedureAnnotationReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
+ ProcedureReturnTypeCheckProcessor(psiDaoMethod, this.shortName)
}
DomaAnnotationType.SqlProcessor -> {
- SqlProcessorAnnotationReturnTypeCheckProcessor(
+ SqlProcessorReturnTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
}
DomaAnnotationType.MultiInsert ->
- MultiInsertAnnotationReturnTypeCheckProcessor(
+ MultiInsertReturnTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
DomaAnnotationType.Script -> {
- ScriptAnnotationReturnTypeCheckProcessor(
+ ScriptReturnTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
}
DomaAnnotationType.Function -> {
- FunctionAnnotationReturnTypeCheckProcessor(
+ FunctionReturnTypeCheckProcessor(
+ psiDaoMethod,
+ this.shortName,
+ )
+ }
+
+ DomaAnnotationType.ArrayFactory, DomaAnnotationType.BlobFactory, DomaAnnotationType.ClobFactory,
+ DomaAnnotationType.NClobFactory, DomaAnnotationType.SQLXMLFactory,
+ -> {
+ FactoryReturnTypeCheckProcessor(
psiDaoMethod,
this.shortName,
)
diff --git a/src/main/resources/messages/DomaToolsBundle.properties b/src/main/resources/messages/DomaToolsBundle.properties
index 4dbafc48..97977d2e 100644
--- a/src/main/resources/messages/DomaToolsBundle.properties
+++ b/src/main/resources/messages/DomaToolsBundle.properties
@@ -26,7 +26,7 @@ inspection.invalid.dao.select.param.notFound.strategy.stream=When you use the "j
inspection.invalid.dao.returnType.immutable=If a method annotated with @{0} targets immutable entities for insertion, the return type must be {1}<{2}>
inspection.invalid.dao.params.count=The number of parameters must be one
inspection.invalid.dao.params.empty=The number of parameters must be zero
-inspection.invalid.dao.params.entity=The parameter type must be an entity class
+inspection.invalid.dao.params.type=The parameter type must be {0}
inspection.invalid.dao.procedure.params.type=The parameter type annotated with @{0} must be "{1}"
inspection.invalid.dao.params.require.type=When you annotate the method with @{0}, the {1} parameter is required for the method
inspection.invalid.dao.params.require.iterable.entity=The argument must be an Iterable subclass that has an Entity class as a parameter
diff --git a/src/main/resources/messages/DomaToolsBundle_ja.properties b/src/main/resources/messages/DomaToolsBundle_ja.properties
index f569300c..766be3b4 100644
--- a/src/main/resources/messages/DomaToolsBundle_ja.properties
+++ b/src/main/resources/messages/DomaToolsBundle_ja.properties
@@ -24,7 +24,7 @@ inspection.invalid.dao.select.param.notFound.strategy.stream=\u300Cjava.util.fun
inspection.invalid.dao.returnType.immutable=@{0}\u304C\u4ED8\u4E0E\u3055\u308C\u305F\u30E1\u30BD\u30C3\u30C9\u304C\u4E0D\u5909\u306A\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u30AF\u30E9\u30B9\u3092\u5F15\u6570\u306B\u6301\u3064\u5834\u5408\u3001\u623B\u308A\u5024\u306F {1}<{2}>\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
inspection.invalid.dao.params.count=\u5F15\u6570\u306E\u6570\u306F1\u3064\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
inspection.invalid.dao.params.empty=\u5F15\u6570\u306E\u6570\u306F0\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
-inspection.invalid.dao.params.entity=\u5F15\u6570\u306E\u578B\u306F\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u30AF\u30E9\u30B9\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
+inspection.invalid.dao.params=\u5F15\u6570\u306E\u578B\u306F{0}\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
inspection.invalid.dao.procedure.params.type=@{0}\u304C\u4ED8\u4E0E\u3055\u308C\u305F\u5F15\u6570\u306E\u578B\u306F"{1}"\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
inspection.invalid.dao.params.require.type=@{0}\u304C\u4ED8\u4E0E\u3055\u308C\u305F\u5834\u5408\u3001\u305D\u306E\u30E1\u30BD\u30C3\u30C9\u306B{1}\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059
inspection.invalid.dao.params.require.iterable.entity=\u5F15\u6570\u306F\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u30AF\u30E9\u30B9\u3092\u578B\u5F15\u6570\u306B\u6301\u3064Iterable\u306E\u30B5\u30D6\u30AF\u30E9\u30B9\u3067\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093
diff --git a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationParamTypeCheckInspectionTest.kt b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationParamTypeCheckInspectionTest.kt
index 6292e4c2..c1758469 100644
--- a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationParamTypeCheckInspectionTest.kt
+++ b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationParamTypeCheckInspectionTest.kt
@@ -24,13 +24,14 @@ import org.domaframework.doma.intellij.inspection.dao.inspector.DaoMethodParamTy
class AnnotationParamTypeCheckInspectionTest : DomaSqlTest() {
private val testDaoNames =
listOf(
+ "SelectParamTestDao",
"InsertUpdateDeleteParamTestDao",
"BatchInsertUpdateDeleteParamTestDao",
"MultiInsertParamTestDao",
"ProcedureParamTestDao",
"ScriptParamTestDao",
"SqlProcessorParamTestDao",
- "SelectParamTestDao",
+ "FactoryParamTestDao",
)
private val daoPackage = "inspection/paramtype"
@@ -80,4 +81,9 @@ class AnnotationParamTypeCheckInspectionTest : DomaSqlTest() {
val dao = findDaoClass("$daoPackage.SqlProcessorParamTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
+
+ fun testFactoryParam() {
+ val dao = findDaoClass("$daoPackage.FactoryParamTestDao")
+ myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
+ }
}
diff --git a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationReturnTypeCheckInspectionTest.kt b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationReturnTypeCheckInspectionTest.kt
index e96cb1c2..9ed509e5 100644
--- a/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationReturnTypeCheckInspectionTest.kt
+++ b/src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationReturnTypeCheckInspectionTest.kt
@@ -31,6 +31,7 @@ class AnnotationReturnTypeCheckInspectionTest : DomaSqlTest() {
"SqlProcessorReturnTypeTestDao",
"ProcedureReturnTypeTestDao",
"FunctionReturnTypeTestDao",
+ "FactoryReturnTypeTestDao",
)
private val daoPackage = "inspection/returntype"
@@ -52,33 +53,38 @@ class AnnotationReturnTypeCheckInspectionTest : DomaSqlTest() {
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testUpdateAnnotationReturnTypeCheckProcessor() {
+ fun testUpdateReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.UpdateReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testBatchAnnotationReturnTypeCheckProcessor() {
+ fun testBatchReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.BatchReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testMultiInsertAnnotationReturnTypeCheckProcessor() {
+ fun testMultiInsertReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.MultiInsertReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testSqlProcessorAnnotationReturnTypeCheckProcessor() {
+ fun testSqlProcessorReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.SqlProcessorReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testProcedureAnnotationReturnTypeCheckProcessor() {
+ fun testProcedureReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.ProcedureReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
- fun testFunctionAnnotationReturnTypeCheckProcessor() {
+ fun testFunctionReturnTypeCheckProcessor() {
val dao = findDaoClass("$daoPackage.FunctionReturnTypeTestDao")
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
}
+
+ fun testFactoryReturnTypeCheckProcessor() {
+ val dao = findDaoClass("$daoPackage.FactoryReturnTypeTestDao")
+ myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
+ }
}
diff --git a/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/FactoryParamTestDao.java b/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/FactoryParamTestDao.java
new file mode 100644
index 00000000..7374e07f
--- /dev/null
+++ b/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/FactoryParamTestDao.java
@@ -0,0 +1,45 @@
+package doma.example.dao.inspection.paramtype;
+
+import org.seasar.doma.*;
+import java.sql.*;
+import java.util.List;
+
+@Dao
+public interface FactoryParamTestDao {
+
+ @ArrayFactory(typeName = "integer")
+ Array createIntegerArray(Integer[] elements);
+
+ @ArrayFactory(typeName = "integer")
+ Array create();
+
+ @ArrayFactory(typeName = "text")
+ Array createString2DArray(String[][] elements);
+
+ @ArrayFactory(typeName = "text")
+ Array createStringList(List elements);
+
+ @BlobFactory
+ Blob createBlob();
+
+ @BlobFactory
+ Blob createBlobWithParam(Integer id);
+
+ @ClobFactory
+ Clob createClob();
+
+ @ClobFactory
+ Clob createClobWithParam(Integer id);
+
+ @NClobFactory
+ NClob createNClob();
+
+ @NClobFactory
+ NClob createNClobWithParam(Integer id);
+
+ @SQLXMLFactory
+ SQLXML createSQLXML();
+
+ @SQLXMLFactory
+ SQLXML createSQLXMLWithParam(Integer id);
+}
\ No newline at end of file
diff --git a/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/InsertUpdateDeleteParamTestDao.java b/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/InsertUpdateDeleteParamTestDao.java
index 429a7e75..4a8cd618 100644
--- a/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/InsertUpdateDeleteParamTestDao.java
+++ b/src/test/testData/src/main/java/doma/example/dao/inspection/paramtype/InsertUpdateDeleteParamTestDao.java
@@ -14,7 +14,7 @@ public interface InsertUpdateDeleteParamTestDao {
int insertEntity(Packet packet);
@Insert
- int insertPrimitive(Integer id);
+ int insertPrimitive(Integer id);
@Update
int updateNoParams();
diff --git a/src/test/testData/src/main/java/doma/example/dao/inspection/returntype/FactoryReturnTypeTestDao.java b/src/test/testData/src/main/java/doma/example/dao/inspection/returntype/FactoryReturnTypeTestDao.java
new file mode 100644
index 00000000..e3ffde64
--- /dev/null
+++ b/src/test/testData/src/main/java/doma/example/dao/inspection/returntype/FactoryReturnTypeTestDao.java
@@ -0,0 +1,42 @@
+package doma.example.dao.inspection.returntype;
+
+import org.seasar.doma.*;
+import java.sql.*;
+import java.util.List;
+
+@Dao
+public interface FactoryReturnTypeTestDao {
+
+ @ArrayFactory(typeName = "integer")
+ Array createIntegerArray(Integer[] elements);
+
+ @ArrayFactory(typeName = "text")
+ Array createString2DArray(String[][] elements);
+
+ @ArrayFactory(typeName = "text")
+ List createStringList(Integer[] elements);
+
+ @BlobFactory
+ Blob createBlob();
+
+ @BlobFactory
+ Integer createBlobWithInteger();
+
+ @ClobFactory
+ Clob createClob();
+
+ @ClobFactory
+ Integer createClobWithInteger();
+
+ @NClobFactory
+ NClob createNClob();
+
+ @NClobFactory
+ Integer createNClobWithInteger();
+
+ @SQLXMLFactory
+ SQLXML createSQLXML();
+
+ @SQLXMLFactory
+ Integer createSQLXMLWithInteger();
+}
\ No newline at end of file