Create from usage: Create constructor parameter by reference in delegation specifier

#KT-6601 Fixed
This commit is contained in:
Alexey Sedunov
2015-01-14 14:48:16 +03:00
parent 70b202dfa6
commit b40e657180
6 changed files with 64 additions and 1 deletions
@@ -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<JetClass>()
if (klass != null && !klass.isTrait() && klass !is JetEnumEntry) klass else null
}
it is JetClassBody -> {
val klass = it.getParent() as? JetClass
when {
@@ -0,0 +1,9 @@
// "Create parameter 'b'" "true"
open class A(val a: Int) {
}
class B(b: Int) : A(b) {
}
@@ -0,0 +1,9 @@
// "Create parameter 'b'" "true"
open class A(val a: Int) {
}
class B: A(<caret>b) {
}
@@ -0,0 +1,7 @@
// "Create parameter 'x'" "false"
// ERROR: Unresolved reference: x
// ACTION: Create property 'x'
enum class E(n: Int) {
X: E(<caret>x)
}
@@ -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(<caret>b) {
}
@@ -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");