KT-43006 don't generate no-arg constructor with inline class parameters
This commit is contained in:
+2
-1
@@ -27,13 +27,13 @@ import org.jetbrains.kotlin.psi.KtParameter
|
|||||||
import org.jetbrains.kotlin.psi.KtPureClassOrObject
|
import org.jetbrains.kotlin.psi.KtPureClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtPureElement
|
import org.jetbrains.kotlin.psi.KtPureElement
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue
|
import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue
|
||||||
import org.jetbrains.kotlin.resolve.isInlineClass
|
import org.jetbrains.kotlin.resolve.isInlineClass
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation
|
import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.shouldHideConstructorDueToInlineClassTypeValueParameters
|
||||||
import org.jetbrains.org.objectweb.asm.Label
|
import org.jetbrains.org.objectweb.asm.Label
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
@@ -268,6 +268,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
|||||||
|
|
||||||
if (classOrObject.isLocal) return false
|
if (classOrObject.isLocal) return false
|
||||||
if (classDescriptor.isInline) return false
|
if (classDescriptor.isInline) return false
|
||||||
|
if (shouldHideConstructorDueToInlineClassTypeValueParameters(constructorDescriptor)) return false
|
||||||
|
|
||||||
if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false
|
if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false
|
||||||
|
|
||||||
|
|||||||
+4
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
|
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
|
||||||
@@ -42,6 +43,9 @@ private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : Cl
|
|||||||
if (DescriptorVisibilities.isPrivate(primaryConstructor.visibility))
|
if (DescriptorVisibilities.isPrivate(primaryConstructor.visibility))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if (primaryConstructor.hasMangledParameters)
|
||||||
|
return
|
||||||
|
|
||||||
if (primaryConstructor.valueParameters.isEmpty() || !primaryConstructor.valueParameters.all { it.hasDefaultValue() })
|
if (primaryConstructor.valueParameters.isEmpty() || !primaryConstructor.valueParameters.all { it.hasDefaultValue() })
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
inline class Z(val z: Int)
|
||||||
|
|
||||||
|
class Test(val z: Z = Z(42))
|
||||||
Vendored
+27
@@ -0,0 +1,27 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class Test {
|
||||||
|
// source: 'noArgConstructorForInlineClassParameter.kt'
|
||||||
|
private final field z: int
|
||||||
|
private method <init>(p0: int): void
|
||||||
|
public synthetic method <init>(p0: int, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
|
public synthetic method <init>(p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
|
public final method getZ-a_XrcN0(): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class Z {
|
||||||
|
// source: 'noArgConstructorForInlineClassParameter.kt'
|
||||||
|
private final field z: int
|
||||||
|
private synthetic method <init>(p0: int): void
|
||||||
|
public synthetic final static method box-impl(p0: int): Z
|
||||||
|
public static method constructor-impl(p0: int): int
|
||||||
|
public method equals(p0: java.lang.Object): boolean
|
||||||
|
public static method equals-impl(p0: int, p1: java.lang.Object): boolean
|
||||||
|
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||||
|
public final method getZ(): int
|
||||||
|
public method hashCode(): int
|
||||||
|
public static method hashCode-impl(p0: int): int
|
||||||
|
public method toString(): java.lang.String
|
||||||
|
public static method toString-impl(p0: int): java.lang.String
|
||||||
|
public synthetic final method unbox-impl(): int
|
||||||
|
}
|
||||||
+1
-6
@@ -5,9 +5,4 @@ class B(val a: A = A(0))
|
|||||||
// 1 private <init>\(I\)V
|
// 1 private <init>\(I\)V
|
||||||
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
|
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
|
||||||
// 1 public synthetic <init>\(ILkotlin/jvm/internal/DefaultConstructorMarker;\)V
|
// 1 public synthetic <init>\(ILkotlin/jvm/internal/DefaultConstructorMarker;\)V
|
||||||
|
// 0 private <init>\(\)V
|
||||||
// JVM_TEMPLATES
|
|
||||||
// 1 private <init>\(\)V
|
|
||||||
|
|
||||||
// JVM_IR_TEMPLATES
|
|
||||||
// 1 public <init>\(\)V
|
|
||||||
|
|||||||
+5
@@ -952,6 +952,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("noArgConstructorForInlineClassParameter.kt")
|
||||||
|
public void testNoArgConstructorForInlineClassParameter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
||||||
public void testNoBridgesForErasedInlineClass() throws Exception {
|
public void testNoBridgesForErasedInlineClass() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
||||||
|
|||||||
+5
@@ -922,6 +922,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
|
|||||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("noArgConstructorForInlineClassParameter.kt")
|
||||||
|
public void testNoArgConstructorForInlineClassParameter() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
||||||
public void testNoBridgesForErasedInlineClass() throws Exception {
|
public void testNoBridgesForErasedInlineClass() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user