Skip to content

Commit 8b549de

Browse files
committed
Jump to class definition in jar file
1 parent b9c3180 commit 8b549de

File tree

3 files changed

+84
-38
lines changed

3 files changed

+84
-38
lines changed

src/main/kotlin/org/domaframework/doma/intellij/common/psi/PsiStaticElement.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
*/
1616
package org.domaframework.doma.intellij.common.psi
1717

18+
import com.intellij.psi.JavaPsiFacade
1819
import com.intellij.psi.PsiClass
1920
import com.intellij.psi.PsiFile
21+
import com.intellij.psi.search.GlobalSearchScope
2022
import org.domaframework.doma.intellij.extension.getJavaClazz
2123
import org.domaframework.doma.intellij.psi.SqlElExpr
2224
import org.jetbrains.kotlin.idea.base.util.module
@@ -26,7 +28,7 @@ import org.jetbrains.kotlin.idea.base.util.module
2628
*/
2729
class PsiStaticElement(
2830
elExprList: List<SqlElExpr>? = null,
29-
originalFile: PsiFile,
31+
private val originalFile: PsiFile,
3032
) {
3133
private var fqdn = elExprList?.joinToString(".") { e -> e.text } ?: ""
3234
private val module = originalFile.module
@@ -38,5 +40,10 @@ class PsiStaticElement(
3840
.substringBefore("@")
3941
}
4042

41-
fun getRefClazz(): PsiClass? = module?.getJavaClazz(true, fqdn)
43+
fun getRefClazz(): PsiClass? =
44+
module?.getJavaClazz(true, fqdn)
45+
?: JavaPsiFacade.getInstance(originalFile.project).findClass(
46+
fqdn,
47+
GlobalSearchScope.allScope(originalFile.project),
48+
)
4249
}

src/main/kotlin/org/domaframework/doma/intellij/reference/SqlElIdExprReference.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ class SqlElIdExprReference(
7171
startTime: Long,
7272
file: PsiFile,
7373
): PsiElement? {
74-
val targetElement = getBlockCommentElements(element)
75-
if (targetElement.isEmpty()) return null
74+
val targetElements = getBlockCommentElements(element)
75+
if (targetElements.isEmpty()) return null
7676

77-
val topElm = targetElement.firstOrNull() as? PsiElement ?: return null
77+
val topElm = targetElements.firstOrNull() as? PsiElement ?: return null
7878

7979
if (topElm.prevSibling.elementType == SqlTypes.AT_SIGN) return null
8080

@@ -92,14 +92,14 @@ class SqlElIdExprReference(
9292
val daoMethod = findDaoMethod(file) ?: return null
9393

9494
return when (element.textOffset) {
95-
targetElement.first().textOffset ->
95+
targetElements.first().textOffset ->
9696
getReferenceDaoMethodParameter(
9797
daoMethod,
9898
element,
9999
startTime,
100100
)
101101

102-
else -> getReferenceEntity(daoMethod, targetElement, startTime)
102+
else -> getReferenceEntity(daoMethod, targetElements, startTime)
103103
}
104104
}
105105

@@ -124,13 +124,13 @@ class SqlElIdExprReference(
124124

125125
private fun getReferenceDaoMethodParameter(
126126
daoMethod: PsiMethod,
127-
it: PsiElement,
127+
bindElement: PsiElement,
128128
startTime: Long,
129129
): PsiElement? {
130130
daoMethod
131131
.let { method ->
132132
method.methodParameters.firstOrNull { param ->
133-
param.name == it.text
133+
param.name == bindElement.text
134134
}
135135
}?.originalElement
136136
?.let { originalElm ->

src/main/kotlin/org/domaframework/doma/intellij/reference/SqlElStaticFieldReference.kt

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@ import com.intellij.psi.util.CachedValuesManager
2424
import com.intellij.psi.util.PsiModificationTracker
2525
import com.intellij.psi.util.PsiTreeUtil
2626
import com.intellij.psi.util.PsiTypesUtil
27+
import com.intellij.psi.util.elementType
2728
import org.domaframework.doma.intellij.common.PluginLoggerUtil
2829
import org.domaframework.doma.intellij.common.isSupportFileType
2930
import org.domaframework.doma.intellij.common.psi.PsiParentClass
3031
import org.domaframework.doma.intellij.common.psi.PsiStaticElement
32+
import org.domaframework.doma.intellij.psi.SqlElIdExpr
3133
import org.domaframework.doma.intellij.psi.SqlElStaticFieldAccessExpr
34+
import org.domaframework.doma.intellij.psi.SqlTypes
3235

3336
class 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

Comments
 (0)