Skip to content

Commit fea91a5

Browse files
authored
Merge pull request #350 from domaframework/fix/check-returntype-datatype
Support for Using `@DataType`-Annotated Records in DAO Method Return and Parameter Types
2 parents 3d2b458 + 62a61d8 commit fea91a5

File tree

14 files changed

+219
-10
lines changed

14 files changed

+219
-10
lines changed

src/main/kotlin/org/domaframework/doma/intellij/common/util/DomaClassName.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ enum class DomaClassName(
6767
SELECT_TYPE("org.seasar.doma.SelectType"),
6868

6969
ENTITY("org.seasar.doma.Entity"),
70+
DATATYPE("org.seasar.doma.DataType"),
7071
;
7172

7273
fun isTargetClassNameStartsWith(paramTypeCanonicalNames: String): Boolean = paramTypeCanonicalNames.startsWith(this.className)

src/main/kotlin/org/domaframework/doma/intellij/common/util/TypeUtil.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiType
2222
import org.domaframework.doma.intellij.common.psi.PsiTypeChecker
2323
import org.domaframework.doma.intellij.extension.getJavaClazz
2424
import org.domaframework.doma.intellij.extension.psi.getClassAnnotation
25+
import org.domaframework.doma.intellij.extension.psi.isDataType
2526
import org.domaframework.doma.intellij.extension.psi.isDomain
2627
import org.domaframework.doma.intellij.extension.psi.isEntity
2728

@@ -73,6 +74,17 @@ object TypeUtil {
7374
return clazz?.isDomain() == true
7475
}
7576

77+
/**
78+
* Checks if the given type is a data type.
79+
*/
80+
fun isDataType(
81+
type: PsiType?,
82+
project: Project,
83+
): Boolean {
84+
val clazz = type?.canonicalText?.let { project.getJavaClazz(it) }
85+
return clazz?.isDataType() == true
86+
}
87+
7688
/**
7789
* Checks if the given type is a valid Map<String, Object>.
7890
*/

src/main/kotlin/org/domaframework/doma/intellij/extension/psi/PsiClassExtension.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ fun PsiClass.isEntity(): Boolean = this.getClassAnnotation(DomaClassName.ENTITY.
5050

5151
fun PsiClass.isDomain(): Boolean = this.getClassAnnotation(DomaClassName.DOMAIN.className) != null
5252

53+
fun PsiClass.isDataType(): Boolean = this.getClassAnnotation(DomaClassName.DATATYPE.className) != null && this.isRecord
54+
5355
fun PsiClassType.getSuperType(superClassName: String): PsiClassType? {
5456
var parent: PsiClassType? = this
5557
while (parent != null && !parent.canonicalText.startsWith(superClassName)) {

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/TypeCheckerProcessor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.domaframework.doma.intellij.common.psi.PsiTypeChecker
2626
import org.domaframework.doma.intellij.common.util.DomaClassName
2727
import org.domaframework.doma.intellij.extension.getJavaClazz
2828
import org.domaframework.doma.intellij.extension.psi.getSuperType
29+
import org.domaframework.doma.intellij.extension.psi.isDataType
2930
import org.domaframework.doma.intellij.extension.psi.isDomain
3031

3132
/**
@@ -90,12 +91,12 @@ abstract class TypeCheckerProcessor(
9091
val optionalParam = paramClassType.parameters.firstOrNull()
9192
return optionalParam?.let {
9293
val optionalParamClass = project.getJavaClazz(it.canonicalText)
93-
optionalParamClass?.isDomain() == true || PsiTypeChecker.isBaseClassType(it)
94+
optionalParamClass?.isDomain() == true || optionalParamClass?.isDataType() == true || PsiTypeChecker.isBaseClassType(it)
9495
} == true
9596
}
9697

9798
val paramClass = project.getJavaClazz(paramType.canonicalText)
98-
return paramClass?.isDomain() == true
99+
return paramClass?.isDomain() == true || paramClass?.isDataType() == true
99100
}
100101

101102
protected fun checkMapType(paramTypeCanonicalText: String): Boolean {

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/cheker/ProcedureFunctionResultSetParamAnnotationTypeChecker.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.domaframework.doma.intellij.common.util.DomaClassName
2626
import org.domaframework.doma.intellij.common.validation.result.ValidationMethodParamsSupportGenericParamResult
2727
import org.domaframework.doma.intellij.common.validation.result.ValidationMethodProcedureParamTypeResult
2828
import org.domaframework.doma.intellij.extension.getJavaClazz
29+
import org.domaframework.doma.intellij.extension.psi.isDataType
2930
import org.domaframework.doma.intellij.extension.psi.isDomain
3031
import org.domaframework.doma.intellij.extension.psi.isEntity
3132

@@ -46,14 +47,15 @@ class ProcedureFunctionResultSetParamAnnotationTypeChecker(
4647
val optionalParamClass = project.getJavaClazz(it.canonicalText)
4748
optionalParamClass?.isDomain() == true ||
4849
optionalParamClass?.isEntity() == true ||
50+
optionalParamClass?.isDataType() == true ||
4951
PsiTypeChecker.isBaseClassType(
5052
it,
5153
)
5254
} == true
5355
}
5456

5557
val paramClass = project.getJavaClazz(paramType.canonicalText)
56-
return paramClass?.isDomain() == true
58+
return paramClass?.isDomain() == true || paramClass?.isDataType() == true
5759
}
5860

5961
override fun checkParam(
@@ -101,7 +103,7 @@ class ProcedureFunctionResultSetParamAnnotationTypeChecker(
101103

102104
val paramClass = project.getJavaClazz(listParamType.canonicalText)
103105

104-
if (checkParamType(listParamType) || paramClass?.isEntity() == true) return
106+
if (checkParamType(listParamType) || paramClass?.isEntity() == true || paramClass?.isDataType() == true) return
105107
result.highlightElement(holder)
106108
}
107109
}

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/BatchParamTypeCheckProcessor.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,17 @@ class BatchParamTypeCheckProcessor(
8686

8787
val iterableClassType = param.type as? PsiClassType
8888
iterableClassType?.parameters?.firstOrNull()?.let { iterableParam ->
89-
if (!TypeUtil.isEntity(iterableParam, project)) {
90-
resultParamType.highlightElement(holder)
89+
if (psiDaoMethod.useSqlAnnotation() || psiDaoMethod.sqlFileOption) {
90+
if (!TypeUtil.isEntity(iterableParam, project) &&
91+
!TypeUtil.isDomain(iterableParam, project) &&
92+
!TypeUtil.isDataType(iterableParam, project)
93+
) {
94+
resultParamType.highlightElement(holder)
95+
}
96+
} else {
97+
if (!TypeUtil.isEntity(iterableParam, project)) {
98+
resultParamType.highlightElement(holder)
99+
}
91100
}
92101
return
93102
}

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/paramtype/SelectParamTypeCheckProcessor.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.domaframework.doma.intellij.common.validation.result.ValidationMethod
2727
import org.domaframework.doma.intellij.common.validation.result.ValidationMethodSelectStrategyParamResult
2828
import org.domaframework.doma.intellij.extension.getJavaClazz
2929
import org.domaframework.doma.intellij.extension.psi.getSuperClassType
30+
import org.domaframework.doma.intellij.extension.psi.isDataType
3031
import org.domaframework.doma.intellij.extension.psi.isDomain
3132
import org.domaframework.doma.intellij.extension.psi.isEntity
3233
import org.domaframework.doma.intellij.inspection.dao.processor.StrategyParam
@@ -49,12 +50,13 @@ class SelectParamTypeCheckProcessor(
4950
val optionalParamClass = project.getJavaClazz(it.canonicalText)
5051
optionalParamClass?.isDomain() == true ||
5152
PsiTypeChecker.isBaseClassType(it) ||
52-
optionalParamClass?.isEntity() == true
53+
optionalParamClass?.isEntity() == true ||
54+
optionalParamClass?.isDataType() == true
5355
} == true
5456
}
5557

5658
val paramClass = project.getJavaClazz(paramType.canonicalText)
57-
return paramClass?.isDomain() == true || paramClass?.isEntity() == true
59+
return paramClass?.isDomain() == true || paramClass?.isEntity() == true || paramClass?.isDataType() == true
5860
}
5961

6062
override fun checkParams(holder: ProblemsHolder) {

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/FunctionReturnTypeCheckProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class FunctionReturnTypeCheckProcessor(
6767
}
6868
}
6969

70-
if (TypeUtil.isDomain(checkType, project) || TypeUtil.isEntity(checkType, project)) {
70+
if (TypeUtil.isDomain(checkType, project) || TypeUtil.isEntity(checkType, project) || TypeUtil.isDataType(checkType, project)) {
7171
return null
7272
}
7373

src/main/kotlin/org/domaframework/doma/intellij/inspection/dao/processor/returntype/SelectReturnTypeCheckProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class SelectReturnTypeCheckProcessor(
9191
}
9292
}
9393

94-
if (TypeUtil.isDomain(checkType, project) || TypeUtil.isEntity(checkType, project)) {
94+
if (TypeUtil.isDomain(checkType, project) || TypeUtil.isEntity(checkType, project) || TypeUtil.isDataType(checkType, project)) {
9595
return null
9696
}
9797

src/test/kotlin/org/domaframework/doma/intellij/inspection/dao/AnnotationParamTypeCheckInspectionTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class AnnotationParamTypeCheckInspectionTest : DomaSqlTest() {
3232
"ScriptParamTestDao",
3333
"SqlProcessorParamTestDao",
3434
"FactoryParamTestDao",
35+
"DataTypeParamTypeTestDao",
3536
)
3637
private val daoPackage = "inspection/paramtype"
3738

@@ -43,6 +44,7 @@ class AnnotationParamTypeCheckInspectionTest : DomaSqlTest() {
4344
addOtherJavaFile("collector", "HogeCollector.java")
4445
addOtherJavaFile("function", "HogeFunction.java")
4546
addOtherJavaFile("function", "HogeBiFunction.java")
47+
addOtherJavaFile("domain", "Salary.java")
4648
testDaoNames.forEach { daoName ->
4749
addDaoJavaFile("$daoPackage/$daoName.java")
4850
}
@@ -87,4 +89,9 @@ class AnnotationParamTypeCheckInspectionTest : DomaSqlTest() {
8789
val dao = findDaoClass("$daoPackage.FactoryParamTestDao")
8890
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
8991
}
92+
93+
fun testDataTypeParam() {
94+
val dao = findDaoClass("$daoPackage.DataTypeParamTypeTestDao")
95+
myFixture.testHighlighting(false, false, false, dao.containingFile.virtualFile)
96+
}
9097
}

0 commit comments

Comments
 (0)