Create from usage: Create constructor parameter by reference in delegation specifier
#KT-6601 Fixed
This commit is contained in:
+10
-1
@@ -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 {
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
// "Create parameter 'b'" "true"
|
||||
|
||||
open class A(val a: Int) {
|
||||
|
||||
}
|
||||
|
||||
class B(b: Int) : A(b) {
|
||||
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
// "Create parameter 'b'" "true"
|
||||
|
||||
open class A(val a: Int) {
|
||||
|
||||
}
|
||||
|
||||
class B: A(<caret>b) {
|
||||
|
||||
}
|
||||
+7
@@ -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)
|
||||
}
|
||||
+11
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user