Create actual: add delegation to secondary constructor, if needed
#KT-26518 Fixed
This commit is contained in:
@@ -187,6 +187,7 @@ interface DescriptorRendererOptions {
|
|||||||
var normalizedVisibilities: Boolean
|
var normalizedVisibilities: Boolean
|
||||||
var renderDefaultVisibility: Boolean
|
var renderDefaultVisibility: Boolean
|
||||||
var renderDefaultModality: Boolean
|
var renderDefaultModality: Boolean
|
||||||
|
var renderConstructorDelegation: Boolean
|
||||||
var renderActualAnnotationPropertiesInPrimaryConstructor: Boolean
|
var renderActualAnnotationPropertiesInPrimaryConstructor: Boolean
|
||||||
var uninferredTypeParameterAsName: Boolean
|
var uninferredTypeParameterAsName: Boolean
|
||||||
var overrideRenderingPolicy: OverrideRenderingPolicy
|
var overrideRenderingPolicy: OverrideRenderingPolicy
|
||||||
|
|||||||
@@ -725,8 +725,8 @@ internal class DescriptorRendererImpl(
|
|||||||
if (renderConstructorKeyword) {
|
if (renderConstructorKeyword) {
|
||||||
builder.append(renderKeyword("constructor"))
|
builder.append(renderKeyword("constructor"))
|
||||||
}
|
}
|
||||||
|
val classDescriptor = constructor.containingDeclaration
|
||||||
if (secondaryConstructorsAsPrimary) {
|
if (secondaryConstructorsAsPrimary) {
|
||||||
val classDescriptor = constructor.containingDeclaration
|
|
||||||
if (renderConstructorKeyword) {
|
if (renderConstructorKeyword) {
|
||||||
builder.append(" ")
|
builder.append(" ")
|
||||||
}
|
}
|
||||||
@@ -736,6 +736,19 @@ internal class DescriptorRendererImpl(
|
|||||||
|
|
||||||
renderValueParameters(constructor.valueParameters, constructor.hasSynthesizedParameterNames(), builder)
|
renderValueParameters(constructor.valueParameters, constructor.hasSynthesizedParameterNames(), builder)
|
||||||
|
|
||||||
|
if (renderConstructorDelegation && !constructor.isPrimary && classDescriptor is ClassDescriptor) {
|
||||||
|
val primaryConstructor = classDescriptor.unsubstitutedPrimaryConstructor
|
||||||
|
if (primaryConstructor != null) {
|
||||||
|
val parametersWithoutDefault = primaryConstructor.valueParameters.filter {
|
||||||
|
!it.declaresDefaultValue() && it.varargElementType == null
|
||||||
|
}
|
||||||
|
if (parametersWithoutDefault.isNotEmpty()) {
|
||||||
|
builder.append(" : ").append(renderKeyword("this"))
|
||||||
|
builder.append(parametersWithoutDefault.joinToString(prefix = "(", postfix = ")", separator = ", ") { "" })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (secondaryConstructorsAsPrimary) {
|
if (secondaryConstructorsAsPrimary) {
|
||||||
renderWhereSuffix(constructor.typeParameters, builder)
|
renderWhereSuffix(constructor.typeParameters, builder)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.renderer
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import java.lang.IllegalStateException
|
import java.lang.IllegalStateException
|
||||||
@@ -82,6 +81,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
|
|||||||
override var normalizedVisibilities by property(false)
|
override var normalizedVisibilities by property(false)
|
||||||
override var renderDefaultVisibility by property(true)
|
override var renderDefaultVisibility by property(true)
|
||||||
override var renderDefaultModality by property(true)
|
override var renderDefaultModality by property(true)
|
||||||
|
override var renderConstructorDelegation by property(false)
|
||||||
override var renderActualAnnotationPropertiesInPrimaryConstructor by property(false)
|
override var renderActualAnnotationPropertiesInPrimaryConstructor by property(false)
|
||||||
override var uninferredTypeParameterAsName by property(false)
|
override var uninferredTypeParameterAsName by property(false)
|
||||||
override var includePropertyConstant by property(false)
|
override var includePropertyConstant by property(false)
|
||||||
|
|||||||
+1
@@ -216,6 +216,7 @@ private val ACTUAL_RENDERER = OVERRIDE_RENDERER.withOptions {
|
|||||||
secondaryConstructorsAsPrimary = false
|
secondaryConstructorsAsPrimary = false
|
||||||
renderDefaultVisibility = false
|
renderDefaultVisibility = false
|
||||||
renderDefaultModality = false
|
renderDefaultModality = false
|
||||||
|
renderConstructorDelegation = true
|
||||||
renderActualAnnotationPropertiesInPrimaryConstructor = true
|
renderActualAnnotationPropertiesInPrimaryConstructor = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// "Create actual class for module testModule_JVM (JVM)" "true"
|
||||||
|
|
||||||
|
expect class <caret>Constructors(s: String) {
|
||||||
|
constructor(i: Int)
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
// "Create actual class for module testModule_JVM (JVM)" "true"
|
||||||
|
|
||||||
|
expect class <caret>Constructors(s: String) {
|
||||||
|
constructor(i: Int)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
// Constructors: to be implemented
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// Constructors: to be implemented
|
||||||
|
actual class Constructors actual constructor(s: String) {
|
||||||
|
actual constructor(i: Int) : this() {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -159,6 +159,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/companionAbsence/");
|
runTest("idea/testData/multiModuleQuickFix/companionAbsence/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("constructorWithDelegation")
|
||||||
|
public void testConstructorWithDelegation() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/constructorWithDelegation/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("constructorWithJdk")
|
@TestMetadata("constructorWithJdk")
|
||||||
public void testConstructorWithJdk() throws Exception {
|
public void testConstructorWithJdk() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/constructorWithJdk/");
|
runTest("idea/testData/multiModuleQuickFix/constructorWithJdk/");
|
||||||
|
|||||||
Reference in New Issue
Block a user