Skip to content

Commit d514560

Browse files
committed
read lock
1 parent 898264a commit d514560

File tree

3 files changed

+25
-19
lines changed

3 files changed

+25
-19
lines changed

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/discovery/JvmPsiUtils.kt

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@ import com.intellij.psi.PsiAnnotation
44
import com.intellij.psi.PsiClass
55
import com.intellij.psi.PsiMethod
66
import com.intellij.psi.impl.source.PsiExtensibleClass
7-
import org.digma.intellij.plugin.common.ReadActions
7+
import com.intellij.util.concurrency.annotations.RequiresReadLock
88
import org.digma.intellij.plugin.psi.PsiUtils
99
import org.jetbrains.uast.UClass
1010
import org.jetbrains.uast.UFile
1111
import org.jetbrains.uast.UMethod
1212
import org.jetbrains.uast.getParentOfType
1313
import org.jetbrains.uast.toUElementOfType
1414
import java.util.function.Predicate
15-
import java.util.function.Supplier
1615

1716
private const val OBJECT_CLASS_FQN = "java.lang.Object"
1817

19-
18+
@RequiresReadLock(generateAssertion = false)
2019
fun 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)
5554
fun 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)
6060
fun 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)
7171
fun 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)
8584
fun 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)
9997
fun 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)
109108
fun 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)
125125
fun 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)
141142
fun 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)
152154
fun 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)
158160
fun toFileUri(psiMethod: PsiMethod): String {
159161
val containingFile = psiMethod.containingFile
160162
return containingFile?.let {

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/discovery/endpoint/AbstractJaxrsFrameworkEndpointDiscover.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.intellij.psi.search.impl.VirtualFileEnumeration
2020
import com.intellij.psi.search.searches.AnnotatedElementsSearch
2121
import com.intellij.psi.search.searches.OverridingMethodsSearch
2222
import com.intellij.psi.util.PsiTreeUtil
23+
import com.intellij.util.concurrency.annotations.RequiresReadLock
2324
import kotlinx.coroutines.ensureActive
2425
import org.digma.intellij.plugin.common.SearchScopeProvider
2526
import org.digma.intellij.plugin.common.TextRangeUtils
@@ -184,6 +185,7 @@ abstract class AbstractJaxrsFrameworkEndpointDiscover(private val project: Proje
184185
}
185186
}
186187

188+
@RequiresReadLock(generateAssertion = false)
187189
private fun handleCandidateMethods(candidateMethods: Collection<PsiMethod>): Set<EndpointInfo> {
188190
val retSet = mutableSetOf<EndpointInfo>()
189191
candidateMethods.forEach { currPsiMethod ->

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/discovery/endpoint/GrpcFrameworkEndpointDiscovery.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.intellij.psi.PsiMethod
1010
import com.intellij.psi.SmartPointerManager
1111
import com.intellij.psi.SmartPsiElementPointer
1212
import com.intellij.psi.search.searches.ClassInheritorsSearch
13+
import com.intellij.util.concurrency.annotations.RequiresReadLock
1314
import kotlinx.coroutines.ensureActive
1415
import org.digma.intellij.plugin.common.SearchScopeProvider
1516
import org.digma.intellij.plugin.common.TextRangeUtils
@@ -78,6 +79,7 @@ open class GrpcFrameworkEndpointDiscovery(private val project: Project) : Endpoi
7879
}
7980

8081

82+
@RequiresReadLock(generateAssertion = false)
8183
private fun addEndpointMethods(grpcServerClass: PsiClass): List<EndpointInfo> {
8284

8385
val grpcServiceName: String = evaluateServiceName(grpcServerClass)

0 commit comments

Comments
 (0)