diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionLiteralSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionLiteralSignatureFix.kt index 3de8ecd30ec..fe9ccdcf24c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionLiteralSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionLiteralSignatureFix.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.quickfix +import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -62,7 +63,7 @@ class ChangeFunctionLiteralSignatureFix private constructor( } companion object : KotlinSingleIntentionActionFactoryWithDelegate() { - data class Data(val functionLiteral: KtFunctionLiteral, val descriptor: FunctionDescriptor, val parameterTypes: List) + data class Data(val descriptor: FunctionDescriptor, val parameterTypes: List) override fun getElementOfInterest(diagnostic: Diagnostic): KtFunctionLiteral? { val diagnosticWithParameters = Errors.EXPECTED_PARAMETERS_NUMBER_MISMATCH.cast(diagnostic) @@ -72,10 +73,10 @@ class ChangeFunctionLiteralSignatureFix private constructor( override fun extractFixData(element: KtFunctionLiteral, diagnostic: Diagnostic): Data? { val descriptor = element.resolveToDescriptor() as? FunctionDescriptor ?: return null val parameterTypes = Errors.EXPECTED_PARAMETERS_NUMBER_MISMATCH.cast(diagnostic).b - return Data(element, descriptor, parameterTypes) + return Data(descriptor, parameterTypes) } - override fun createFix(data: Data) - = ChangeFunctionLiteralSignatureFix(data.functionLiteral, data.descriptor, data.parameterTypes) + override fun createFix(originalElement: KtFunctionLiteral, data: Data): IntentionAction? + = ChangeFunctionLiteralSignatureFix(originalElement, data.descriptor, data.parameterTypes) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt index ec60860a601..0a26e8aaa21 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt @@ -76,44 +76,39 @@ abstract class ChangeFunctionSignatureFix( } } - companion object : KotlinSingleIntentionActionFactoryWithDelegate() { - data class Data(val callElement: KtCallElement, val descriptor: CallableDescriptor) - + companion object : KotlinSingleIntentionActionFactoryWithDelegate() { override fun getElementOfInterest(diagnostic: Diagnostic): KtCallElement? { return diagnostic.psiElement.getNonStrictParentOfType() } - override fun extractFixData(element: KtCallElement, diagnostic: Diagnostic): Data? { - val descriptor = DiagnosticFactory.cast(diagnostic, Errors.TOO_MANY_ARGUMENTS, Errors.NO_VALUE_FOR_PARAMETER).a - return Data(element, descriptor) + override fun extractFixData(element: KtCallElement, diagnostic: Diagnostic): CallableDescriptor? { + return DiagnosticFactory.cast(diagnostic, Errors.TOO_MANY_ARGUMENTS, Errors.NO_VALUE_FOR_PARAMETER).a } - override fun createFix(data: Data) = createFix(data.callElement, data.descriptor) - - private fun createFix(callElement: KtCallElement, descriptor: CallableDescriptor): ChangeFunctionSignatureFix? { - val functionDescriptor = descriptor as? FunctionDescriptor - ?: (descriptor as? ValueParameterDescriptor)?.containingDeclaration as? FunctionDescriptor - ?: return null + override fun createFix(originalElement: KtCallElement, data: CallableDescriptor): ChangeFunctionSignatureFix? { + val functionDescriptor = data as? FunctionDescriptor + ?: (data as? ValueParameterDescriptor)?.containingDeclaration as? FunctionDescriptor + ?: return null if (functionDescriptor.kind == SYNTHESIZED) return null - if (descriptor is ValueParameterDescriptor) { - return RemoveParameterFix(callElement, functionDescriptor, descriptor) + if (data is ValueParameterDescriptor) { + return RemoveParameterFix(originalElement, functionDescriptor, data) } else { val parameters = functionDescriptor.valueParameters - val arguments = callElement.valueArguments + val arguments = originalElement.valueArguments if (arguments.size > parameters.size) { - val bindingContext = callElement.analyze() - val call = callElement.getCall(bindingContext) ?: return null + val bindingContext = originalElement.analyze() + val call = originalElement.getCall(bindingContext) ?: return null val argumentToParameter = call.mapArgumentsToParameters(functionDescriptor) val hasTypeMismatches = argumentToParameter.any { val (argument, parameter) = it val argumentType = argument.getArgumentExpression()?.let { bindingContext.getType(it) } argumentType == null || !KotlinTypeChecker.DEFAULT.isSubtypeOf(argumentType, parameter.type) } - return AddFunctionParametersFix(callElement, functionDescriptor, hasTypeMismatches) + return AddFunctionParametersFix(originalElement, functionDescriptor, hasTypeMismatches) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt index b2ca3107627..e12d763115f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt @@ -30,7 +30,7 @@ abstract class KotlinSingleIntentionActionFactoryWithDelegate() { - protected abstract fun createFix(data: D): IntentionAction? + protected abstract fun createFix(originalElement: E, data: D): IntentionAction? override final fun createFixes( originalElementPointer: SmartPsiElementPointer, @@ -38,8 +38,9 @@ abstract class KotlinSingleIntentionActionFactoryWithDelegate D? ): List { fun createAction(): IntentionAction? { + val originalElement = originalElementPointer.element ?: return null val data = quickFixDataFactory() ?: return null - return createFix(data) + return createFix(originalElement, data) } val delegateFactory = when (actionPriority) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/MapPlatformClassToKotlinFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/MapPlatformClassToKotlinFix.kt index 9461fcb3146..66898416803 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/MapPlatformClassToKotlinFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/MapPlatformClassToKotlinFix.kt @@ -149,8 +149,7 @@ class MapPlatformClassToKotlinFix( } companion object : KotlinSingleIntentionActionFactoryWithDelegate() { - data class Data(val element: KtReferenceExpression, - val platformClass: ClassDescriptor, + data class Data(val platformClass: ClassDescriptor, val possibleClasses: Collection) override fun getElementOfInterest(diagnostic: Diagnostic): KtReferenceExpression? @@ -160,11 +159,11 @@ class MapPlatformClassToKotlinFix( val context = element.analyze(BodyResolveMode.PARTIAL) val platformClass = resolveToClass(element, context) ?: return null val possibleClasses = Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN.cast(diagnostic).a - return Data(element, platformClass, possibleClasses) + return Data(platformClass, possibleClasses) } - override fun createFix(data: Data): IntentionAction? { - return MapPlatformClassToKotlinFix(data.element, data.platformClass, data.possibleClasses) + override fun createFix(originalElement: KtReferenceExpression, data: Data): IntentionAction? { + return MapPlatformClassToKotlinFix(originalElement, data.platformClass, data.possibleClasses) } private fun resolveToClass(referenceExpression: KtReferenceExpression, context: BindingContext): ClassDescriptor? { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt index 17d9130c410..69e064f62aa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt @@ -30,7 +30,7 @@ data class CreateParameterData( ) abstract class CreateParameterFromUsageFactory: KotlinSingleIntentionActionFactoryWithDelegate>() { - override fun createFix(data: CreateParameterData): IntentionAction? { + override fun createFix(originalElement: E, data: CreateParameterData): IntentionAction? { return CreateParameterFromUsageFix( data.parameterInfo.callableDescriptor as FunctionDescriptor, data.parameterInfo,