Create from Usage: Add val to data class parameter
Also place new parameters on the new line if previous ones have line breaks #KT-21162 Fixed
This commit is contained in:
+5
-1
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.refactoring.canRefactor
|
|||||||
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes
|
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinTypeInfo
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinTypeInfo
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
@@ -58,11 +59,14 @@ object CreateParameterByNamedArgumentActionFactory: CreateParameterFromUsageFact
|
|||||||
} ?: anyType
|
} ?: anyType
|
||||||
if (paramType.hasTypeParametersToAdd(functionDescriptor, context)) return null
|
if (paramType.hasTypeParametersToAdd(functionDescriptor, context)) return null
|
||||||
|
|
||||||
|
val needVal = callable is KtPrimaryConstructor && ((callable.getContainingClassOrObject() as? KtClass)?.isData() ?: false)
|
||||||
|
|
||||||
val parameterInfo = KotlinParameterInfo(
|
val parameterInfo = KotlinParameterInfo(
|
||||||
callableDescriptor = functionDescriptor,
|
callableDescriptor = functionDescriptor,
|
||||||
name = name,
|
name = name,
|
||||||
originalTypeInfo = KotlinTypeInfo(false, paramType),
|
originalTypeInfo = KotlinTypeInfo(false, paramType),
|
||||||
defaultValueForCall = argumentExpression
|
defaultValueForCall = argumentExpression,
|
||||||
|
valOrVar = if (needVal) KotlinValVar.Val else KotlinValVar.None
|
||||||
)
|
)
|
||||||
|
|
||||||
return CreateParameterData(parameterInfo, element)
|
return CreateParameterData(parameterInfo, element)
|
||||||
|
|||||||
@@ -761,11 +761,25 @@ fun <ListType : KtElement> replaceListPsiAndKeepDelimiters(
|
|||||||
|
|
||||||
if (commonCount == 0) return originalList.listReplacer(newList)
|
if (commonCount == 0) return originalList.listReplacer(newList)
|
||||||
|
|
||||||
|
val lastOriginalParameter = oldParameters.last()
|
||||||
|
|
||||||
if (oldCount > commonCount) {
|
if (oldCount > commonCount) {
|
||||||
originalList.deleteChildRange(oldParameters[commonCount - 1].nextSibling, oldParameters.last())
|
originalList.deleteChildRange(oldParameters[commonCount - 1].nextSibling, lastOriginalParameter)
|
||||||
}
|
}
|
||||||
else if (newCount > commonCount) {
|
else if (newCount > commonCount) {
|
||||||
originalList.addRangeAfter(newParameters[commonCount - 1].nextSibling, newParameters.last(), oldParameters.last())
|
val psiBeforeLastParameter = lastOriginalParameter.prevSibling
|
||||||
|
val withMultiline = (psiBeforeLastParameter is PsiWhiteSpace || psiBeforeLastParameter is PsiComment) && psiBeforeLastParameter.textContains('\n')
|
||||||
|
val extraSpace = if (withMultiline) KtPsiFactory(originalList).createNewLine() else null
|
||||||
|
originalList.addRangeAfter(newParameters[commonCount - 1].nextSibling, newParameters.last(), lastOriginalParameter)
|
||||||
|
if (extraSpace != null) {
|
||||||
|
val addedItems = originalList.itemsFun().subList(commonCount, newCount)
|
||||||
|
for (addedItem in addedItems) {
|
||||||
|
val elementBefore = addedItem.prevSibling
|
||||||
|
if ((elementBefore !is PsiWhiteSpace && elementBefore !is PsiComment) || !elementBefore.textContains('\n')) {
|
||||||
|
addedItem.parent.addBefore(extraSpace, addedItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return originalList
|
return originalList
|
||||||
|
|||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
// "Create property 'parameter4' as constructor parameter" "true"
|
||||||
|
|
||||||
|
data class MyDto(
|
||||||
|
val parameter1:String,
|
||||||
|
val parameter2:String ="",
|
||||||
|
val parameter3:String =""
|
||||||
|
)
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
println(MyDto(parameter1 = "value1", <caret>parameter4 = "value4"))
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// "Create property 'parameter4' as constructor parameter" "true"
|
||||||
|
|
||||||
|
data class MyDto(
|
||||||
|
val parameter1: String,
|
||||||
|
val parameter2: String = "",
|
||||||
|
val parameter3: String = "",
|
||||||
|
val parameter4: String
|
||||||
|
)
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
println(MyDto(parameter1 = "value1", <caret>parameter4 = "value4"))
|
||||||
|
}
|
||||||
@@ -4248,6 +4248,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("dataClassPropertyByNamedArgument.kt")
|
||||||
|
public void testDataClassPropertyByNamedArgument() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/dataClassPropertyByNamedArgument.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inAccessorInClass.kt")
|
@TestMetadata("inAccessorInClass.kt")
|
||||||
public void testInAccessorInClass() throws Exception {
|
public void testInAccessorInClass() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/inAccessorInClass.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/parameter/inAccessorInClass.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user