Skip to content

Commit 90cb937

Browse files
committed
Refactor ForItemElementDocumentationProvider for improved validation and documentation generation
1 parent b1cf7df commit 90cb937

File tree

1 file changed

+45
-56
lines changed

1 file changed

+45
-56
lines changed

src/main/kotlin/org/domaframework/doma/intellij/document/ForItemElementDocumentationProvider.kt

Lines changed: 45 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,17 @@ class ForItemElementDocumentationProvider : AbstractDocumentationProvider() {
5454
val currentForItem = ForItem(originalElement)
5555
val forDirectiveExpr = currentForItem.getParentForDirectiveExpr()
5656
if (forDirectiveExpr != null) {
57-
if (forDirectiveExpr.getForItem()?.textOffset != originalElement.textOffset) {
58-
val declarationClassType =
59-
forDirectiveInspection.validateFieldAccessByForItem(
60-
listOf(originalElement),
61-
skipSelf = false,
62-
)
63-
if (declarationClassType != null) {
64-
generateDocumentInForDirective(
65-
declarationClassType,
66-
forDirectiveExpr,
67-
originalElement,
68-
result,
69-
)
70-
}
71-
} else {
72-
val declarationSide = forDirectiveExpr.getForItemDeclaration() ?: return ""
73-
val children = declarationSide.getDeclarationChildren()
74-
generateDocumentInForItem(
57+
val declarationClassType =
58+
forDirectiveInspection.validateFieldAccessByForItem(
59+
listOf(originalElement),
60+
skipSelf = false,
61+
)
62+
if (declarationClassType != null) {
63+
generateDocumentInForDirective(
7564
forDirectiveInspection,
65+
declarationClassType,
66+
forDirectiveExpr,
7667
originalElement,
77-
children,
7868
result,
7969
)
8070
}
@@ -85,35 +75,30 @@ class ForItemElementDocumentationProvider : AbstractDocumentationProvider() {
8575
}
8676

8777
private fun generateDocumentInForItem(
88-
forDirectiveInspection: ForDirectiveInspection,
8978
originalElement: PsiElement,
9079
declarationChildren: List<SqlElIdExpr>,
80+
declarationClassType: PsiParentClass,
9181
result: MutableList<String?>,
9282
) {
93-
val declarationClassType =
94-
forDirectiveInspection.validateFieldAccessByForItem(listOf(originalElement), false)
95-
if (declarationClassType is ValidationCompleteResult) {
96-
val parentClass = declarationClassType.parentClass
97-
val forItemValidator =
98-
SqlElForItemFieldAccessorChildElementValidator(
99-
declarationChildren,
100-
parentClass,
101-
)
102-
val declarationClassTypeResult = forItemValidator.validateChildren()
103-
if (declarationClassTypeResult is ValidationCompleteResult) {
104-
var resultParent = declarationClassTypeResult.parentClass
105-
var classType: PsiClassType? = resultParent.type as? PsiClassType
106-
if (classType != null &&
107-
PsiClassTypeUtil.isIterableType(classType, originalElement.project)
108-
) {
109-
classType = classType.parameters.firstOrNull() as? PsiClassType
110-
}
111-
if (classType != null) {
112-
resultParent = PsiParentClass(classType)
113-
result.add("${generateTypeLink(resultParent)} ${originalElement.text}")
114-
}
83+
val parentClass = declarationClassType
84+
val forItemValidator =
85+
SqlElForItemFieldAccessorChildElementValidator(
86+
declarationChildren,
87+
parentClass,
88+
)
89+
forItemValidator.validateChildren(complete = { lastType ->
90+
var resultParent = lastType
91+
var classType: PsiClassType? = resultParent.type as? PsiClassType
92+
if (classType != null &&
93+
PsiClassTypeUtil.isIterableType(classType, originalElement.project)
94+
) {
95+
classType = classType.parameters.firstOrNull() as? PsiClassType
11596
}
116-
}
97+
if (classType != null) {
98+
resultParent = PsiParentClass(classType)
99+
result.add("${generateTypeLink(resultParent)} ${originalElement.text}")
100+
}
101+
})
117102
}
118103

119104
private fun generateDocumentInBindVariable(
@@ -130,6 +115,7 @@ class ForItemElementDocumentationProvider : AbstractDocumentationProvider() {
130115
}
131116

132117
private fun generateDocumentInForDirective(
118+
forDirectiveInspection: ForDirectiveInspection,
133119
declarationClassType: ValidationResult,
134120
forDirectiveExpr: SqlElForDirective,
135121
originalElement: PsiElement,
@@ -138,10 +124,22 @@ class ForItemElementDocumentationProvider : AbstractDocumentationProvider() {
138124
val parentClass = declarationClassType.parentClass
139125
val parentType = parentClass?.type as? PsiClassType
140126

141-
if (forDirectiveExpr.getForItem()?.textOffset == originalElement.textOffset) {
127+
if (forDirectiveExpr.getForItem()?.textOffset != originalElement.textOffset) {
142128
generateDocumentForItemSelf(parentType, originalElement, result)
143129
} else {
144-
result.add("${generateTypeLink(parentClass)} ${originalElement.text}")
130+
val declarationSide = forDirectiveExpr.getForItemDeclaration() ?: return
131+
val children = declarationSide.getDeclarationChildren()
132+
133+
val declarationClassType =
134+
forDirectiveInspection.validateFieldAccessByForItem(listOf(originalElement), false)
135+
if (declarationClassType is ValidationCompleteResult) {
136+
generateDocumentInForItem(
137+
originalElement,
138+
children,
139+
declarationClassType.parentClass,
140+
result,
141+
)
142+
}
145143
}
146144
}
147145

@@ -150,17 +148,8 @@ class ForItemElementDocumentationProvider : AbstractDocumentationProvider() {
150148
originalElement: PsiElement,
151149
result: MutableList<String?>,
152150
) {
153-
val targetClassType =
154-
if (parentType != null &&
155-
PsiClassTypeUtil.isIterableType(parentType, originalElement.project)
156-
) {
157-
parentType.parameters.firstOrNull()
158-
} else {
159-
null
160-
}
161-
162-
if (targetClassType != null) {
163-
val forItemParentClassType = PsiParentClass(targetClassType)
151+
if (parentType != null) {
152+
val forItemParentClassType = PsiParentClass(parentType)
164153
result.add("${generateTypeLink(forItemParentClassType)} ${originalElement.text}")
165154
}
166155
}

0 commit comments

Comments
 (0)