@@ -4,19 +4,18 @@ import com.intellij.psi.PsiAnnotation
44import com.intellij.psi.PsiClass
55import com.intellij.psi.PsiMethod
66import com.intellij.psi.impl.source.PsiExtensibleClass
7- import org.digma. intellij.plugin.common.ReadActions
7+ import com. intellij.util.concurrency.annotations.RequiresReadLock
88import org.digma.intellij.plugin.psi.PsiUtils
99import org.jetbrains.uast.UClass
1010import org.jetbrains.uast.UFile
1111import org.jetbrains.uast.UMethod
1212import org.jetbrains.uast.getParentOfType
1313import org.jetbrains.uast.toUElementOfType
1414import java.util.function.Predicate
15- import java.util.function.Supplier
1615
1716private const val OBJECT_CLASS_FQN = " java.lang.Object"
1817
19-
18+ @RequiresReadLock(generateAssertion = false )
2019fun getClassSimpleName (uClass : UClass ): String {
2120
2221 // try a few ways to get the class simple name
@@ -51,12 +50,13 @@ fun getClassSimpleName(uClass: UClass): String {
5150
5251}
5352
54-
53+ @RequiresReadLock(generateAssertion = false )
5554fun findMethodInClass (cls : UClass , methodId : String ): UMethod ? {
5655 return getMethodsInClass(cls).firstOrNull { uMethod: UMethod -> methodId == createMethodCodeObjectId(uMethod) }
5756}
5857
5958@Suppress(" UnstableApiUsage" )
59+ @RequiresReadLock(generateAssertion = false )
6060fun findMethodInClass (psiClass : PsiClass , methodName : String , methodPredicate : Predicate <PsiMethod >): PsiMethod ? {
6161 val methods = psiClass.findMethodsByName(methodName)
6262 for (method in methods) {
@@ -67,35 +67,33 @@ fun findMethodInClass(psiClass: PsiClass, methodName: String, methodPredicate: P
6767 return null
6868}
6969
70-
70+ @RequiresReadLock(generateAssertion = false )
7171fun getMethodsInClass (cls : UClass ): Collection <UMethod > {
72- if (cls.sourcePsi is PsiExtensibleClass ) {
72+ return if (cls.sourcePsi is PsiExtensibleClass ) {
7373 // Avoid cases when there are generated methods and/or constructors such as lombok creates,
7474 // see issue https://github.com/digma-ai/digma-intellij-plugin/issues/833
7575 // see issue https://youtrack.jetbrains.com/issue/IDEA-323198
76- val ownMethods = ReadActions .ensureReadAction( Supplier {
77- (cls.sourcePsi as PsiExtensibleClass ).ownMethods
78- })
79- return ownMethods.map { psiMethod : PsiMethod -> psiMethod.toUElementOfType< UMethod >() !! }
76+ val ownMethods = (cls.sourcePsi as PsiExtensibleClass ).ownMethods
77+ ownMethods.mapNotNull { psiMethod : PsiMethod -> psiMethod.toUElementOfType< UMethod >() }
78+ } else {
79+ cls.methods.asList()
8080 }
81- return cls.methods.asList()
8281}
8382
84-
83+ @RequiresReadLock(generateAssertion = false )
8584fun getMethodsInClass (psiClass : PsiClass ): List <PsiMethod > {
86- if (psiClass is PsiExtensibleClass ) {
85+ return if (psiClass is PsiExtensibleClass ) {
8786 // Avoid cases when there are generated methods and/or constructors such as lombok creates,
8887 // see issue https://github.com/digma-ai/digma-intellij-plugin/issues/833
8988 // see issue https://youtrack.jetbrains.com/issue/IDEA-323198
90- return ReadActions .ensureReadAction( Supplier {
91- psiClass.ownMethods
92- } )
89+ psiClass.ownMethods
90+ } else {
91+ psiClass.methods.asList( )
9392 }
94- return psiClass.methods.asList()
9593}
9694
9795
98- // must be called in read access
96+ @RequiresReadLock(generateAssertion = false )
9997fun hasOneOfAnnotations (psiClass : PsiClass , vararg annotationsFqn : String ): Boolean {
10098 annotationsFqn.forEach {
10199 val annotObj = psiClass.getAnnotation(it)
@@ -106,6 +104,7 @@ fun hasOneOfAnnotations(psiClass: PsiClass, vararg annotationsFqn: String): Bool
106104 return false
107105}
108106
107+ @RequiresReadLock(generateAssertion = false )
109108fun findNearestAnnotation (psiMethod : PsiMethod , annotationFqn : String ): PsiAnnotation ? {
110109 val annotClass = psiMethod.getAnnotation(annotationFqn)
111110 if (annotClass != null ) {
@@ -122,6 +121,7 @@ fun findNearestAnnotation(psiMethod: PsiMethod, annotationFqn: String): PsiAnnot
122121 return null
123122}
124123
124+ @RequiresReadLock(generateAssertion = false )
125125fun findNearestAnnotation (psiClass : PsiClass , annotationFqn : String ): PsiAnnotation ? {
126126 val annotClass = psiClass.getAnnotation(annotationFqn)
127127 if (annotClass != null ) {
@@ -138,6 +138,7 @@ fun findNearestAnnotation(psiClass: PsiClass, annotationFqn: String): PsiAnnotat
138138 return null
139139}
140140
141+ @RequiresReadLock(generateAssertion = false )
141142fun climbUpToBaseClass (psiClass : PsiClass ): PsiClass {
142143 var prevCLass: PsiClass = psiClass
143144 var currentClass: PsiClass ? = psiClass
@@ -149,12 +150,13 @@ fun climbUpToBaseClass(psiClass: PsiClass): PsiClass {
149150 return currentClass ? : prevCLass
150151}
151152
153+ @RequiresReadLock(generateAssertion = false )
152154fun isBaseClass (psiClass : PsiClass ): Boolean {
153155 val superClass = psiClass.superClass
154156 return (superClass == null || superClass.qualifiedName.equals(OBJECT_CLASS_FQN ))
155157}
156158
157-
159+ @RequiresReadLock(generateAssertion = false )
158160fun toFileUri (psiMethod : PsiMethod ): String {
159161 val containingFile = psiMethod.containingFile
160162 return containingFile?.let {
0 commit comments