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