[FIR] Generate an error primary constructor when super call is invalid
Merge-request: KT-MR-11026 Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
+5
-1
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.SingleNonLoca
|
|||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.correspondingProperty
|
import org.jetbrains.kotlin.fir.correspondingProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
|
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
@@ -148,7 +149,10 @@ internal class NonReanalyzableClassDeclarationStructureElement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitConstructor(constructor: FirConstructor, data: MutableMap<KtElement, FirElement>) {
|
override fun visitConstructor(constructor: FirConstructor, data: MutableMap<KtElement, FirElement>) {
|
||||||
if (constructor is FirPrimaryConstructor && constructor.source?.kind == KtFakeSourceElementKind.ImplicitConstructor) {
|
if (
|
||||||
|
(constructor is FirPrimaryConstructor || constructor is FirErrorConstructor) &&
|
||||||
|
constructor.source?.kind == KtFakeSourceElementKind.ImplicitConstructor
|
||||||
|
) {
|
||||||
NonReanalyzableNonClassDeclarationStructureElement.Recorder.visitConstructor(constructor, data)
|
NonReanalyzableNonClassDeclarationStructureElement.Recorder.visitConstructor(constructor, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-12
@@ -1,14 +1,9 @@
|
|||||||
KT element: KtNameReferenceExpression
|
KT element: KtNameReferenceExpression
|
||||||
FIR element: FirRegularClassImpl
|
FIR element: FirResolvedNamedReferenceImpl
|
||||||
FIR source kind: KtRealSourceElementKind
|
FIR source kind: KtRealSourceElementKind
|
||||||
|
|
||||||
FIR element rendered:
|
FIR element rendered:
|
||||||
public final [ResolvedTo(BODY_RESOLVE)] object C : R|A| {
|
R|/A.prop|
|
||||||
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor(): R|C| {
|
|
||||||
super<R|A|>()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FIR FILE:
|
FIR FILE:
|
||||||
FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall3.kt
|
FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall3.kt
|
||||||
@@ -18,17 +13,27 @@ FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall3.kt
|
|||||||
LAZY_super<R|kotlin/Any|>
|
LAZY_super<R|kotlin/Any|>
|
||||||
}
|
}
|
||||||
|
|
||||||
public final [ResolvedTo(STATUS)] val prop: R|kotlin/String| = LAZY_EXPRESSION
|
public final [ResolvedTo(CONTRACTS)] val prop: R|kotlin/String| = String()
|
||||||
public [ResolvedTo(STATUS)] [ContainingClassKey=A] get(): R|kotlin/String|
|
public [ResolvedTo(CONTRACTS)] [ContainingClassKey=A] get(): R|kotlin/String|
|
||||||
|
|
||||||
}
|
}
|
||||||
public? final? [ResolvedTo(RAW_FIR)] object B : A {
|
public final [ResolvedTo(STATUS)] object B : R|A| {
|
||||||
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=B] constructor(): R|B| {
|
private [ResolvedTo(STATUS)] [ContainingClassKey=B] constructor(): R|B| {
|
||||||
LAZY_super<A>
|
LAZY_super<R|A|>
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public final [ResolvedTo(BODY_RESOLVE)] object C : R|A| {
|
public final [ResolvedTo(BODY_RESOLVE)] object C : R|A| {
|
||||||
|
private [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] error_constructor(): R|C| {
|
||||||
|
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
||||||
|
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
||||||
|
^foo Q|B|.R|/A.prop|.R|kotlin/String.toString|()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor(): R|C| {
|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=C] constructor(): R|C| {
|
||||||
super<R|A|>()
|
super<R|A|>()
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-17
@@ -1,20 +1,9 @@
|
|||||||
KT element: KtNameReferenceExpression
|
KT element: KtNameReferenceExpression
|
||||||
FIR element: FirRegularClassImpl
|
FIR element: FirResolvedNamedReferenceImpl
|
||||||
FIR source kind: KtRealSourceElementKind
|
FIR source kind: KtRealSourceElementKind
|
||||||
|
|
||||||
FIR element rendered:
|
FIR element rendered:
|
||||||
public final [ResolvedTo(BODY_RESOLVE)] class G : R|A| {
|
R|/A.prop|
|
||||||
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] constructor(): R|G| {
|
|
||||||
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
|
||||||
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
|
||||||
^foo Q|C|.R|/A.prop|.R|kotlin/String.toString|()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FIR FILE:
|
FIR FILE:
|
||||||
FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall4.kt
|
FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall4.kt
|
||||||
@@ -28,9 +17,9 @@ FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall4.kt
|
|||||||
public [ResolvedTo(CONTRACTS)] [ContainingClassKey=A] get(): R|kotlin/String|
|
public [ResolvedTo(CONTRACTS)] [ContainingClassKey=A] get(): R|kotlin/String|
|
||||||
|
|
||||||
}
|
}
|
||||||
public? final? [ResolvedTo(RAW_FIR)] object B : A {
|
public final [ResolvedTo(STATUS)] object B : R|A| {
|
||||||
private [ResolvedTo(RAW_FIR)] [ContainingClassKey=B] constructor(): R|B| {
|
private [ResolvedTo(STATUS)] [ContainingClassKey=B] constructor(): R|B| {
|
||||||
LAZY_super<A>
|
LAZY_super<R|A|>
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -41,6 +30,16 @@ FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall4.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final [ResolvedTo(BODY_RESOLVE)] class G : R|A| {
|
public final [ResolvedTo(BODY_RESOLVE)] class G : R|A| {
|
||||||
|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] error_constructor(): R|G| {
|
||||||
|
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
||||||
|
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
||||||
|
^foo Q|B|.R|/A.prop|.R|kotlin/String.toString|()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] constructor(): R|G| {
|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] constructor(): R|G| {
|
||||||
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
||||||
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
||||||
@@ -51,4 +50,4 @@ FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall4.kt
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+4
@@ -30,6 +30,10 @@ FILE: [ResolvedTo(IMPORTS)] qualifiedCallInsideSuperCall5.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final [ResolvedTo(STATUS)] class G : R|A| {
|
public final [ResolvedTo(STATUS)] class G : R|A| {
|
||||||
|
public [ResolvedTo(STATUS)] [ContainingClassKey=G] error_constructor(): R|G| {
|
||||||
|
LAZY_super<R|A|>
|
||||||
|
}
|
||||||
|
|
||||||
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] constructor(): R|G| {
|
public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=G] constructor(): R|G| {
|
||||||
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
super<R|A|>([ResolvedTo(RAW_FIR)] fun R|A|.<anonymous>(): R|kotlin/Unit| <inline=Unknown> {
|
||||||
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
local final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/String| {
|
||||||
|
|||||||
+6
@@ -5990,6 +5990,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("errorInsideDelegationCallNoPrimary.kt")
|
||||||
|
public void testErrorInsideDelegationCallNoPrimary() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("getset.kt")
|
@TestMetadata("getset.kt")
|
||||||
public void testGetset() throws Exception {
|
public void testGetset() throws Exception {
|
||||||
|
|||||||
+6
@@ -5990,6 +5990,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
|
|||||||
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("errorInsideDelegationCallNoPrimary.kt")
|
||||||
|
public void testErrorInsideDelegationCallNoPrimary() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("getset.kt")
|
@TestMetadata("getset.kt")
|
||||||
public void testGetset() throws Exception {
|
public void testGetset() throws Exception {
|
||||||
|
|||||||
Vendored
+4
@@ -20,6 +20,10 @@ FILE: explicitDelegationCallRequired.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final class C : R|A| {
|
public final class C : R|A| {
|
||||||
|
public error_constructor(): R|C| {
|
||||||
|
super<R|A|>(Int(20))
|
||||||
|
}
|
||||||
|
|
||||||
public constructor(): R|C| {
|
public constructor(): R|C| {
|
||||||
super<R|A|>()
|
super<R|A|>()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ class B : A {
|
|||||||
|
|
||||||
<!SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR!>class C : A(20) {
|
<!SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR!>class C : A(20) {
|
||||||
<!EXPLICIT_DELEGATION_CALL_REQUIRED!>constructor()<!>
|
<!EXPLICIT_DELEGATION_CALL_REQUIRED!>constructor()<!>
|
||||||
constructor(z: String) : this()
|
constructor(z: String) : <!OVERLOAD_RESOLUTION_AMBIGUITY!>this<!>()
|
||||||
}<!>
|
}<!>
|
||||||
|
|
||||||
class D() : A(20) {
|
class D() : A(20) {
|
||||||
|
|||||||
+9
@@ -6,6 +6,10 @@ FILE: interfaceWithSuperclass.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface B : R|A| {
|
public abstract interface B : R|A| {
|
||||||
|
public error_constructor(): R|B| {
|
||||||
|
super<R|A|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface C : R|kotlin/Any| {
|
public abstract interface C : R|kotlin/Any| {
|
||||||
}
|
}
|
||||||
@@ -16,4 +20,9 @@ FILE: interfaceWithSuperclass.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface E : R|A|, R|C|, R|D| {
|
public abstract interface E : R|A|, R|C|, R|D| {
|
||||||
|
public error_constructor(): R|E| {
|
||||||
|
super<R|A|>()
|
||||||
|
super<R|D|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+18
@@ -2,6 +2,10 @@ FILE: supertypeInitializedInInterface.kt
|
|||||||
public abstract interface A : R|kotlin/Any| {
|
public abstract interface A : R|kotlin/Any| {
|
||||||
}
|
}
|
||||||
public abstract interface B : R|A| {
|
public abstract interface B : R|A| {
|
||||||
|
public error_constructor(): R|B| {
|
||||||
|
super<R|A|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public open class C : R|kotlin/Any| {
|
public open class C : R|kotlin/Any| {
|
||||||
public constructor(): R|C| {
|
public constructor(): R|C| {
|
||||||
@@ -10,8 +14,22 @@ FILE: supertypeInitializedInInterface.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface D : R|C| {
|
public abstract interface D : R|C| {
|
||||||
|
public error_constructor(): R|D| {
|
||||||
|
super<R|C|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface E : R|kotlin/Any| {
|
public abstract interface E : R|kotlin/Any| {
|
||||||
|
public error_constructor(): R|E| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public abstract interface F : R|A|, R|B|, R|C|, R|D|, R|kotlin/Any| {
|
public abstract interface F : R|A|, R|B|, R|C|, R|D|, R|kotlin/Any| {
|
||||||
|
public error_constructor(): R|F| {
|
||||||
|
super<R|B|>()
|
||||||
|
super<R|D|>()
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
interface A
|
interface A
|
||||||
|
|
||||||
interface B : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>A<!>()
|
interface B : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>A<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|
||||||
open class C
|
open class C
|
||||||
|
|
||||||
|
|||||||
+4
@@ -36,6 +36,10 @@ FILE: supertypeInitializedWithoutPrimaryConstructor.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final class G : R|C| {
|
public final class G : R|C| {
|
||||||
|
public error_constructor(): R|G| {
|
||||||
|
super<R|C|>(Int(10))
|
||||||
|
}
|
||||||
|
|
||||||
public constructor(): R|G| {
|
public constructor(): R|G| {
|
||||||
super<R|C|>(Int(1))
|
super<R|C|>(Int(1))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ FILE: withSuppression.kt
|
|||||||
public abstract interface A : R|kotlin/Any| {
|
public abstract interface A : R|kotlin/Any| {
|
||||||
}
|
}
|
||||||
public abstract interface B : R|@R|kotlin/Suppress|(names = vararg(String(SUPERTYPE_INITIALIZED_IN_INTERFACE))) A| {
|
public abstract interface B : R|@R|kotlin/Suppress|(names = vararg(String(SUPERTYPE_INITIALIZED_IN_INTERFACE))) A| {
|
||||||
|
public error_constructor(): R|B| {
|
||||||
|
super<R|@R|kotlin/Suppress|(names = vararg(String(SUPERTYPE_INITIALIZED_IN_INTERFACE))) A|>()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public final data class D : R|kotlin/Any| {
|
public final data class D : R|kotlin/Any| {
|
||||||
@R|kotlin/Suppress|(names = vararg(String(DATA_CLASS_VARARG_PARAMETER))) public constructor(vararg x: R|kotlin/Array<out kotlin/String>|): R|D| {
|
@R|kotlin/Suppress|(names = vararg(String(DATA_CLASS_VARARG_PARAMETER))) public constructor(vararg x: R|kotlin/Array<out kotlin/String>|): R|D| {
|
||||||
|
|||||||
@@ -15,6 +15,6 @@ typealias Alias<T> = @Suppress("TYPEALIAS_SHOULD_EXPAND_TO_CLASS") T
|
|||||||
|
|
||||||
interface A
|
interface A
|
||||||
|
|
||||||
interface B : @Suppress("SUPERTYPE_INITIALIZED_IN_INTERFACE") A()
|
interface B : @Suppress("SUPERTYPE_INITIALIZED_IN_INTERFACE") A<!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|
||||||
data class D @Suppress("DATA_CLASS_VARARG_PARAMETER") constructor(vararg val x: String)
|
data class D @Suppress("DATA_CLASS_VARARG_PARAMETER") constructor(vararg val x: String)
|
||||||
|
|||||||
+6
@@ -5990,6 +5990,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
|
|||||||
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("errorInsideDelegationCallNoPrimary.kt")
|
||||||
|
public void testErrorInsideDelegationCallNoPrimary() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("getset.kt")
|
@TestMetadata("getset.kt")
|
||||||
public void testGetset() throws Exception {
|
public void testGetset() throws Exception {
|
||||||
|
|||||||
+6
@@ -5996,6 +5996,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
|
|||||||
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("errorInsideDelegationCallNoPrimary.kt")
|
||||||
|
public void testErrorInsideDelegationCallNoPrimary() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("getset.kt")
|
@TestMetadata("getset.kt")
|
||||||
public void testGetset() throws Exception {
|
public void testGetset() throws Exception {
|
||||||
|
|||||||
+30
-23
@@ -891,12 +891,15 @@ class LightTreeRawFirDeclarationBuilder(
|
|||||||
isEnumEntry: Boolean = false,
|
isEnumEntry: Boolean = false,
|
||||||
containingClassIsExpectClass: Boolean
|
containingClassIsExpectClass: Boolean
|
||||||
): PrimaryConstructor? {
|
): PrimaryConstructor? {
|
||||||
if (primaryConstructor == null && !classWrapper.isEnumEntry() && classWrapper.hasSecondaryConstructor) return null
|
fun ClassKind.isEnumRelated(): Boolean = this == ClassKind.ENUM_CLASS || this == ClassKind.ENUM_ENTRY
|
||||||
val classKind = classWrapper.classBuilder.classKind
|
val shouldGenerateImplicitConstructor =
|
||||||
if (primaryConstructor == null &&
|
(classWrapper.isEnumEntry() || !classWrapper.hasSecondaryConstructor) &&
|
||||||
(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS && classKind != ClassKind.ENUM_ENTRY)
|
!classWrapper.isInterface() &&
|
||||||
) return null
|
(!containingClassIsExpectClass || classWrapper.classBuilder.classKind.isEnumRelated())
|
||||||
if (primaryConstructor == null && classWrapper.isInterface()) return null
|
val isErrorConstructor = primaryConstructor == null && !shouldGenerateImplicitConstructor
|
||||||
|
if (isErrorConstructor && classWrapper.delegatedSuperCalls.isEmpty()) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor())
|
val constructorSymbol = FirConstructorSymbol(callableIdForClassConstructor())
|
||||||
var modifiers = Modifier()
|
var modifiers = Modifier()
|
||||||
@@ -963,25 +966,29 @@ class LightTreeRawFirDeclarationBuilder(
|
|||||||
isFromEnumClass = classWrapper.isEnum()
|
isFromEnumClass = classWrapper.isEnum()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val builder = if (isErrorConstructor) FirErrorConstructorBuilder() else FirPrimaryConstructorBuilder()
|
||||||
|
builder.apply {
|
||||||
|
source = primaryConstructor?.toFirSourceElement()
|
||||||
|
?: selfTypeSource?.fakeElement(KtFakeSourceElementKind.ImplicitConstructor)
|
||||||
|
moduleData = baseModuleData
|
||||||
|
origin = FirDeclarationOrigin.Source
|
||||||
|
returnTypeRef = classWrapper.delegatedSelfTypeRef
|
||||||
|
dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor()
|
||||||
|
this.status = status
|
||||||
|
symbol = constructorSymbol
|
||||||
|
annotations += modifiers.annotations
|
||||||
|
typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters)
|
||||||
|
this.valueParameters += valueParameters.map { it.firValueParameter }
|
||||||
|
delegatedConstructor = firDelegatedCall
|
||||||
|
this.body = null
|
||||||
|
this.contextReceivers.addAll(convertContextReceivers(classNode))
|
||||||
|
}
|
||||||
|
|
||||||
return PrimaryConstructor(
|
return PrimaryConstructor(
|
||||||
buildPrimaryConstructor {
|
builder.build().apply {
|
||||||
source = primaryConstructor?.toFirSourceElement()
|
|
||||||
?: selfTypeSource?.fakeElement(KtFakeSourceElementKind.ImplicitConstructor)
|
|
||||||
moduleData = baseModuleData
|
|
||||||
origin = FirDeclarationOrigin.Source
|
|
||||||
returnTypeRef = classWrapper.delegatedSelfTypeRef
|
|
||||||
dispatchReceiverType = classWrapper.obtainDispatchReceiverForConstructor()
|
|
||||||
this.status = status
|
|
||||||
symbol = constructorSymbol
|
|
||||||
annotations += modifiers.annotations
|
|
||||||
typeParameters += constructorTypeParametersFromConstructedClass(classWrapper.classBuilder.typeParameters)
|
|
||||||
this.valueParameters += valueParameters.map { it.firValueParameter }
|
|
||||||
delegatedConstructor = firDelegatedCall
|
|
||||||
this.body = null
|
|
||||||
this.contextReceivers.addAll(convertContextReceivers(classNode))
|
|
||||||
}.apply {
|
|
||||||
containingClassForStaticMemberAttr = currentDispatchReceiverType()!!.lookupTag
|
containingClassForStaticMemberAttr = currentDispatchReceiverType()!!.lookupTag
|
||||||
}, valueParameters
|
},
|
||||||
|
valueParameters,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-6
@@ -956,10 +956,17 @@ open class PsiRawFirBuilder(
|
|||||||
// TODO: in case we have no primary constructor,
|
// TODO: in case we have no primary constructor,
|
||||||
// it may be not possible to determine delegated super type right here
|
// it may be not possible to determine delegated super type right here
|
||||||
delegatedSuperTypeRef = delegatedSuperTypeRef ?: defaultDelegatedSuperTypeRef
|
delegatedSuperTypeRef = delegatedSuperTypeRef ?: defaultDelegatedSuperTypeRef
|
||||||
val shouldGenerateImplicitPrimaryConstructor =
|
|
||||||
!hasExplicitPrimaryConstructor() && !hasSecondaryConstructors() && !(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS)
|
|
||||||
|
|
||||||
if (primaryConstructor != null || (this !is KtClass || !this.isInterface()) && shouldGenerateImplicitPrimaryConstructor) {
|
// We are never here as part of enum entry
|
||||||
|
val shouldGenerateImplicitPrimaryConstructor =
|
||||||
|
!hasSecondaryConstructors() &&
|
||||||
|
!(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS) &&
|
||||||
|
(this !is KtClass || !this.isInterface())
|
||||||
|
|
||||||
|
val hasPrimaryConstructor = primaryConstructor != null || shouldGenerateImplicitPrimaryConstructor
|
||||||
|
|
||||||
|
|
||||||
|
if (hasPrimaryConstructor || superTypeCallEntry != null) {
|
||||||
val firPrimaryConstructor = primaryConstructor.toFirConstructor(
|
val firPrimaryConstructor = primaryConstructor.toFirConstructor(
|
||||||
superTypeCallEntry,
|
superTypeCallEntry,
|
||||||
delegatedSuperTypeRef,
|
delegatedSuperTypeRef,
|
||||||
@@ -969,6 +976,7 @@ open class PsiRawFirBuilder(
|
|||||||
allSuperTypeCallEntries,
|
allSuperTypeCallEntries,
|
||||||
containingClassIsExpectClass,
|
containingClassIsExpectClass,
|
||||||
copyConstructedTypeRefWithImplicitSource = true,
|
copyConstructedTypeRefWithImplicitSource = true,
|
||||||
|
isErrorConstructor = !hasPrimaryConstructor,
|
||||||
)
|
)
|
||||||
container.declarations += firPrimaryConstructor
|
container.declarations += firPrimaryConstructor
|
||||||
}
|
}
|
||||||
@@ -988,6 +996,7 @@ open class PsiRawFirBuilder(
|
|||||||
allSuperTypeCallEntries: List<Pair<KtSuperTypeCallEntry, FirTypeRef>>,
|
allSuperTypeCallEntries: List<Pair<KtSuperTypeCallEntry, FirTypeRef>>,
|
||||||
containingClassIsExpectClass: Boolean,
|
containingClassIsExpectClass: Boolean,
|
||||||
copyConstructedTypeRefWithImplicitSource: Boolean,
|
copyConstructedTypeRefWithImplicitSource: Boolean,
|
||||||
|
isErrorConstructor: Boolean = false,
|
||||||
): FirConstructor {
|
): FirConstructor {
|
||||||
val constructorSource = this?.toFirSourceElement()
|
val constructorSource = this?.toFirSourceElement()
|
||||||
?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor)
|
?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor)
|
||||||
@@ -1040,7 +1049,8 @@ open class PsiRawFirBuilder(
|
|||||||
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.Private
|
isFromSealedClass = owner.hasModifier(SEALED_KEYWORD) && explicitVisibility !== Visibilities.Private
|
||||||
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
isFromEnumClass = owner.hasModifier(ENUM_KEYWORD)
|
||||||
}
|
}
|
||||||
return buildPrimaryConstructor {
|
val builder = if (isErrorConstructor) FirErrorConstructorBuilder() else FirPrimaryConstructorBuilder()
|
||||||
|
builder.apply {
|
||||||
source = constructorSource
|
source = constructorSource
|
||||||
moduleData = baseModuleData
|
moduleData = baseModuleData
|
||||||
origin = FirDeclarationOrigin.Source
|
origin = FirDeclarationOrigin.Source
|
||||||
@@ -1054,9 +1064,8 @@ open class PsiRawFirBuilder(
|
|||||||
this@toFirConstructor?.extractAnnotationsTo(this)
|
this@toFirConstructor?.extractAnnotationsTo(this)
|
||||||
this@toFirConstructor?.extractValueParametersTo(this, symbol, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
|
this@toFirConstructor?.extractValueParametersTo(this, symbol, ValueParameterDeclaration.PRIMARY_CONSTRUCTOR)
|
||||||
this.body = null
|
this.body = null
|
||||||
}.apply {
|
|
||||||
containingClassForStaticMemberAttr = currentDispatchReceiverType()!!.lookupTag
|
|
||||||
}
|
}
|
||||||
|
return builder.build().apply { containingClassForStaticMemberAttr = currentDispatchReceiverType()!!.lookupTag }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtClassOrObject.obtainDispatchReceiverForConstructor(): ConeClassLikeType? =
|
private fun KtClassOrObject.obtainDispatchReceiverForConstructor(): ConeClassLikeType? =
|
||||||
|
|||||||
compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/classWithWrongSuperCall.lazyBodies.txt
Vendored
+8
@@ -33,12 +33,20 @@ FILE: classWithWrongSuperCall.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public? final? class F : A {
|
public? final? class F : A {
|
||||||
|
public? error_constructor(): R|F| {
|
||||||
|
LAZY_super<A>
|
||||||
|
}
|
||||||
|
|
||||||
public? constructor(): R|F| {
|
public? constructor(): R|F| {
|
||||||
LAZY_super<A>
|
LAZY_super<A>
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public? final? class G : A {
|
public? final? class G : A {
|
||||||
|
public? error_constructor(): R|G| {
|
||||||
|
LAZY_super<A>
|
||||||
|
}
|
||||||
|
|
||||||
public? constructor(): R|G| {
|
public? constructor(): R|G| {
|
||||||
LAZY_super<A>
|
LAZY_super<A>
|
||||||
}
|
}
|
||||||
|
|||||||
+20
@@ -54,12 +54,32 @@ FILE: classWithWrongSuperCall.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public? final? class F : A {
|
public? final? class F : A {
|
||||||
|
public? [ContainingClassKey=F] error_constructor(): R|F| {
|
||||||
|
super<A>(fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
||||||
|
local final? fun foo(): <implicit> {
|
||||||
|
^foo B#.prop#.toString#()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public? [ContainingClassKey=F] constructor(): R|F| {
|
public? [ContainingClassKey=F] constructor(): R|F| {
|
||||||
super<A>()
|
super<A>()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public? final? class G : A {
|
public? final? class G : A {
|
||||||
|
public? [ContainingClassKey=G] error_constructor(): R|G| {
|
||||||
|
super<A>(fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
||||||
|
local final? fun foo(): <implicit> {
|
||||||
|
^foo B#.prop#.toString#()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public? [ContainingClassKey=G] constructor(): R|G| {
|
public? [ContainingClassKey=G] constructor(): R|G| {
|
||||||
super<A>(fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
super<A>(fun <implicit>.<anonymous>(): <implicit> <inline=Unknown> {
|
||||||
local final? fun foo(): <implicit> {
|
local final? fun foo(): <implicit> {
|
||||||
|
|||||||
+112
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("DuplicatedCode", "unused")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||||
|
import org.jetbrains.kotlin.fir.FirModuleData
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolveState
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.UnresolvedDeprecationProvider
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.builder.FirAbstractConstructorBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirErrorConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotationContainerBuilder {
|
||||||
|
override var source: KtSourceElement? = null
|
||||||
|
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
|
||||||
|
override lateinit var moduleData: FirModuleData
|
||||||
|
override lateinit var origin: FirDeclarationOrigin
|
||||||
|
override var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
|
||||||
|
override val typeParameters: MutableList<FirTypeParameterRef> = mutableListOf()
|
||||||
|
override lateinit var status: FirDeclarationStatus
|
||||||
|
override lateinit var returnTypeRef: FirTypeRef
|
||||||
|
override var receiverParameter: FirReceiverParameter? = null
|
||||||
|
override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider
|
||||||
|
override var containerSource: DeserializedContainerSource? = null
|
||||||
|
override var dispatchReceiverType: ConeSimpleKotlinType? = null
|
||||||
|
override val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
|
||||||
|
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
|
||||||
|
override var contractDescription: FirContractDescription = FirEmptyContractDescription
|
||||||
|
override val annotations: MutableList<FirAnnotation> = mutableListOf()
|
||||||
|
override lateinit var symbol: FirConstructorSymbol
|
||||||
|
override var delegatedConstructor: FirDelegatedConstructorCall? = null
|
||||||
|
override var body: FirBlock? = null
|
||||||
|
|
||||||
|
@OptIn(FirImplementationDetail::class)
|
||||||
|
override fun build(): FirConstructor {
|
||||||
|
return FirErrorConstructor(
|
||||||
|
source,
|
||||||
|
resolvePhase,
|
||||||
|
moduleData,
|
||||||
|
origin,
|
||||||
|
attributes,
|
||||||
|
typeParameters,
|
||||||
|
status,
|
||||||
|
returnTypeRef,
|
||||||
|
receiverParameter,
|
||||||
|
deprecationsProvider,
|
||||||
|
containerSource,
|
||||||
|
dispatchReceiverType,
|
||||||
|
contextReceivers.toMutableOrEmpty(),
|
||||||
|
valueParameters,
|
||||||
|
contractDescription,
|
||||||
|
annotations.toMutableOrEmpty(),
|
||||||
|
symbol,
|
||||||
|
delegatedConstructor,
|
||||||
|
body,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated("Modification of 'controlFlowGraphReference' has no impact for FirErrorConstructorBuilder", level = DeprecationLevel.HIDDEN)
|
||||||
|
override var controlFlowGraphReference: FirControlFlowGraphReference?
|
||||||
|
get() = throw IllegalStateException()
|
||||||
|
set(_) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalContracts::class)
|
||||||
|
inline fun buildErrorConstructor(init: FirErrorConstructorBuilder.() -> Unit): FirConstructor {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirErrorConstructorBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+192
@@ -0,0 +1,192 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("DuplicatedCode", "unused")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.declarations.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirImplementationDetail
|
||||||
|
import org.jetbrains.kotlin.fir.FirModuleData
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolveState
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.asResolveState
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeSimpleKotlinType
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
import org.jetbrains.kotlin.fir.MutableOrEmptyList
|
||||||
|
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.ResolveStateAccess
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
class FirErrorConstructor @FirImplementationDetail constructor(
|
||||||
|
override val source: KtSourceElement?,
|
||||||
|
resolvePhase: FirResolvePhase,
|
||||||
|
override val moduleData: FirModuleData,
|
||||||
|
override val origin: FirDeclarationOrigin,
|
||||||
|
override val attributes: FirDeclarationAttributes,
|
||||||
|
override val typeParameters: MutableList<FirTypeParameterRef>,
|
||||||
|
override var status: FirDeclarationStatus,
|
||||||
|
override var returnTypeRef: FirTypeRef,
|
||||||
|
override var receiverParameter: FirReceiverParameter?,
|
||||||
|
override var deprecationsProvider: DeprecationsProvider,
|
||||||
|
override val containerSource: DeserializedContainerSource?,
|
||||||
|
override val dispatchReceiverType: ConeSimpleKotlinType?,
|
||||||
|
override var contextReceivers: MutableOrEmptyList<FirContextReceiver>,
|
||||||
|
override val valueParameters: MutableList<FirValueParameter>,
|
||||||
|
override var contractDescription: FirContractDescription,
|
||||||
|
override var annotations: MutableOrEmptyList<FirAnnotation>,
|
||||||
|
override val symbol: FirConstructorSymbol,
|
||||||
|
override var delegatedConstructor: FirDelegatedConstructorCall?,
|
||||||
|
override var body: FirBlock?,
|
||||||
|
) : FirConstructor() {
|
||||||
|
override var controlFlowGraphReference: FirControlFlowGraphReference? = null
|
||||||
|
override val isPrimary: Boolean get() = false
|
||||||
|
|
||||||
|
init {
|
||||||
|
symbol.bind(this)
|
||||||
|
@OptIn(ResolveStateAccess::class)
|
||||||
|
resolveState = resolvePhase.asResolveState()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||||
|
typeParameters.forEach { it.accept(visitor, data) }
|
||||||
|
status.accept(visitor, data)
|
||||||
|
returnTypeRef.accept(visitor, data)
|
||||||
|
receiverParameter?.accept(visitor, data)
|
||||||
|
contextReceivers.forEach { it.accept(visitor, data) }
|
||||||
|
controlFlowGraphReference?.accept(visitor, data)
|
||||||
|
valueParameters.forEach { it.accept(visitor, data) }
|
||||||
|
contractDescription.accept(visitor, data)
|
||||||
|
annotations.forEach { it.accept(visitor, data) }
|
||||||
|
delegatedConstructor?.accept(visitor, data)
|
||||||
|
body?.accept(visitor, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
transformTypeParameters(transformer, data)
|
||||||
|
transformStatus(transformer, data)
|
||||||
|
transformReturnTypeRef(transformer, data)
|
||||||
|
transformReceiverParameter(transformer, data)
|
||||||
|
contextReceivers.transformInplace(transformer, data)
|
||||||
|
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
|
||||||
|
transformValueParameters(transformer, data)
|
||||||
|
transformContractDescription(transformer, data)
|
||||||
|
transformAnnotations(transformer, data)
|
||||||
|
transformDelegatedConstructor(transformer, data)
|
||||||
|
transformBody(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
typeParameters.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
status = status.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
returnTypeRef = returnTypeRef.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
receiverParameter = receiverParameter?.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
valueParameters.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
contractDescription = contractDescription.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
annotations.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformDelegatedConstructor(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
delegatedConstructor = delegatedConstructor?.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformBody(transformer: FirTransformer<D>, data: D): FirErrorConstructor {
|
||||||
|
body = body?.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceStatus(newStatus: FirDeclarationStatus) {
|
||||||
|
status = newStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceReturnTypeRef(newReturnTypeRef: FirTypeRef) {
|
||||||
|
returnTypeRef = newReturnTypeRef
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {
|
||||||
|
receiverParameter = newReceiverParameter
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
|
||||||
|
deprecationsProvider = newDeprecationsProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceContextReceivers(newContextReceivers: List<FirContextReceiver>) {
|
||||||
|
contextReceivers = newContextReceivers.toMutableOrEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
|
||||||
|
controlFlowGraphReference = newControlFlowGraphReference
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) {
|
||||||
|
valueParameters.clear()
|
||||||
|
valueParameters.addAll(newValueParameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceContractDescription(newContractDescription: FirContractDescription) {
|
||||||
|
contractDescription = newContractDescription
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
|
||||||
|
annotations = newAnnotations.toMutableOrEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?) {
|
||||||
|
delegatedConstructor = newDelegatedConstructor
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceBody(newBody: FirBlock?) {
|
||||||
|
body = newBody
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.renderer
|
package org.jetbrains.kotlin.fir.renderer
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorConstructor
|
||||||
import org.jetbrains.kotlin.fir.isCatchParameter
|
import org.jetbrains.kotlin.fir.isCatchParameter
|
||||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
||||||
|
|
||||||
@@ -23,6 +24,9 @@ open class FirDeclarationRenderer {
|
|||||||
typeRenderer.render(it)
|
typeRenderer.render(it)
|
||||||
printer.print(".")
|
printer.print(".")
|
||||||
}
|
}
|
||||||
|
if (declaration is FirErrorConstructor) {
|
||||||
|
printer.print("error_")
|
||||||
|
}
|
||||||
printer.print("constructor")
|
printer.print("constructor")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -89,7 +89,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
fields from functionCall
|
fields from functionCall
|
||||||
}
|
}
|
||||||
|
|
||||||
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl")) {
|
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl", "FirErrorConstructor")) {
|
||||||
builder(constructor, constructorType) {
|
builder(constructor, constructorType) {
|
||||||
parents += abstractConstructorBuilder
|
parents += abstractConstructorBuilder
|
||||||
defaultNull("delegatedConstructor")
|
defaultNull("delegatedConstructor")
|
||||||
|
|||||||
+5
@@ -26,6 +26,11 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
|||||||
defaultTrue("isPrimary", withGetter = true)
|
defaultTrue("isPrimary", withGetter = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl(constructor, "FirErrorConstructor") {
|
||||||
|
publicImplementation()
|
||||||
|
defaultFalse("isPrimary", withGetter = true)
|
||||||
|
}
|
||||||
|
|
||||||
impl(typeParameterRef, "FirOuterClassTypeParameterRef") {
|
impl(typeParameterRef, "FirOuterClassTypeParameterRef") {
|
||||||
publicImplementation()
|
publicImplementation()
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -9,9 +9,9 @@ abstract class D : suspend () -> Int<!NO_CONSTRUCTOR!>()<!>
|
|||||||
abstract class E : (suspend () -> Int)<!NO_CONSTRUCTOR!>()<!>
|
abstract class E : (suspend () -> Int)<!NO_CONSTRUCTOR!>()<!>
|
||||||
abstract class F : kotlin.coroutines.SuspendFunction0<Int><!NO_CONSTRUCTOR!>()<!>
|
abstract class F : kotlin.coroutines.SuspendFunction0<Int><!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|
||||||
interface IA : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>() -> Int<!>()
|
interface IA : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>() -> Int<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IB : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(() -> Int)<!>()
|
interface IB : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(() -> Int)<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IC : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>Function0<Int><!>()
|
interface IC : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>Function0<Int><!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface ID : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>suspend () -> Int<!>()
|
interface ID : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>suspend () -> Int<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IE : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(suspend () -> Int)<!>()
|
interface IE : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(suspend () -> Int)<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IF : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>kotlin.coroutines.SuspendFunction0<Int><!>()
|
interface IF : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>kotlin.coroutines.SuspendFunction0<Int><!><!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|||||||
+6
-6
@@ -9,9 +9,9 @@ abstract class D : suspend () -> Int<!NO_CONSTRUCTOR!>()<!>
|
|||||||
abstract class E : (suspend () -> Int)<!NO_CONSTRUCTOR!>()<!>
|
abstract class E : (suspend () -> Int)<!NO_CONSTRUCTOR!>()<!>
|
||||||
abstract class F : kotlin.coroutines.SuspendFunction0<Int><!NO_CONSTRUCTOR!>()<!>
|
abstract class F : kotlin.coroutines.SuspendFunction0<Int><!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|
||||||
interface IA : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>() -> Int<!>()
|
interface IA : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>() -> Int<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IB : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(() -> Int)<!>()
|
interface IB : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(() -> Int)<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IC : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>Function0<Int><!>()
|
interface IC : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>Function0<Int><!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface ID : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>suspend () -> Int<!>()
|
interface ID : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>suspend () -> Int<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IE : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(suspend () -> Int)<!>()
|
interface IE : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>(suspend () -> Int)<!><!NO_CONSTRUCTOR!>()<!>
|
||||||
interface IF : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>kotlin.coroutines.SuspendFunction0<Int><!>()
|
interface IF : <!SUPERTYPE_INITIALIZED_IN_INTERFACE!>kotlin.coroutines.SuspendFunction0<Int><!><!NO_CONSTRUCTOR!>()<!>
|
||||||
|
|||||||
compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.fir.kt
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class A(i: Int)
|
||||||
|
|
||||||
|
<!SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR!>class B : A(<!UNRESOLVED_REFERENCE!>x<!>) {
|
||||||
|
constructor(i: Int) : super(i)
|
||||||
|
}<!>
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
open class A(i: Int)
|
||||||
|
|
||||||
|
class B : <!SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR!>A(<!DEBUG_INFO_MISSING_UNRESOLVED!>x<!>)<!> {
|
||||||
|
constructor(i: Int) : super(i)
|
||||||
|
}
|
||||||
Generated
+6
@@ -5996,6 +5996,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/derivedProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("errorInsideDelegationCallNoPrimary.kt")
|
||||||
|
public void testErrorInsideDelegationCallNoPrimary() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/constructorConsistency/errorInsideDelegationCallNoPrimary.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("getset.kt")
|
@TestMetadata("getset.kt")
|
||||||
public void testGetset() throws Exception {
|
public void testGetset() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user