MapPlatformClassToKotlinFix to not hold descriptors directly
This commit is contained in:
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -147,15 +148,27 @@ class MapPlatformClassToKotlinFix(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object : JetSingleIntentionActionFactory() {
|
companion object : KotlinSingleIntentionActionFactoryWithDelegate<JetReferenceExpression, Data>() {
|
||||||
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
data class Data(val element: JetReferenceExpression,
|
||||||
val typeExpr = getImportOrUsageFromDiagnostic(diagnostic) ?: return null
|
val platformClass: ClassDescriptor,
|
||||||
|
val possibleClasses: Collection<ClassDescriptor>)
|
||||||
|
|
||||||
val context = typeExpr.analyze()
|
override fun getElementOfInterest(diagnostic: Diagnostic): JetReferenceExpression?
|
||||||
val platformClass = resolveToClass(typeExpr, context) ?: return null
|
= getImportOrUsageFromDiagnostic(diagnostic)
|
||||||
|
|
||||||
|
override fun extractFixData(element: JetReferenceExpression, diagnostic: Diagnostic): Data? {
|
||||||
|
val context = element.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val platformClass = resolveToClass(element, context) ?: return null
|
||||||
val possibleClasses = Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN.cast(diagnostic).a
|
val possibleClasses = Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN.cast(diagnostic).a
|
||||||
return MapPlatformClassToKotlinFix(typeExpr, platformClass, possibleClasses)
|
return Data(element, platformClass, possibleClasses)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createFix(data: Data): IntentionAction? {
|
||||||
|
return MapPlatformClassToKotlinFix(data.element, data.platformClass, data.possibleClasses)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resolveToClass(referenceExpression: JetReferenceExpression, context: BindingContext): ClassDescriptor? {
|
||||||
|
return referenceExpression.mainReference.resolveToDescriptors(context).firstIsInstanceOrNull<ClassDescriptor>()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getImportOrUsageFromDiagnostic(diagnostic: Diagnostic): JetReferenceExpression? {
|
private fun getImportOrUsageFromDiagnostic(diagnostic: Diagnostic): JetReferenceExpression? {
|
||||||
@@ -167,10 +180,5 @@ class MapPlatformClassToKotlinFix(
|
|||||||
(diagnostic.psiElement.getNonStrictParentOfType<JetUserType>() ?: return null).referenceExpression
|
(diagnostic.psiElement.getNonStrictParentOfType<JetUserType>() ?: return null).referenceExpression
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveToClass(referenceExpression: JetReferenceExpression, context: BindingContext): ClassDescriptor? {
|
|
||||||
return referenceExpression.mainReference.resolveToDescriptors(context).firstIsInstanceOrNull<ClassDescriptor>()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user