KT-9839 related, secondary constructor to primary: comment restoration
(cherry picked from commit 998e39e)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
725df49c8c
commit
d1958be2a8
+10
-2
@@ -20,6 +20,7 @@ import com.intellij.openapi.editor.Editor
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
|
||||||
|
import org.jetbrains.kotlin.idea.util.CommentSaver
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
@@ -83,6 +84,7 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention<KtS
|
|||||||
val context = klass.analyzeFully()
|
val context = klass.analyzeFully()
|
||||||
val constructorDescriptor = context[BindingContext.CONSTRUCTOR, element] ?: return
|
val constructorDescriptor = context[BindingContext.CONSTRUCTOR, element] ?: return
|
||||||
val factory = KtPsiFactory(klass)
|
val factory = KtPsiFactory(klass)
|
||||||
|
val constructorCommentSaver = CommentSaver(element)
|
||||||
val constructorInClass = klass.createPrimaryConstructorIfAbsent()
|
val constructorInClass = klass.createPrimaryConstructorIfAbsent()
|
||||||
val constructor = factory.createPrimaryConstructor(element.modifierList?.text?.replace("\n", " "))
|
val constructor = factory.createPrimaryConstructor(element.modifierList?.text?.replace("\n", " "))
|
||||||
val parameterList = constructor.valueParameterList!!
|
val parameterList = constructor.valueParameterList!!
|
||||||
@@ -105,10 +107,12 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention<KtS
|
|||||||
val newParameter = factory.createParameter(parameter.text)
|
val newParameter = factory.createParameter(parameter.text)
|
||||||
val parameterDescriptor = context[BindingContext.VALUE_PARAMETER, parameter]
|
val parameterDescriptor = context[BindingContext.VALUE_PARAMETER, parameter]
|
||||||
val propertyDescriptor = parameterToPropertyMap[parameterDescriptor]
|
val propertyDescriptor = parameterToPropertyMap[parameterDescriptor]
|
||||||
|
var propertyCommentSaver: CommentSaver? = null
|
||||||
if (parameterDescriptor != null && propertyDescriptor != null) {
|
if (parameterDescriptor != null && propertyDescriptor != null) {
|
||||||
val property = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor) as? KtProperty
|
val property = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor) as? KtProperty
|
||||||
if (property != null) {
|
if (property != null) {
|
||||||
if (propertyDescriptor.name == parameterDescriptor.name && propertyDescriptor.type == parameterDescriptor.type) {
|
if (propertyDescriptor.name == parameterDescriptor.name && propertyDescriptor.type == parameterDescriptor.type) {
|
||||||
|
propertyCommentSaver = CommentSaver(property)
|
||||||
val valOrVar = if (property.isVar) factory.createVarKeyword() else factory.createValKeyword()
|
val valOrVar = if (property.isVar) factory.createVarKeyword() else factory.createValKeyword()
|
||||||
newParameter.addBefore(valOrVar, newParameter.nameIdentifier)
|
newParameter.addBefore(valOrVar, newParameter.nameIdentifier)
|
||||||
val propertyModifiers = property.modifierList?.text
|
val propertyModifiers = property.modifierList?.text
|
||||||
@@ -123,7 +127,9 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention<KtS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parameterList.addParameter(newParameter)
|
with (parameterList.addParameter(newParameter)) {
|
||||||
|
propertyCommentSaver?.restore(this)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val delegationCall = element.getDelegationCall()
|
val delegationCall = element.getDelegationCall()
|
||||||
@@ -140,7 +146,9 @@ class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention<KtS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constructorInClass.replace(constructor)
|
with (constructorInClass.replace(constructor)) {
|
||||||
|
constructorCommentSaver.restore(this)
|
||||||
|
}
|
||||||
element.delete()
|
element.delete()
|
||||||
if ((initializer?.body as? KtBlockExpression)?.statements?.isNotEmpty() ?: false) {
|
if ((initializer?.body as? KtBlockExpression)?.statements?.isNotEmpty() ?: false) {
|
||||||
initializer?.let { klass.addDeclaration(it) }
|
initializer?.let { klass.addDeclaration(it) }
|
||||||
|
|||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
class WithComments {
|
||||||
|
/**
|
||||||
|
* A very important property
|
||||||
|
*/
|
||||||
|
val veryImportant: Any
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A constructor
|
||||||
|
*/
|
||||||
|
constructor<caret>(/* Some parameter */veryImportant: Any) {
|
||||||
|
this.veryImportant = veryImportant
|
||||||
|
}
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
class WithComments/* Some parameter */
|
||||||
|
/**
|
||||||
|
* A constructor
|
||||||
|
*/(
|
||||||
|
/**
|
||||||
|
* A very important property
|
||||||
|
*/
|
||||||
|
val veryImportant: Any) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4774,6 +4774,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withComments.kt")
|
||||||
|
public void testWithComments() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withComments.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("withDelegation.kt")
|
@TestMetadata("withDelegation.kt")
|
||||||
public void testWithDelegation() throws Exception {
|
public void testWithDelegation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withDelegation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withDelegation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user