Replace usages of blocking lazy to LazyThreadSafetyMode.PUBLICATION in light classes to prevent potential deadlocks
This commit is contained in:
@@ -36,7 +36,7 @@ class KtLightAnnotation(
|
|||||||
private val owner: PsiAnnotationOwner
|
private val owner: PsiAnnotationOwner
|
||||||
) : PsiAnnotation by clsDelegate, KtLightElement<KtAnnotationEntry, PsiAnnotation> {
|
) : PsiAnnotation by clsDelegate, KtLightElement<KtAnnotationEntry, PsiAnnotation> {
|
||||||
inner class LightExpressionValue(private val delegate: PsiExpression) : PsiAnnotationMemberValue, PsiExpression by delegate {
|
inner class LightExpressionValue(private val delegate: PsiExpression) : PsiAnnotationMemberValue, PsiExpression by delegate {
|
||||||
val originalExpression: PsiElement? by lazy {
|
val originalExpression: PsiElement? by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
val nameAndValue = getStrictParentOfType<PsiNameValuePair>() ?: return@lazy null
|
val nameAndValue = getStrictParentOfType<PsiNameValuePair>() ?: return@lazy null
|
||||||
val annotationEntry = this@KtLightAnnotation.kotlinOrigin
|
val annotationEntry = this@KtLightAnnotation.kotlinOrigin
|
||||||
val context = LightClassGenerationSupport.getInstance(project).analyze(annotationEntry)
|
val context = LightClassGenerationSupport.getInstance(project).analyze(annotationEntry)
|
||||||
@@ -79,7 +79,7 @@ class KtLightAnnotation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
inner class LightArrayInitializerValue(private val delegate: PsiArrayInitializerMemberValue) : PsiArrayInitializerMemberValue by delegate {
|
inner class LightArrayInitializerValue(private val delegate: PsiArrayInitializerMemberValue) : PsiArrayInitializerMemberValue by delegate {
|
||||||
private val _initializers by lazy { delegate.initializers.map { wrapAnnotationValue(it) }.toTypedArray() }
|
private val _initializers by lazy(LazyThreadSafetyMode.PUBLICATION) { delegate.initializers.map { wrapAnnotationValue(it) }.toTypedArray() }
|
||||||
|
|
||||||
override fun getInitializers() = _initializers
|
override fun getInitializers() = _initializers
|
||||||
override fun getLanguage() = KotlinLanguage.INSTANCE
|
override fun getLanguage() = KotlinLanguage.INSTANCE
|
||||||
|
|||||||
+4
-4
@@ -129,7 +129,7 @@ open class KtLightClassForExplicitDeclaration(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _parent: PsiElement? by lazy {
|
private val _parent: PsiElement? by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
if (classOrObject.isLocal())
|
if (classOrObject.isLocal())
|
||||||
getLocalClassParent()
|
getLocalClassParent()
|
||||||
else if (classOrObject.isTopLevel())
|
else if (classOrObject.isTopLevel())
|
||||||
@@ -177,7 +177,7 @@ open class KtLightClassForExplicitDeclaration(
|
|||||||
return lightClassData as OutermostKotlinClassLightClassData
|
return lightClassData as OutermostKotlinClassLightClassData
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _containingFile: PsiFile by lazy {
|
private val _containingFile: PsiFile by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
val virtualFile = classOrObject.containingFile.virtualFile
|
val virtualFile = classOrObject.containingFile.virtualFile
|
||||||
assert(virtualFile != null) { "No virtual file for " + classOrObject.text }
|
assert(virtualFile != null) { "No virtual file for " + classOrObject.text }
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ open class KtLightClassForExplicitDeclaration(
|
|||||||
|
|
||||||
override fun getParent(): PsiElement? = _parent
|
override fun getParent(): PsiElement? = _parent
|
||||||
|
|
||||||
private val _typeParameterList: PsiTypeParameterList by lazy {
|
private val _typeParameterList: PsiTypeParameterList by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
LightClassUtil.buildLightTypeParameterList(this, classOrObject)
|
LightClassUtil.buildLightTypeParameterList(this, classOrObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,7 +257,7 @@ open class KtLightClassForExplicitDeclaration(
|
|||||||
|
|
||||||
override fun getQualifiedName(): String = classFqName.asString()
|
override fun getQualifiedName(): String = classFqName.asString()
|
||||||
|
|
||||||
private val _modifierList : PsiModifierList by lazy {
|
private val _modifierList : PsiModifierList by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
object : KtLightModifierListWithExplicitModifiers(this@KtLightClassForExplicitDeclaration, computeModifiers()) {
|
object : KtLightModifierListWithExplicitModifiers(this@KtLightClassForExplicitDeclaration, computeModifiers()) {
|
||||||
override val delegate: PsiAnnotationOwner
|
override val delegate: PsiAnnotationOwner
|
||||||
get() = this@KtLightClassForExplicitDeclaration.getDelegate().modifierList!!
|
get() = this@KtLightClassForExplicitDeclaration.getDelegate().modifierList!!
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ sealed class KtLightFieldImpl(
|
|||||||
override val clsDelegate: PsiField,
|
override val clsDelegate: PsiField,
|
||||||
private val containingClass: KtLightClass
|
private val containingClass: KtLightClass
|
||||||
) : LightElement(clsDelegate.manager, KotlinLanguage.INSTANCE), KtLightField {
|
) : LightElement(clsDelegate.manager, KotlinLanguage.INSTANCE), KtLightField {
|
||||||
private val lightIdentifier by lazy { KtLightIdentifier(this, kotlinOrigin as? KtNamedDeclaration) }
|
private val lightIdentifier by lazy(LazyThreadSafetyMode.PUBLICATION) { KtLightIdentifier(this, kotlinOrigin as? KtNamedDeclaration) }
|
||||||
|
|
||||||
@Throws(IncorrectOperationException::class)
|
@Throws(IncorrectOperationException::class)
|
||||||
override fun setInitializer(initializer: PsiExpression?) = throw IncorrectOperationException("Not supported")
|
override fun setInitializer(initializer: PsiExpression?) = throw IncorrectOperationException("Not supported")
|
||||||
@@ -72,7 +72,7 @@ sealed class KtLightFieldImpl(
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _modifierList by lazy {
|
private val _modifierList by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
if (lightMemberOrigin is LightMemberOriginForDeclaration)
|
if (lightMemberOrigin is LightMemberOriginForDeclaration)
|
||||||
clsDelegate.modifierList?.let { KtLightModifierList(it, this) }
|
clsDelegate.modifierList?.let { KtLightModifierList(it, this) }
|
||||||
else clsDelegate.modifierList
|
else clsDelegate.modifierList
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ sealed class KtLightMethodImpl(
|
|||||||
) : LightMethod(clsDelegate.manager, clsDelegate, containingClass), KtLightMethod {
|
) : LightMethod(clsDelegate.manager, clsDelegate, containingClass), KtLightMethod {
|
||||||
override val kotlinOrigin: KtDeclaration? get() = lightMethodOrigin?.originalElement as? KtDeclaration
|
override val kotlinOrigin: KtDeclaration? get() = lightMethodOrigin?.originalElement as? KtDeclaration
|
||||||
|
|
||||||
private val lightIdentifier by lazy { KtLightIdentifier(this, kotlinOrigin as? KtNamedDeclaration) }
|
private val lightIdentifier by lazy(LazyThreadSafetyMode.PUBLICATION) { KtLightIdentifier(this, kotlinOrigin as? KtNamedDeclaration) }
|
||||||
|
|
||||||
override fun getContainingClass(): KtLightClass = super.getContainingClass() as KtLightClass
|
override fun getContainingClass(): KtLightClass = super.getContainingClass() as KtLightClass
|
||||||
|
|
||||||
private val paramsList: CachedValue<PsiParameterList> by lazy {
|
private val paramsList: CachedValue<PsiParameterList> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
val cacheManager = CachedValuesManager.getManager(clsDelegate.project)
|
val cacheManager = CachedValuesManager.getManager(clsDelegate.project)
|
||||||
cacheManager.createCachedValue<PsiParameterList>({
|
cacheManager.createCachedValue<PsiParameterList>({
|
||||||
val parameterBuilder = LightParameterListBuilder(manager, KotlinLanguage.INSTANCE, this)
|
val parameterBuilder = LightParameterListBuilder(manager, KotlinLanguage.INSTANCE, this)
|
||||||
@@ -56,7 +56,7 @@ sealed class KtLightMethodImpl(
|
|||||||
}, false)
|
}, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val typeParamsList: CachedValue<PsiTypeParameterList> by lazy {
|
private val typeParamsList: CachedValue<PsiTypeParameterList> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
val cacheManager = CachedValuesManager.getManager(clsDelegate.project)
|
val cacheManager = CachedValuesManager.getManager(clsDelegate.project)
|
||||||
cacheManager.createCachedValue<PsiTypeParameterList>({
|
cacheManager.createCachedValue<PsiTypeParameterList>({
|
||||||
val origin = (lightMethodOrigin as? LightMemberOriginForDeclaration)?.originalElement
|
val origin = (lightMethodOrigin as? LightMemberOriginForDeclaration)?.originalElement
|
||||||
@@ -111,7 +111,7 @@ sealed class KtLightMethodImpl(
|
|||||||
throw IncorrectOperationException(JavaCoreBundle.message("psi.error.attempt.to.edit.class.file"))
|
throw IncorrectOperationException(JavaCoreBundle.message("psi.error.attempt.to.edit.class.file"))
|
||||||
}
|
}
|
||||||
|
|
||||||
private val _modifierList by lazy {
|
private val _modifierList by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||||
if (lightMethodOrigin is LightMemberOriginForDeclaration)
|
if (lightMethodOrigin is LightMemberOriginForDeclaration)
|
||||||
KtLightModifierList(clsDelegate.modifierList, this)
|
KtLightModifierList(clsDelegate.modifierList, this)
|
||||||
else clsDelegate.modifierList
|
else clsDelegate.modifierList
|
||||||
|
|||||||
Reference in New Issue
Block a user