MapPlatformClassToKotlinFix to not hold descriptors directly

This commit is contained in:
Valentin Kipyatkov
2015-10-14 22:45:32 +03:00
parent 9bb159d4bc
commit 670b278891
@@ -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>()
}
} }
} }