@@ -24,11 +24,14 @@ import com.intellij.psi.util.CachedValuesManager
2424import com.intellij.psi.util.PsiModificationTracker
2525import com.intellij.psi.util.PsiTreeUtil
2626import com.intellij.psi.util.PsiTypesUtil
27+ import com.intellij.psi.util.elementType
2728import org.domaframework.doma.intellij.common.PluginLoggerUtil
2829import org.domaframework.doma.intellij.common.isSupportFileType
2930import org.domaframework.doma.intellij.common.psi.PsiParentClass
3031import org.domaframework.doma.intellij.common.psi.PsiStaticElement
32+ import org.domaframework.doma.intellij.psi.SqlElIdExpr
3133import org.domaframework.doma.intellij.psi.SqlElStaticFieldAccessExpr
34+ import org.domaframework.doma.intellij.psi.SqlTypes
3235
3336class SqlElStaticFieldReference (
3437 element : PsiElement ,
@@ -73,37 +76,73 @@ class SqlElStaticFieldReference(
7376 // Jump from field or method to definition (assuming the top element is static)
7477 val staticAccessParent =
7578 PsiTreeUtil .getParentOfType(staticDirection, SqlElStaticFieldAccessExpr ::class .java)
76- if (staticAccessParent != null ) {
77- val firstChildText =
78- staticAccessParent.children
79- .firstOrNull()
80- ?.text ? : " "
81- val psiStaticElement =
82- PsiStaticElement (
83- firstChildText,
84- file,
85- )
86- val javaClazz = psiStaticElement.getRefClazz() ? : return null
87- val psiParentClass = PsiParentClass (PsiTypesUtil .getClassType(javaClazz))
88- psiParentClass.findField(elementName)?.let {
89- PluginLoggerUtil .countLogging(
90- this ::class .java.simpleName,
91- " ReferenceStaticField" ,
92- " Reference" ,
93- startTime,
94- )
95- return it
96- }
97- psiParentClass.findMethod(elementName)?.let {
98- PluginLoggerUtil .countLogging(
99- this ::class .java.simpleName,
100- " ReferenceStaticMethod" ,
101- " Reference" ,
102- startTime,
103- )
104- return it
79+ if (staticAccessParent == null ) return null
80+
81+ val firstChildText =
82+ staticAccessParent.children
83+ .firstOrNull()
84+ ?.text ? : " "
85+ val psiStaticElement =
86+ PsiStaticElement (
87+ firstChildText,
88+ file,
89+ )
90+ val javaClazz = psiStaticElement.getRefClazz() ? : return null
91+ var parentClass = PsiParentClass (PsiTypesUtil .getClassType(javaClazz))
92+
93+ val targetElements = getBlockCommentElements(element)
94+ if (targetElements.isEmpty()) return null
95+
96+ val topElm = targetElements.firstOrNull() as ? PsiElement ? : return null
97+ if (topElm.prevSibling.elementType != SqlTypes .AT_SIGN ) return null
98+ var index = 1
99+ for (staticFieldAccess in targetElements) {
100+ if (index >= targetElements.size) {
101+ parentClass.findField(elementName)?.let {
102+ PluginLoggerUtil .countLogging(
103+ this ::class .java.simpleName,
104+ " ReferenceStaticField" ,
105+ " Reference" ,
106+ startTime,
107+ )
108+ return it
109+ }
110+ parentClass.findMethod(elementName)?.let {
111+ PluginLoggerUtil .countLogging(
112+ this ::class .java.simpleName,
113+ " ReferenceStaticMethod" ,
114+ " Reference" ,
115+ startTime,
116+ )
117+ return it
118+ }
105119 }
120+
121+ val newParentType =
122+ parentClass.findField(staticFieldAccess.text)?.type
123+ ? : parentClass.findMethod(staticFieldAccess.text)?.returnType
124+ if (newParentType == null ) return null
125+
126+ parentClass = PsiParentClass (newParentType)
127+ index++
106128 }
107129 return null
108130 }
131+
132+ private fun getBlockCommentElements (element : PsiElement ): List <PsiElement > {
133+ val fieldAccessExpr = PsiTreeUtil .getParentOfType(element, SqlElStaticFieldAccessExpr ::class .java)
134+ val nodeElm =
135+ if (fieldAccessExpr != null ) {
136+ PsiTreeUtil
137+ .getChildrenOfType(
138+ fieldAccessExpr,
139+ SqlElIdExpr ::class .java,
140+ )?.filter { it.textOffset <= element.textOffset }
141+ } else {
142+ listOf (element)
143+ }
144+ return nodeElm
145+ ?.toList()
146+ ?.sortedBy { it.textOffset } ? : emptyList()
147+ }
109148}
0 commit comments