diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromCallActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromCallActionFactory.kt index d80a3f8c72c..056ff624729 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromCallActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableFromCallActionFactory.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getCall @@ -129,7 +130,9 @@ sealed class CreateCallableFromCallActionFactory( object Property: CreateCallableFromCallActionFactory() { override fun getElementOfInterest(diagnostic: Diagnostic): KtSimpleNameExpression? { - return getExpressionOfInterest(diagnostic) as? KtNameReferenceExpression + val refExpr = getExpressionOfInterest(diagnostic) as? KtNameReferenceExpression ?: return null + if (refExpr.getParentOfTypeAndBranch { callableReference } != null) return null + return refExpr } override fun doCreateCallableInfo( diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt index d789ddb17f4..3bd2239c343 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateLocalVariableActionFactory.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.* import org.jetbrains.kotlin.idea.util.application.executeCommand import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS +import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.types.Variance @@ -39,6 +40,7 @@ object CreateLocalVariableActionFactory: KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val refExpr = QuickFixUtil.getParentElementOfType(diagnostic, javaClass()) ?: return null if (refExpr.getQualifiedElement() != refExpr) return null + if (refExpr.getParentOfTypeAndBranch { callableReference } != null) return null val propertyName = refExpr.getReferencedName() diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterByRefActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterByRefActionFactory.kt index cb4eddf0a5e..f277a737da7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterByRefActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterByRefActionFactory.kt @@ -33,10 +33,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS -import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.parents +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.source.getPsi @@ -48,6 +45,7 @@ object CreateParameterByRefActionFactory : CreateParameterFromUsageFactory()) ?: return null if (refExpr.getQualifiedElement() != refExpr) return null + if (refExpr.getParentOfTypeAndBranch { callableReference } != null) return null return refExpr } diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/callableRef.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/callableRef.kt new file mode 100644 index 00000000000..91a6d540291 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/callableRef.kt @@ -0,0 +1,9 @@ +// "Create local variable 'foo'" "false" +// ACTION: Rename reference +// ACTION: Add 'f =' to argument +// ERROR: Unresolved reference: foo +fun test(f: (Int) -> Int) {} + +fun refer() { + val v = test(::foo) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/callableRef.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/callableRef.kt new file mode 100644 index 00000000000..9c89e83c4a9 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/callableRef.kt @@ -0,0 +1,9 @@ +// "Create parameter 'foo'" "false" +// ACTION: Rename reference +// ACTION: Add 'f =' to argument +// ERROR: Unresolved reference: foo +fun test(f: (Int) -> Int) {} + +fun refer() { + val v = test(::foo) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/callableRef.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/callableRef.kt new file mode 100644 index 00000000000..2bbf9b077ca --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/callableRef.kt @@ -0,0 +1,9 @@ +// "Create property 'foo'" "false" +// ACTION: Rename reference +// ACTION: Add 'f =' to argument +// ERROR: Unresolved reference: foo +fun test(f: (Int) -> Int) {} + +fun refer() { + val v = test(::foo) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 0b1cb8c6707..688cd7bf742 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2558,6 +2558,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("callableRef.kt") + public void testCallableRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/callableRef.kt"); + doTest(fileName); + } + @TestMetadata("inAccessor.kt") public void testInAccessor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/localVariable/inAccessor.kt"); @@ -2693,6 +2699,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("callableRef.kt") + public void testCallableRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/callableRef.kt"); + doTest(fileName); + } + @TestMetadata("inAccessorInClass.kt") public void testInAccessorInClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/inAccessorInClass.kt"); @@ -3071,6 +3083,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("callableRef.kt") + public void testCallableRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/callableRef.kt"); + doTest(fileName); + } + @TestMetadata("extensionRefInImport.kt") public void testExtensionRefInImport() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/extensionRefInImport.kt");