diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterActionFactory.kt index 03f976e86a3..471c74f0003 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterActionFactory.kt @@ -50,6 +50,8 @@ import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getExpressionForTypeGuess import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull +import org.jetbrains.kotlin.psi.JetDelegationSpecifier +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType object CreateParameterActionFactory: JetSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { @@ -78,13 +80,20 @@ object CreateParameterActionFactory: JetSingleIntentionActionFactory() { // todo: skip lambdas for now because Change Signature doesn't apply to them yet val container = refExpr.parents(false) - .filter { it is JetNamedFunction || it is JetPropertyAccessor || it is JetClassBody || it is JetClassInitializer } + .filter { + it is JetNamedFunction || it is JetPropertyAccessor || it is JetClassBody || it is JetClassInitializer || + it is JetDelegationSpecifier + } .firstOrNull() ?.let { when { it is JetNamedFunction && varExpected, it is JetPropertyAccessor -> chooseContainingClass(it) it is JetClassInitializer -> it.getParent()?.getParent() as? JetClass + it is JetDelegationSpecifier -> { + val klass = it.getStrictParentOfType() + if (klass != null && !klass.isTrait() && klass !is JetEnumEntry) klass else null + } it is JetClassBody -> { val klass = it.getParent() as? JetClass when { diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterParameterFromClassDelegationSpecifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterParameterFromClassDelegationSpecifier.kt new file mode 100644 index 00000000000..a5d9c99160b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/afterParameterFromClassDelegationSpecifier.kt @@ -0,0 +1,9 @@ +// "Create parameter 'b'" "true" + +open class A(val a: Int) { + +} + +class B(b: Int) : A(b) { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromClassDelegationSpecifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromClassDelegationSpecifier.kt new file mode 100644 index 00000000000..5cd39985fc6 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromClassDelegationSpecifier.kt @@ -0,0 +1,9 @@ +// "Create parameter 'b'" "true" + +open class A(val a: Int) { + +} + +class B: A(b) { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromEnumEntryDelegationSpecifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromEnumEntryDelegationSpecifier.kt new file mode 100644 index 00000000000..36abff1bfd5 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromEnumEntryDelegationSpecifier.kt @@ -0,0 +1,7 @@ +// "Create parameter 'x'" "false" +// ERROR: Unresolved reference: x +// ACTION: Create property 'x' + +enum class E(n: Int) { + X: E(x) +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromObjectDelegationSpecifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromObjectDelegationSpecifier.kt new file mode 100644 index 00000000000..12a7e5e340a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromObjectDelegationSpecifier.kt @@ -0,0 +1,11 @@ +// "Create parameter 'b'" "false" +// ERROR: Unresolved reference: b +// ACTION: Create property 'b' + +open class A(val a: Int) { + +} + +object B: A(b) { + +} \ 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 ec87dab8b44..ef74610d1e8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2417,6 +2417,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeParameterFromClassDelegationSpecifier.kt") + public void testParameterFromClassDelegationSpecifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromClassDelegationSpecifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeParameterFromEnumEntryDelegationSpecifier.kt") + public void testParameterFromEnumEntryDelegationSpecifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromEnumEntryDelegationSpecifier.kt"); + doTest(fileName); + } + + @TestMetadata("beforeParameterFromObjectDelegationSpecifier.kt") + public void testParameterFromObjectDelegationSpecifier() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeParameterFromObjectDelegationSpecifier.kt"); + doTest(fileName); + } + @TestMetadata("beforeQualifiedInFun.kt") public void testQualifiedInFun() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeQualifiedInFun.kt");