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.quickfix.createFromUsage.callableBuilder.getExpressionForTypeGuess
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
|
import org.jetbrains.kotlin.psi.JetDelegationSpecifier
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
|
|
||||||
object CreateParameterActionFactory: JetSingleIntentionActionFactory() {
|
object CreateParameterActionFactory: JetSingleIntentionActionFactory() {
|
||||||
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
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
|
// todo: skip lambdas for now because Change Signature doesn't apply to them yet
|
||||||
val container = refExpr.parents(false)
|
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()
|
.firstOrNull()
|
||||||
?.let {
|
?.let {
|
||||||
when {
|
when {
|
||||||
it is JetNamedFunction && varExpected,
|
it is JetNamedFunction && varExpected,
|
||||||
it is JetPropertyAccessor -> chooseContainingClass(it)
|
it is JetPropertyAccessor -> chooseContainingClass(it)
|
||||||
it is JetClassInitializer -> it.getParent()?.getParent() as? JetClass
|
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 -> {
|
it is JetClassBody -> {
|
||||||
val klass = it.getParent() as? JetClass
|
val klass = it.getParent() as? JetClass
|
||||||
when {
|
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);
|
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")
|
@TestMetadata("beforeQualifiedInFun.kt")
|
||||||
public void testQualifiedInFun() throws Exception {
|
public void testQualifiedInFun() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeQualifiedInFun.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/beforeQualifiedInFun.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user