No KotlinType reference in ChangeParameterTypeFix

This commit is contained in:
Valentin Kipyatkov
2016-03-29 18:43:53 +03:00
parent d8993069c0
commit 9e5bbc5ef4
@@ -24,22 +24,27 @@ import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.refactoring.changeSignature.*
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinTypeInfo
import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.KotlinType
class ChangeParameterTypeFix(element: KtParameter, private val type: KotlinType) : KotlinQuickFixAction<KtParameter>(element) {
class ChangeParameterTypeFix(element: KtParameter, type: KotlinType) : KotlinQuickFixAction<KtParameter>(element) {
private val typePresentation = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type)
private val typeInfo = KotlinTypeInfo(isCovariant = false, text = IdeDescriptorRenderers.SOURCE_CODE_FOR_TYPE_ARGUMENTS.renderType(type))
private val containingDeclarationName: String?
private val isPrimaryConstructorParameter: Boolean
init {
val declaration = PsiTreeUtil.getParentOfType(element, KtNamedDeclaration::class.java)
val declarationFQName = declaration?.fqName
isPrimaryConstructorParameter = declaration is KtPrimaryConstructor
containingDeclarationName = if (declarationFQName != null) declarationFQName.asString() else declaration?.name
this.containingDeclarationName = declaration?.fqName?.asString() ?: declaration?.name
this.isPrimaryConstructorParameter = declaration is KtPrimaryConstructor
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
@@ -47,23 +52,22 @@ class ChangeParameterTypeFix(element: KtParameter, private val type: KotlinType)
}
override fun getText(): String {
val renderedType = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type)
return if (isPrimaryConstructorParameter)
KotlinBundle.message("change.primary.constructor.parameter.type", element.name, containingDeclarationName, renderedType)
KotlinBundle.message("change.primary.constructor.parameter.type", element.name, containingDeclarationName, typePresentation)
else
KotlinBundle.message("change.function.parameter.type", element.name, containingDeclarationName, renderedType)
KotlinBundle.message("change.function.parameter.type", element.name, containingDeclarationName, typePresentation)
}
override fun getFamilyName() = KotlinBundle.message("change.type.family")
public override operator fun invoke(project: Project, editor: Editor?, file: KtFile) {
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val function = element.getStrictParentOfType<KtFunction>() ?: return
val parameterIndex = function.valueParameters.indexOf(element)
val context = function.analyze()
val descriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, function] as? FunctionDescriptor ?: return
val configuration = object : KotlinChangeSignatureConfiguration {
override fun configure(originalDescriptor: KotlinMethodDescriptor) = originalDescriptor.apply {
parameters[if (receiver != null) parameterIndex + 1 else parameterIndex].currentTypeInfo = KotlinTypeInfo(false, type)
parameters[if (receiver != null) parameterIndex + 1 else parameterIndex].currentTypeInfo = typeInfo
}
override fun performSilently(affectedFunctions: Collection<PsiElement>) = true