[FIR] Make constructor delegate lazy in RawFirBuilder

Fifth step for ^KT-52615

Merge-request: KT-MR-7860
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2022-12-02 03:12:51 +00:00
committed by Space Team
parent 1539d7ef1a
commit fb2485f83c
37 changed files with 436 additions and 187 deletions
@@ -11,11 +11,13 @@ import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignation import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignation
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.getExplicitBackingField import org.jetbrains.kotlin.fir.declarations.utils.getExplicitBackingField
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider
@@ -50,20 +52,21 @@ internal object FirLazyBodiesCalculator {
} }
} }
fun calculateLazyBodyForSecondaryConstructor(designation: FirDeclarationDesignation) { fun calculateLazyBodyForConstructor(designation: FirDeclarationDesignation) {
val secondaryConstructor = designation.declaration as FirConstructor val constructor = designation.declaration as FirConstructor
require(!secondaryConstructor.isPrimary) require(constructor.psi is KtConstructor<*>)
if (secondaryConstructor.body !is FirLazyBlock) return require(constructor.body is FirLazyBlock || constructor.delegatedConstructor is FirLazyDelegatedConstructorCall)
val newFunction = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind( val newConstructor = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind(
session = secondaryConstructor.moduleData.session, session = constructor.moduleData.session,
scopeProvider = secondaryConstructor.moduleData.session.kotlinScopeProvider, scopeProvider = constructor.moduleData.session.kotlinScopeProvider,
designation = designation, designation = designation,
rootNonLocalDeclaration = secondaryConstructor.psi as KtSecondaryConstructor, rootNonLocalDeclaration = constructor.psi as KtConstructor<*>,
) as FirSimpleFunction ) as FirConstructor
secondaryConstructor.apply { constructor.apply {
replaceBody(newFunction.body) replaceBody(newConstructor.body)
replaceDelegatedConstructor(newConstructor.delegatedConstructor)
} }
} }
@@ -187,9 +190,9 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
constructor: FirConstructor, constructor: FirConstructor,
data: PersistentList<FirDeclaration> data: PersistentList<FirDeclaration>
): FirConstructor { ): FirConstructor {
if (constructor.body is FirLazyBlock) { if (constructor.body is FirLazyBlock || constructor.delegatedConstructor is FirLazyDelegatedConstructorCall) {
val designation = FirDeclarationDesignation(data, constructor) val designation = FirDeclarationDesignation(data, constructor)
FirLazyBodiesCalculator.calculateLazyBodyForSecondaryConstructor(designation) FirLazyBodiesCalculator.calculateLazyBodyForConstructor(designation)
} }
return constructor return constructor
} }
@@ -16,19 +16,20 @@ import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
internal class RawFirNonLocalDeclarationBuilder private constructor( internal class RawFirNonLocalDeclarationBuilder private constructor(
session: FirSession, session: FirSession,
baseScopeProvider: FirScopeProvider, baseScopeProvider: FirScopeProvider,
private val originalDeclarationIfParamertized: FirTypeParameterRefsOwner?, private val originalDeclaration: FirDeclaration,
private val declarationToBuild: KtDeclaration, private val declarationToBuild: KtDeclaration,
private val functionsToRebind: Set<FirFunction>? = null, private val functionsToRebind: Set<FirFunction>? = null,
private val replacementApplier: RawFirReplacement.Applier? = null private val replacementApplier: RawFirReplacement.Applier? = null
@@ -45,7 +46,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
val builder = RawFirNonLocalDeclarationBuilder( val builder = RawFirNonLocalDeclarationBuilder(
session = session, session = session,
baseScopeProvider = scopeProvider, baseScopeProvider = scopeProvider,
originalDeclarationIfParamertized = designation.declaration as? FirTypeParameterRefsOwner, originalDeclaration = designation.declaration,
declarationToBuild = rootNonLocalDeclaration, declarationToBuild = rootNonLocalDeclaration,
replacementApplier = replacementApplier replacementApplier = replacementApplier
) )
@@ -62,7 +63,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
rootNonLocalDeclaration: KtDeclaration, rootNonLocalDeclaration: KtDeclaration,
): FirDeclaration { ): FirDeclaration {
val functionsToRebind = when (val originalDeclaration = designation.declaration) { val functionsToRebind = when (val originalDeclaration = designation.declaration) {
is FirSimpleFunction -> setOf(originalDeclaration) is FirFunction -> setOf(originalDeclaration)
is FirProperty -> setOfNotNull(originalDeclaration.getter, originalDeclaration.setter) is FirProperty -> setOfNotNull(originalDeclaration.getter, originalDeclaration.setter)
else -> null else -> null
} }
@@ -70,7 +71,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
val builder = RawFirNonLocalDeclarationBuilder( val builder = RawFirNonLocalDeclarationBuilder(
session = session, session = session,
baseScopeProvider = scopeProvider, baseScopeProvider = scopeProvider,
originalDeclarationIfParamertized = designation.declaration as? FirTypeParameterRefsOwner, originalDeclaration = designation.declaration,
declarationToBuild = rootNonLocalDeclaration, declarationToBuild = rootNonLocalDeclaration,
functionsToRebind = functionsToRebind, functionsToRebind = functionsToRebind,
) )
@@ -89,8 +90,8 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
declarationSource: KtSourceElement?, declarationSource: KtSourceElement?,
currentFirTypeParameters: List<FirTypeParameterRef> currentFirTypeParameters: List<FirTypeParameterRef>
) { ) {
if (originalDeclarationIfParamertized != null && declarationSource?.psi == originalDeclarationIfParamertized.psi) { if (originalDeclaration is FirTypeParameterRefsOwner && declarationSource?.psi == originalDeclaration.psi) {
super.addCapturedTypeParameters(status, declarationSource, originalDeclarationIfParamertized.typeParameters) super.addCapturedTypeParameters(status, declarationSource, originalDeclaration.typeParameters)
} else { } else {
super.addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters) super.addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters)
} }
@@ -132,6 +133,55 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
) )
} }
private fun extractContructorConversionParams(
classOrObject: KtClassOrObject,
constructor: KtConstructor<*>
): ConstructorConversionParams {
val typeParameters = mutableListOf<FirTypeParameterRef>()
context.appendOuterTypeParameters(ignoreLastLevel = false, typeParameters)
val containingClass = this.containingClass ?: buildErrorWithAttachment("Constructor outside of class") {
withPsiEntry("constructor", constructor)
}
val selfType = classOrObject.toDelegatedSelfType(typeParameters, containingClass.symbol)
val superTypeCallEntry = classOrObject.superTypeListEntries.firstIsInstanceOrNull<KtSuperTypeCallEntry>()
return ConstructorConversionParams(superTypeCallEntry, selfType, typeParameters)
}
override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Unit?): FirElement {
val classOrObject = constructor.getContainingClassOrObject()
val params = extractContructorConversionParams(classOrObject, constructor)
val delegatedTypeRef = (originalDeclaration as FirConstructor).delegatedConstructor?.constructedTypeRef
?: buildErrorWithAttachment("Secondary constructor without delegated call") {
withPsiEntry("constructor", constructor)
}
return constructor.toFirConstructor(
delegatedTypeRef,
params.selfType,
classOrObject,
params.typeParameters,
)
}
override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor, data: Unit?): FirElement {
val classOrObject = constructor.getContainingClassOrObject()
val params = extractContructorConversionParams(classOrObject, constructor)
val firConstructor = originalDeclaration as FirConstructor
val calleeReference = firConstructor.delegatedConstructor?.calleeReference as FirSuperReference?
val newConstructor = constructor.toFirConstructor(
params.superTypeCallEntry,
firConstructor.delegatedConstructor?.constructedTypeRef,
params.selfType,
classOrObject,
params.typeParameters,
firConstructor.delegatedConstructor == null,
copyConstructedTypeRefWithImplicitSource = false,
)
if (calleeReference != null) {
(newConstructor.delegatedConstructor?.calleeReference as? FirSuperReference)?.replaceSuperTypeRef(calleeReference.superTypeRef)
}
return newConstructor
}
override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit?): FirElement { override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit?): FirElement {
val owner = containingClass ?: buildErrorWithAttachment("Enum entry outside of class") { val owner = containingClass ?: buildErrorWithAttachment("Enum entry outside of class") {
withPsiEntry("enumEntry", enumEntry) withPsiEntry("enumEntry", enumEntry)
@@ -158,6 +208,14 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
val ownerTypeArgumentsCount = containingClass?.typeParameters?.size val ownerTypeArgumentsCount = containingClass?.typeParameters?.size
visitor.convertProperty(declarationToBuild, ownerSymbol, ownerTypeArgumentsCount) visitor.convertProperty(declarationToBuild, ownerSymbol, ownerTypeArgumentsCount)
} }
is KtConstructor<*> -> {
if (containingClass == null) {
// Constructor outside of class, syntax error, we should not do anything
originalDeclaration
} else {
visitor.convertElement(declarationToBuild)
}
}
else -> visitor.convertElement(declarationToBuild) else -> visitor.convertElement(declarationToBuild)
} as FirDeclaration } as FirDeclaration
} }
@@ -182,5 +240,11 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
private fun PsiElement?.toDelegatedSelfType(firClass: FirRegularClass): FirResolvedTypeRef = private fun PsiElement?.toDelegatedSelfType(firClass: FirRegularClass): FirResolvedTypeRef =
toDelegatedSelfType(firClass.typeParameters, firClass.symbol) toDelegatedSelfType(firClass.typeParameters, firClass.symbol)
private data class ConstructorConversionParams(
val superTypeCallEntry: KtSuperTypeCallEntry?,
val selfType: FirTypeRef,
val typeParameters: List<FirTypeParameterRef>,
)
} }
@@ -19,7 +19,7 @@ FILE: annotationParameters.kt
} }
public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| {
public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -57,7 +57,7 @@ FILE: annotationParameters.kt
} }
public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| {
public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -95,7 +95,7 @@ FILE: annotationParameters.kt
} }
public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| {
public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -133,7 +133,7 @@ FILE: annotationParameters.kt
} }
public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| {
public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -171,7 +171,7 @@ FILE: annotationParameters.kt
} }
public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| { public? final? [RAW_FIR] annotation class Anno : R|kotlin/Annotation| {
public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [RAW_FIR] [ContainingClassKey=Anno] constructor([RAW_FIR] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -209,7 +209,7 @@ FILE: annotationParameters.kt
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -247,7 +247,7 @@ FILE: annotationParameters.kt
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -285,7 +285,7 @@ FILE: annotationParameters.kt
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -323,7 +323,7 @@ FILE: annotationParameters.kt
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -362,7 +362,7 @@ FILE: annotationParameters.kt
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] annotation class Anno : R|kotlin/Annotation| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=Anno] constructor([COMPILER_REQUIRED_ANNOTATIONS] [CorrespondingProperty=/Anno.args] args: A.X): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [COMPILER_REQUIRED_ANNOTATIONS] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -401,7 +401,7 @@ FILE: annotationParameters.kt
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| { public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -440,7 +440,7 @@ FILE: annotationParameters.kt
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| { public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -479,7 +479,7 @@ FILE: annotationParameters.kt
} }
public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| { public final [SUPER_TYPES] annotation class Anno : R|kotlin/Annotation| {
public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| { public [STATUS] [ContainingClassKey=Anno] constructor([STATUS] [CorrespondingProperty=/Anno.args] args: <ERROR TYPE REF: Symbol not found for A.X>): R|Anno| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val args: A.X = R|<local>/args|
@@ -3,7 +3,7 @@ RAW_FIR:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [RAW_FIR] class ResolveMe<[RAW_FIR] T : Int, [RAW_FIR] K> : R|kotlin/Any| { public? final? [RAW_FIR] class ResolveMe<[RAW_FIR] T : Int, [RAW_FIR] K> : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor<[RAW_FIR] T : Int, [RAW_FIR] K>(): R|ResolveMe<T, K>| { public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor<[RAW_FIR] T : Int, [RAW_FIR] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -12,7 +12,7 @@ IMPORTS:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [RAW_FIR] class ResolveMe<[RAW_FIR] T : Int, [RAW_FIR] K> : R|kotlin/Any| { public? final? [RAW_FIR] class ResolveMe<[RAW_FIR] T : Int, [RAW_FIR] K> : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor<[RAW_FIR] T : Int, [RAW_FIR] K>(): R|ResolveMe<T, K>| { public? [RAW_FIR] [ContainingClassKey=ResolveMe] constructor<[RAW_FIR] T : Int, [RAW_FIR] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -21,7 +21,7 @@ COMPILER_REQUIRED_ANNOTATIONS:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [COMPILER_REQUIRED_ANNOTATIONS] class ResolveMe<[COMPILER_REQUIRED_ANNOTATIONS] T : Int, [COMPILER_REQUIRED_ANNOTATIONS] K> : R|kotlin/Any| { public? final? [COMPILER_REQUIRED_ANNOTATIONS] class ResolveMe<[COMPILER_REQUIRED_ANNOTATIONS] T : Int, [COMPILER_REQUIRED_ANNOTATIONS] K> : R|kotlin/Any| {
public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor<[COMPILER_REQUIRED_ANNOTATIONS] T : Int, [COMPILER_REQUIRED_ANNOTATIONS] K>(): R|ResolveMe<T, K>| { public? [COMPILER_REQUIRED_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor<[COMPILER_REQUIRED_ANNOTATIONS] T : Int, [COMPILER_REQUIRED_ANNOTATIONS] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -30,7 +30,7 @@ COMPANION_GENERATION:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [COMPANION_GENERATION] class ResolveMe<[COMPANION_GENERATION] T : Int, [COMPANION_GENERATION] K> : R|kotlin/Any| { public? final? [COMPANION_GENERATION] class ResolveMe<[COMPANION_GENERATION] T : Int, [COMPANION_GENERATION] K> : R|kotlin/Any| {
public? [COMPANION_GENERATION] [ContainingClassKey=ResolveMe] constructor<[COMPANION_GENERATION] T : Int, [COMPANION_GENERATION] K>(): R|ResolveMe<T, K>| { public? [COMPANION_GENERATION] [ContainingClassKey=ResolveMe] constructor<[COMPANION_GENERATION] T : Int, [COMPANION_GENERATION] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -39,7 +39,7 @@ SUPER_TYPES:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [SUPER_TYPES] class ResolveMe<[SUPER_TYPES] T : Int, [SUPER_TYPES] K> : R|kotlin/Any| { public? final? [SUPER_TYPES] class ResolveMe<[SUPER_TYPES] T : Int, [SUPER_TYPES] K> : R|kotlin/Any| {
public? [SUPER_TYPES] [ContainingClassKey=ResolveMe] constructor<[SUPER_TYPES] T : Int, [SUPER_TYPES] K>(): R|ResolveMe<T, K>| { public? [SUPER_TYPES] [ContainingClassKey=ResolveMe] constructor<[SUPER_TYPES] T : Int, [SUPER_TYPES] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -48,7 +48,7 @@ TYPES:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public? final? [TYPES] class ResolveMe<[TYPES] T : R|kotlin/Int|, [TYPES] K> : R|kotlin/Any| { public? final? [TYPES] class ResolveMe<[TYPES] T : R|kotlin/Int|, [TYPES] K> : R|kotlin/Any| {
public? [TYPES] [ContainingClassKey=ResolveMe] constructor<[TYPES] T : R|kotlin/Int|, [TYPES] K>(): R|ResolveMe<T, K>| { public? [TYPES] [ContainingClassKey=ResolveMe] constructor<[TYPES] T : R|kotlin/Int|, [TYPES] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -57,7 +57,7 @@ STATUS:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public final [STATUS] class ResolveMe<[STATUS] T : R|kotlin/Int|, [STATUS] K> : R|kotlin/Any| { public final [STATUS] class ResolveMe<[STATUS] T : R|kotlin/Int|, [STATUS] K> : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=ResolveMe] constructor<[STATUS] T : R|kotlin/Int|, [STATUS] K>(): R|ResolveMe<T, K>| { public [STATUS] [ContainingClassKey=ResolveMe] constructor<[STATUS] T : R|kotlin/Int|, [STATUS] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -66,7 +66,7 @@ ARGUMENTS_OF_ANNOTATIONS:
FILE: classWithTypeParameters.kt FILE: classWithTypeParameters.kt
public final [ARGUMENTS_OF_ANNOTATIONS] class ResolveMe<[ARGUMENTS_OF_ANNOTATIONS] T : R|kotlin/Int|, [ARGUMENTS_OF_ANNOTATIONS] K> : R|kotlin/Any| { public final [ARGUMENTS_OF_ANNOTATIONS] class ResolveMe<[ARGUMENTS_OF_ANNOTATIONS] T : R|kotlin/Int|, [ARGUMENTS_OF_ANNOTATIONS] K> : R|kotlin/Any| {
public [ARGUMENTS_OF_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor<[ARGUMENTS_OF_ANNOTATIONS] T : R|kotlin/Int|, [ARGUMENTS_OF_ANNOTATIONS] K>(): R|ResolveMe<T, K>| { public [ARGUMENTS_OF_ANNOTATIONS] [ContainingClassKey=ResolveMe] constructor<[ARGUMENTS_OF_ANNOTATIONS] T : R|kotlin/Int|, [ARGUMENTS_OF_ANNOTATIONS] K>(): R|ResolveMe<T, K>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -3,7 +3,7 @@ RAW_FIR:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| { @JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -17,7 +17,7 @@ IMPORTS:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| { @JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -31,7 +31,7 @@ COMPILER_REQUIRED_ANNOTATIONS:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| { @JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -45,7 +45,7 @@ COMPANION_GENERATION:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| { @JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -59,7 +59,7 @@ SUPER_TYPES:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| { @JvmInline() public? final? inline [RAW_FIR] class Value : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [RAW_FIR] [ContainingClassKey=Value] constructor([RAW_FIR] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [RAW_FIR] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -73,7 +73,7 @@ TYPES:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public? final? inline [SUPER_TYPES] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public? final? inline [SUPER_TYPES] class Value : R|kotlin/Any| {
public? [SUPER_TYPES] [ContainingClassKey=Value] constructor([SUPER_TYPES] [CorrespondingProperty=/Value.value] value: Int): R|Value| { public? [SUPER_TYPES] [ContainingClassKey=Value] constructor([SUPER_TYPES] [CorrespondingProperty=/Value.value] value: Int): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -87,7 +87,7 @@ STATUS:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -101,7 +101,7 @@ ARGUMENTS_OF_ANNOTATIONS:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -115,7 +115,7 @@ CONTRACTS:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [SUPER_TYPES] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public? [TYPES] [ContainingClassKey=Value] constructor([TYPES] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value| public? final? [SUPER_TYPES] [IsFromPrimaryConstructor=true] val value: Int = R|<local>/value|
@@ -130,7 +130,7 @@ IMPLICIT_TYPES_BODY_RESOLVE:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value| public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value|
@@ -145,7 +145,7 @@ ANNOTATIONS_ARGUMENTS_MAPPING:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value| public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value|
@@ -160,7 +160,7 @@ EXPECT_ACTUAL_MATCHING:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value| public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value|
@@ -175,7 +175,7 @@ BODY_RESOLVE:
FILE: functionInValueClass.kt FILE: functionInValueClass.kt
@R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| { @R|kotlin/jvm/JvmInline|() public final inline [STATUS] [FirValueClassRepresentationKey=InlineClassRepresentation(underlyingPropertyName=value, underlyingType=kotlin/Int)] class Value : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| { public [STATUS] [ContainingClassKey=Value] constructor([STATUS] [CorrespondingProperty=/Value.value] value: R|kotlin/Int|): R|Value| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value| public final [STATUS] [IsFromPrimaryConstructor=true] val value: R|kotlin/Int| = R|<local>/value|
@@ -4,10 +4,7 @@ FILE: secondaryConstructor.kt
public? final? [RAW_FIR] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -16,10 +13,7 @@ FILE: secondaryConstructor.kt
public? final? [RAW_FIR] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -28,10 +22,7 @@ FILE: secondaryConstructor.kt
public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -40,10 +31,7 @@ FILE: secondaryConstructor.kt
public? final? [COMPANION_GENERATION] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [COMPANION_GENERATION] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -52,10 +40,7 @@ FILE: secondaryConstructor.kt
public? final? [SUPER_TYPES] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [SUPER_TYPES] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -64,10 +49,7 @@ FILE: secondaryConstructor.kt
public? final? [TYPES] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public? final? [TYPES] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -76,10 +58,7 @@ FILE: secondaryConstructor.kt
public final [STATUS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public final [STATUS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -88,10 +67,7 @@ FILE: secondaryConstructor.kt
public final [ARGUMENTS_OF_ANNOTATIONS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK } public final [ARGUMENTS_OF_ANNOTATIONS] fun resolveMe(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -102,10 +78,7 @@ FILE: secondaryConstructor.kt
} }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -116,10 +89,7 @@ FILE: secondaryConstructor.kt
} }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -130,10 +100,7 @@ FILE: secondaryConstructor.kt
} }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -144,10 +111,7 @@ FILE: secondaryConstructor.kt
} }
public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK } public? final? [RAW_FIR] fun receive([RAW_FIR] value: A): R|kotlin/Unit| { LAZY_BLOCK }
public? final? [RAW_FIR] class A : R|kotlin/Any| { public? final? [RAW_FIR] class A : R|kotlin/Any| {
public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { public? [RAW_FIR] [ContainingClassKey=A] constructor([RAW_FIR] x: Int): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -159,10 +123,7 @@ FILE: secondaryConstructor.kt
public final [CONTRACTS] fun receive([CONTRACTS] value: R|A|): R|kotlin/Unit| { public final [CONTRACTS] fun receive([CONTRACTS] value: R|A|): R|kotlin/Unit| {
} }
public final [STATUS] class A : R|kotlin/Any| { public final [STATUS] class A : R|kotlin/Any| {
public [STATUS] [ContainingClassKey=A] constructor([STATUS] x: R|kotlin/Int|): R|A| { public [STATUS] [ContainingClassKey=A] constructor([STATUS] x: R|kotlin/Int|): R|A| { LAZY_BLOCK }
super<R|kotlin/Any|>()
[RAW_FIR] lval a: <implicit> = x#
}
} }
@@ -133,6 +133,10 @@ class FirJavaConstructor @FirImplementationDetail constructor(
valueParameters += newValueParameters valueParameters += newValueParameters
} }
override fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?) {
error("Delegated constructor cannot be replaced for FirJavaConstructor")
}
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {} override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {}
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) { override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
@@ -188,6 +188,29 @@ open class RawFirBuilder(
return buildOrLazy(buildBlock, ::buildLazyBlock) return buildOrLazy(buildBlock, ::buildLazyBlock)
} }
private inline fun buildOrLazyDelegatedConstructorCall(
isThis: Boolean,
constructedTypeRef: FirTypeRef,
buildCall: () -> FirDelegatedConstructorCall
): FirDelegatedConstructorCall {
return buildOrLazy(buildCall, {
buildLazyDelegatedConstructorCall {
this.isThis = isThis
this.constructedTypeRef = constructedTypeRef
calleeReference = if (isThis) {
buildExplicitThisReference {
source = null
}
} else {
buildExplicitSuperReference {
source = null
superTypeRef = constructedTypeRef
}
}
}
})
}
open fun convertElement(element: KtElement): FirElement? = open fun convertElement(element: KtElement): FirElement? =
element.accept(this@Visitor, Unit) element.accept(this@Visitor, Unit)
@@ -206,7 +229,8 @@ open class RawFirBuilder(
defaultTypeRef: FirTypeRef? = null, defaultTypeRef: FirTypeRef? = null,
valueParameterDeclaration: ValueParameterDeclaration, valueParameterDeclaration: ValueParameterDeclaration,
additionalAnnotations: List<FirAnnotation> = emptyList() additionalAnnotations: List<FirAnnotation> = emptyList()
): FirValueParameter = valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations) ): FirValueParameter =
valueParameter.toFirValueParameter(defaultTypeRef, functionSymbol, valueParameterDeclaration, additionalAnnotations)
private fun KtTypeReference?.toFirOrImplicitType(): FirTypeRef = private fun KtTypeReference?.toFirOrImplicitType(): FirTypeRef =
convertSafe() ?: buildImplicitTypeRef { convertSafe() ?: buildImplicitTypeRef {
@@ -291,14 +315,12 @@ open class RawFirBuilder(
): FirDeclaration { ): FirDeclaration {
return when (this) { return when (this) {
is KtSecondaryConstructor -> { is KtSecondaryConstructor -> {
disabledLazyMode { toFirConstructor(
toFirConstructor( if (isDelegatedCallToThis()) delegatedSelfType else delegatedSuperType,
delegatedSuperType, delegatedSelfType,
delegatedSelfType, owner,
owner, ownerTypeParameters,
ownerTypeParameters )
)
}
} }
is KtEnumEntry -> { is KtEnumEntry -> {
val primaryConstructor = owner.primaryConstructor val primaryConstructor = owner.primaryConstructor
@@ -890,11 +912,12 @@ open class RawFirBuilder(
if (primaryConstructor != null || (this !is KtClass || !this.isInterface()) && shouldGenerateImplicitPrimaryConstructor) { if (primaryConstructor != null || (this !is KtClass || !this.isInterface()) && shouldGenerateImplicitPrimaryConstructor) {
val firPrimaryConstructor = primaryConstructor.toFirConstructor( val firPrimaryConstructor = primaryConstructor.toFirConstructor(
superTypeCallEntry, superTypeCallEntry,
delegatedSuperTypeRef!!, delegatedSuperTypeRef,
delegatedSelfTypeRef ?: delegatedSuperTypeRef!!, delegatedSelfTypeRef ?: delegatedSuperTypeRef!!,
owner = this, owner = this,
containerTypeParameters, containerTypeParameters,
containingClassIsExpectClass, containingClassIsExpectClass,
copyConstructedTypeRefWithImplicitSource = true,
) )
container.declarations += firPrimaryConstructor container.declarations += firPrimaryConstructor
} }
@@ -902,27 +925,49 @@ open class RawFirBuilder(
return delegatedSuperTypeRef!! to delegateFieldsMap.takeIf { it.isNotEmpty() } return delegatedSuperTypeRef!! to delegateFieldsMap.takeIf { it.isNotEmpty() }
} }
private fun KtPrimaryConstructor?.toFirConstructor( /**
* @param delegatedSuperTypeRef can be null if containingClassIsExpectClass is true
*/
protected fun KtPrimaryConstructor?.toFirConstructor(
superTypeCallEntry: KtSuperTypeCallEntry?, superTypeCallEntry: KtSuperTypeCallEntry?,
delegatedSuperTypeRef: FirTypeRef, delegatedSuperTypeRef: FirTypeRef?,
delegatedSelfTypeRef: FirTypeRef, delegatedSelfTypeRef: FirTypeRef,
owner: KtClassOrObject, owner: KtClassOrObject,
ownerTypeParameters: List<FirTypeParameterRef>, ownerTypeParameters: List<FirTypeParameterRef>,
containingClassIsExpectClass: Boolean, containingClassIsExpectClass: Boolean,
copyConstructedTypeRefWithImplicitSource: Boolean,
): FirConstructor { ): FirConstructor {
val constructorCall = superTypeCallEntry?.toFirSourceElement() val constructorCall = superTypeCallEntry?.toFirSourceElement()
val constructorSource = this?.toFirSourceElement() val constructorSource = this?.toFirSourceElement()
?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor) ?: owner.toKtPsiSourceElement(KtFakeSourceElementKind.ImplicitConstructor)
val firDelegatedCall = if (containingClassIsExpectClass) null else buildDelegatedConstructorCall { val firDelegatedCall = if (containingClassIsExpectClass) null else {
source = constructorCall ?: constructorSource.fakeElement(KtFakeSourceElementKind.DelegatingConstructorCall) val constructedTypeRef = if (copyConstructedTypeRefWithImplicitSource) {
constructedTypeRef = delegatedSuperTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef) delegatedSuperTypeRef!!.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
isThis = false } else {
calleeReference = buildExplicitSuperReference { delegatedSuperTypeRef!!
source = superTypeCallEntry?.calleeExpression?.toFirSourceElement(KtFakeSourceElementKind.DelegatingConstructorCall)
?: this@buildDelegatedConstructorCall.source?.fakeElement(KtFakeSourceElementKind.DelegatingConstructorCall)
superTypeRef = this@buildDelegatedConstructorCall.constructedTypeRef
} }
superTypeCallEntry?.extractArgumentsTo(this) val delegatedConstructorCall = {
buildDelegatedConstructorCall {
source = constructorCall ?: constructorSource.fakeElement(KtFakeSourceElementKind.DelegatingConstructorCall)
this.constructedTypeRef = constructedTypeRef
isThis = false
calleeReference = buildExplicitSuperReference {
source =
superTypeCallEntry?.calleeExpression?.toFirSourceElement(KtFakeSourceElementKind.DelegatingConstructorCall)
?: this@buildDelegatedConstructorCall.source?.fakeElement(KtFakeSourceElementKind.DelegatingConstructorCall)
superTypeRef = this@buildDelegatedConstructorCall.constructedTypeRef
}
superTypeCallEntry?.extractArgumentsTo(this)
}
}
if (this == null && owner !is KtEnumEntry) {
// primary constructor without body
delegatedConstructorCall()
} else buildOrLazyDelegatedConstructorCall(
isThis = false,
constructedTypeRef,
delegatedConstructorCall,
)
} }
// See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors // See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors
@@ -1003,7 +1048,7 @@ open class RawFirBuilder(
} }
} }
private fun convertScript(script: KtScript, containingFile: FirFileBuilder,): FirScript { private fun convertScript(script: KtScript, containingFile: FirFileBuilder): FirScript {
return buildScript { return buildScript {
source = script.toFirSourceElement() source = script.toFirSourceElement()
moduleData = baseModuleData moduleData = baseModuleData
@@ -1086,7 +1131,8 @@ open class RawFirBuilder(
delegatedEntrySelfType, delegatedEntrySelfType,
owner = ktEnumEntry, owner = ktEnumEntry,
typeParameters, typeParameters,
containingClassIsExpectClass containingClassIsExpectClass,
copyConstructedTypeRefWithImplicitSource = true,
) )
// Use ANONYMOUS_OBJECT_NAME for the owner class id for enum entry declarations (see KT-42351) // Use ANONYMOUS_OBJECT_NAME for the owner class id for enum entry declarations (see KT-42351)
withChildClassName(SpecialNames.ANONYMOUS, forceLocalContext = true, isExpect = false) { withChildClassName(SpecialNames.ANONYMOUS, forceLocalContext = true, isExpect = false) {
@@ -1541,9 +1587,9 @@ open class RawFirBuilder(
} }
} }
private fun KtSecondaryConstructor.toFirConstructor( protected fun KtSecondaryConstructor.toFirConstructor(
delegatedSuperTypeRef: FirTypeRef, delegatedTypeRef: FirTypeRef,
delegatedSelfTypeRef: FirTypeRef, selfTypeRef: FirTypeRef,
owner: KtClassOrObject, owner: KtClassOrObject,
ownerTypeParameters: List<FirTypeParameterRef> ownerTypeParameters: List<FirTypeParameterRef>
): FirConstructor { ): FirConstructor {
@@ -1552,7 +1598,7 @@ open class RawFirBuilder(
source = this@toFirConstructor.toFirSourceElement() source = this@toFirConstructor.toFirSourceElement()
moduleData = baseModuleData moduleData = baseModuleData
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
returnTypeRef = delegatedSelfTypeRef returnTypeRef = selfTypeRef
val explicitVisibility = visibility val explicitVisibility = visibility
status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply { status = FirDeclarationStatusImpl(explicitVisibility, Modality.FINAL).apply {
isExpect = hasExpectModifier() || this@RawFirBuilder.context.containerIsExpect isExpect = hasExpectModifier() || this@RawFirBuilder.context.containerIsExpect
@@ -1563,10 +1609,12 @@ open class RawFirBuilder(
} }
dispatchReceiverType = owner.obtainDispatchReceiverForConstructor() dispatchReceiverType = owner.obtainDispatchReceiverForConstructor()
symbol = FirConstructorSymbol(callableIdForClassConstructor()) symbol = FirConstructorSymbol(callableIdForClassConstructor())
delegatedConstructor = getDelegationCall().convert( delegatedConstructor = buildOrLazyDelegatedConstructorCall(
delegatedSuperTypeRef, isThis = isDelegatedCallToThis(),
delegatedSelfTypeRef, constructedTypeRef = delegatedTypeRef,
) ) {
getDelegationCall().convert(delegatedTypeRef)
}
this@RawFirBuilder.context.firFunctionTargets += target this@RawFirBuilder.context.firFunctionTargets += target
extractAnnotationsTo(this) extractAnnotationsTo(this)
typeParameters += constructorTypeParametersFromConstructedClass(ownerTypeParameters) typeParameters += constructorTypeParametersFromConstructedClass(ownerTypeParameters)
@@ -1583,8 +1631,7 @@ open class RawFirBuilder(
} }
private fun KtConstructorDelegationCall.convert( private fun KtConstructorDelegationCall.convert(
delegatedSuperTypeRef: FirTypeRef, delegatedType: FirTypeRef,
delegatedSelfTypeRef: FirTypeRef,
): FirDelegatedConstructorCall { ): FirDelegatedConstructorCall {
val isThis = isCallToThis //|| (isImplicit && hasPrimaryConstructor) val isThis = isCallToThis //|| (isImplicit && hasPrimaryConstructor)
val source = if (isImplicit) { val source = if (isImplicit) {
@@ -1592,10 +1639,6 @@ open class RawFirBuilder(
} else { } else {
this.toFirSourceElement() this.toFirSourceElement()
} }
val delegatedType = when {
isThis -> delegatedSelfTypeRef
else -> delegatedSuperTypeRef
}
return buildDelegatedConstructorCall { return buildDelegatedConstructorCall {
this.source = source this.source = source
constructedTypeRef = delegatedType.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef) constructedTypeRef = delegatedType.copyWithNewSourceKind(KtFakeSourceElementKind.ImplicitTypeRef)
@@ -1619,7 +1662,7 @@ open class RawFirBuilder(
} }
private fun KtDeclarationWithInitializer.toInitializerExpression() = private fun KtDeclarationWithInitializer.toInitializerExpression() =
runIf (hasInitializer()) { runIf(hasInitializer()) {
buildOrLazyExpression(initializer?.toFirSourceElement()) { buildOrLazyExpression(initializer?.toFirSourceElement()) {
initializer.toFirExpression("Should have initializer") initializer.toFirExpression("Should have initializer")
} }
@@ -13,14 +13,14 @@ FILE: annotation.kt
} }
@base() public? final? class correct : R|kotlin/Any| { @base() public? final? class correct : R|kotlin/Any| {
public? constructor(@base() x: Int): R|correct| { public? constructor(@base() x: Int): R|correct| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
@base() public? final? val x: Int = R|<local>/x| @base() public? final? val x: Int = R|<local>/x|
public? get(): Int public? get(): Int
@base() public? constructor(): R|correct| { @base() public? constructor(): R|correct| {
this<R|correct|>(IntegerLiteral(0)) LAZY_this<R|correct|>
} }
} }
@@ -1,7 +1,7 @@
FILE: constructorInObject.kt FILE: constructorInObject.kt
public? final? object A : R|kotlin/Any| { public? final? object A : R|kotlin/Any| {
public? constructor(): R|A| { public? constructor(): R|A| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
init { LAZY_BLOCK } init { LAZY_BLOCK }
@@ -30,7 +30,7 @@ FILE: constructorInObject.kt
public? final? companion object Companion : R|kotlin/Any| { public? final? companion object Companion : R|kotlin/Any| {
public? constructor(): R|C.Companion| { public? constructor(): R|C.Companion| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -15,7 +15,7 @@ FILE: propertyAccessorsContractDescription.kt
} }
public? final? class AnotherClass : R|kotlin/Any| { public? final? class AnotherClass : R|kotlin/Any| {
public? constructor(multiplier: Int): R|AnotherClass| { public? constructor(multiplier: Int): R|AnotherClass| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? var anotherInt: Int = LAZY_EXPRESSION public? final? var anotherInt: Int = LAZY_EXPRESSION
@@ -33,7 +33,7 @@ FILE: propertyAccessorsContractDescription.kt
} }
public? final? class SomeClass : R|kotlin/Any| { public? final? class SomeClass : R|kotlin/Any| {
public? constructor(multiplier: Int?): R|SomeClass| { public? constructor(multiplier: Int?): R|SomeClass| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? var someInt: Int = LAZY_EXPRESSION public? final? var someInt: Int = LAZY_EXPRESSION
@@ -1,7 +1,7 @@
FILE: derivedClass.kt FILE: derivedClass.kt
public? open class Base<T> : R|kotlin/Any| { public? open class Base<T> : R|kotlin/Any| {
public? constructor<T>(x: T): R|Base<T>| { public? constructor<T>(x: T): R|Base<T>| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: T = R|<local>/x| public? final? val x: T = R|<local>/x|
@@ -10,7 +10,7 @@ FILE: derivedClass.kt
} }
public? final? class Derived<T : Any> : Base<T> { public? final? class Derived<T : Any> : Base<T> {
public? constructor<T : Any>(x: T): R|Derived<T>| { public? constructor<T : Any>(x: T): R|Derived<T>| {
super<Base<T>>(x#) LAZY_super<Base<T>>
} }
} }
@@ -19,7 +19,7 @@ FILE: enums.kt
} }
public? final? enum class Planet : R|kotlin/Enum<Planet>| { public? final? enum class Planet : R|kotlin/Enum<Planet>| {
private constructor(m: Double, r: Double): R|Planet| { private constructor(m: Double, r: Double): R|Planet| {
super<R|kotlin/Enum<Planet>|>() LAZY_super<R|kotlin/Enum<Planet>|>
} }
public? final? val m: Double = R|<local>/m| public? final? val m: Double = R|<local>/m|
@@ -58,7 +58,7 @@ FILE: enums.kt
} }
public? final? enum class PseudoInsn : R|kotlin/Enum<PseudoInsn>| { public? final? enum class PseudoInsn : R|kotlin/Enum<PseudoInsn>| {
private constructor(signature: String = String(()V)): R|PseudoInsn| { private constructor(signature: String = String(()V)): R|PseudoInsn| {
super<R|kotlin/Enum<PseudoInsn>|>() LAZY_super<R|kotlin/Enum<PseudoInsn>|>
} }
public? final? val signature: String = R|<local>/signature| public? final? val signature: String = R|<local>/signature|
@@ -15,7 +15,7 @@ FILE: enums2.kt
} }
public? final? enum class SomeEnum : R|kotlin/Enum<SomeEnum>| { public? final? enum class SomeEnum : R|kotlin/Enum<SomeEnum>| {
private constructor(x: Some): R|SomeEnum| { private constructor(x: Some): R|SomeEnum| {
super<R|kotlin/Enum<SomeEnum>|>() LAZY_super<R|kotlin/Enum<SomeEnum>|>
} }
public? final? val x: Some = R|<local>/x| public? final? val x: Some = R|<local>/x|
@@ -1,7 +1,7 @@
FILE: nestedClass.kt FILE: nestedClass.kt
public? abstract class Base : R|kotlin/Any| { public? abstract class Base : R|kotlin/Any| {
public? constructor(s: String): R|Base| { public? constructor(s: String): R|Base| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val s: String = R|<local>/s| public? final? val s: String = R|<local>/s|
@@ -15,7 +15,7 @@ FILE: nestedClass.kt
public? final? class Derived : Base { public? final? class Derived : Base {
public? constructor(s: String): R|Outer.Derived| { public? constructor(s: String): R|Outer.Derived| {
super<Base>(s#) LAZY_super<Base>
} }
} }
@@ -1,7 +1,7 @@
FILE: noParameterTypRefInPrimaryConstructor.kt FILE: noParameterTypRefInPrimaryConstructor.kt
public? final? class X : R|kotlin/Any| { public? final? class X : R|kotlin/Any| {
public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|X| { public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|X| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
} }
@@ -1,7 +1,7 @@
FILE: noParameterTypRefInPrimaryConsturctorVal.kt FILE: noParameterTypRefInPrimaryConsturctorVal.kt
public? final? class X : R|kotlin/Any| { public? final? class X : R|kotlin/Any| {
public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|X| { public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|X| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: <ERROR TYPE REF: No type for parameter> = R|<local>/x| public? final? val x: <ERROR TYPE REF: No type for parameter> = R|<local>/x|
@@ -1,7 +1,5 @@
FILE: noParameterTypRefInSecondaryConstructor.kt FILE: noParameterTypRefInSecondaryConstructor.kt
public? final? class C : R|kotlin/Any| { public? final? class C : R|kotlin/Any| {
public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|C| { public? constructor(x: <ERROR TYPE REF: No type for parameter>): R|C| { LAZY_BLOCK }
super<R|kotlin/Any|>()
}
} }
@@ -3,13 +3,10 @@ FILE: noPrimaryConstructor.kt
public? final? val x: String public? final? val x: String
public? get(): String public? get(): String
public? constructor(x: String): R|NoPrimary| { public? constructor(x: String): R|NoPrimary| { LAZY_BLOCK }
super<R|kotlin/Any|>()
this#.x# = x#
}
public? constructor(): R|NoPrimary| { public? constructor(): R|NoPrimary| {
this<R|NoPrimary|>(String()) LAZY_this<R|NoPrimary|>
} }
} }
@@ -8,7 +8,7 @@ FILE: annotated.kt
public? final? fun foo(arg: Int): Int { LAZY_BLOCK } public? final? fun foo(arg: Int): Int { LAZY_BLOCK }
public? final? data class Two : R|kotlin/Any| { public? final? data class Two : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Two| { public? constructor(x: Int, y: Int): R|Two| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: Int = R|<local>/x| public? final? val x: Int = R|<local>/x|
@@ -4,7 +4,7 @@ FILE: arrayAccess.kt
public? final? fun foo(): <implicit> { LAZY_BLOCK } public? final? fun foo(): <implicit> { LAZY_BLOCK }
public? final? class Wrapper : R|kotlin/Any| { public? final? class Wrapper : R|kotlin/Any| {
public? constructor(v: IntArray): R|Wrapper| { public? constructor(v: IntArray): R|Wrapper| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val v: IntArray = R|<local>/v| public? final? val v: IntArray = R|<local>/v|
@@ -4,7 +4,7 @@ FILE: calls.kt
public? final? fun testRegular(): Int { LAZY_BLOCK } public? final? fun testRegular(): Int { LAZY_BLOCK }
public? final? class My : R|kotlin/Any| { public? final? class My : R|kotlin/Any| {
public? constructor(x: Int): R|My| { public? constructor(x: Int): R|My| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? var x: Int = R|<local>/x| public? final? var x: Int = R|<local>/x|
@@ -1,7 +1,7 @@
FILE: collectionLiterals.kt FILE: collectionLiterals.kt
public? final? annotation class Ann1 : R|kotlin/Annotation| { public? final? annotation class Ann1 : R|kotlin/Annotation| {
public? constructor(arr: IntArray): R|Ann1| { public? constructor(arr: IntArray): R|Ann1| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val arr: IntArray = R|<local>/arr| public? final? val arr: IntArray = R|<local>/arr|
@@ -10,7 +10,7 @@ FILE: collectionLiterals.kt
} }
public? final? annotation class Ann2 : R|kotlin/Annotation| { public? final? annotation class Ann2 : R|kotlin/Annotation| {
public? constructor(arr: DoubleArray): R|Ann2| { public? constructor(arr: DoubleArray): R|Ann2| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val arr: DoubleArray = R|<local>/arr| public? final? val arr: DoubleArray = R|<local>/arr|
@@ -19,7 +19,7 @@ FILE: collectionLiterals.kt
} }
public? final? annotation class Ann3 : R|kotlin/Annotation| { public? final? annotation class Ann3 : R|kotlin/Annotation| {
public? constructor(arr: Array<String>): R|Ann3| { public? constructor(arr: Array<String>): R|Ann3| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val arr: Array<String> = R|<local>/arr| public? final? val arr: Array<String> = R|<local>/arr|
@@ -1,7 +1,7 @@
FILE: destructuring.kt FILE: destructuring.kt
public? final? data class Some : R|kotlin/Any| { public? final? data class Some : R|kotlin/Any| {
public? constructor(first: Int, second: Double, third: String): R|Some| { public? constructor(first: Int, second: Double, third: String): R|Some| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val first: Int = R|<local>/first| public? final? val first: Int = R|<local>/first|
@@ -4,7 +4,7 @@ FILE: for.kt
public? final? fun bar(list: List<String>): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun bar(list: List<String>): R|kotlin/Unit| { LAZY_BLOCK }
public? final? data class Some : R|kotlin/Any| { public? final? data class Some : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Some| { public? constructor(x: Int, y: Int): R|Some| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: Int = R|<local>/x| public? final? val x: Int = R|<local>/x|
@@ -1,7 +1,7 @@
FILE: init.kt FILE: init.kt
public? final? class WithInit : R|kotlin/Any| { public? final? class WithInit : R|kotlin/Any| {
public? constructor(x: Int): R|WithInit| { public? constructor(x: Int): R|WithInit| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: Int public? final? val x: Int
@@ -1,7 +1,7 @@
FILE: lambda.kt FILE: lambda.kt
public? final? data class Tuple : R|kotlin/Any| { public? final? data class Tuple : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Tuple| { public? constructor(x: Int, y: Int): R|Tuple| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val x: Int = R|<local>/x| public? final? val x: Int = R|<local>/x|
@@ -2,7 +2,7 @@ FILE: unary.kt
public? final? fun test(): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun test(): R|kotlin/Unit| { LAZY_BLOCK }
public? final? class X : R|kotlin/Any| { public? final? class X : R|kotlin/Any| {
public? constructor(i: Int): R|X| { public? constructor(i: Int): R|X| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val i: Int = R|<local>/i| public? final? val i: Int = R|<local>/i|
@@ -13,7 +13,7 @@ FILE: unary.kt
public? final? fun test3(arr: Array<Int>): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun test3(arr: Array<Int>): R|kotlin/Unit| { LAZY_BLOCK }
public? final? class Y : R|kotlin/Any| { public? final? class Y : R|kotlin/Any| {
public? constructor(arr: Array<Int>): R|Y| { public? constructor(arr: Array<Int>): R|Y| {
super<R|kotlin/Any|>() LAZY_super<R|kotlin/Any|>
} }
public? final? val arr: Array<Int> = R|<local>/arr| public? final? val arr: Array<Int> = R|<local>/arr|
@@ -65,6 +65,8 @@ abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner {
abstract override fun replaceValueParameters(newValueParameters: List<FirValueParameter>) abstract override fun replaceValueParameters(newValueParameters: List<FirValueParameter>)
abstract fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?)
abstract override fun replaceBody(newBody: FirBlock?) abstract override fun replaceBody(newBody: FirBlock?)
abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirConstructor abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirConstructor
@@ -159,6 +159,10 @@ internal class FirConstructorImpl(
valueParameters.addAll(newValueParameters) valueParameters.addAll(newValueParameters)
} }
override fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?) {
delegatedConstructor = newDelegatedConstructor
}
override fun replaceBody(newBody: FirBlock?) { override fun replaceBody(newBody: FirBlock?) {
body = newBody body = newBody
} }
@@ -160,6 +160,10 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
valueParameters.addAll(newValueParameters) valueParameters.addAll(newValueParameters)
} }
override fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?) {
delegatedConstructor = newDelegatedConstructor
}
override fun replaceBody(newBody: FirBlock?) { override fun replaceBody(newBody: FirBlock?) {
body = newBody body = newBody
} }
@@ -0,0 +1,61 @@
/*
* Copyright 2010-2022 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")
package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyDelegatedConstructorCall
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirLazyDelegatedConstructorCallBuilder : FirAnnotationContainerBuilder {
lateinit var constructedTypeRef: FirTypeRef
lateinit var calleeReference: FirReference
var isThis: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
@OptIn(FirImplementationDetail::class)
override fun build(): FirDelegatedConstructorCall {
return FirLazyDelegatedConstructorCall(
constructedTypeRef,
calleeReference,
isThis,
)
}
@Deprecated("Modification of 'source' has no impact for FirLazyDelegatedConstructorCallBuilder", level = DeprecationLevel.HIDDEN)
override var source: KtSourceElement?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'annotations' has no impact for FirLazyDelegatedConstructorCallBuilder", level = DeprecationLevel.HIDDEN)
override val annotations: MutableList<FirAnnotation> = mutableListOf()
}
@OptIn(ExperimentalContracts::class)
inline fun buildLazyDelegatedConstructorCall(init: FirLazyDelegatedConstructorCallBuilder.() -> Unit): FirDelegatedConstructorCall {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirLazyDelegatedConstructorCallBuilder().apply(init).build()
}
@@ -0,0 +1,72 @@
/*
* Copyright 2010-2022 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")
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
class FirLazyDelegatedConstructorCall @FirImplementationDetail constructor(
override var constructedTypeRef: FirTypeRef,
override var calleeReference: FirReference,
override val isThis: Boolean,
) : FirDelegatedConstructorCall() {
override val source: KtSourceElement? get() = error("FirLazyDelegatedConstructorCall should be calculated before accessing")
override val annotations: List<FirAnnotation> get() = error("FirLazyDelegatedConstructorCall should be calculated before accessing")
override val argumentList: FirArgumentList get() = error("FirLazyDelegatedConstructorCall should be calculated before accessing")
override val contextReceiverArguments: List<FirExpression> get() = error("FirLazyDelegatedConstructorCall should be calculated before accessing")
override val dispatchReceiver: FirExpression get() = error("FirLazyDelegatedConstructorCall should be calculated before accessing")
override val isSuper: Boolean get() = !isThis
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
constructedTypeRef.accept(visitor, data)
calleeReference.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLazyDelegatedConstructorCall {
constructedTypeRef = constructedTypeRef.transform(transformer, data)
transformCalleeReference(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLazyDelegatedConstructorCall {
return this
}
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirLazyDelegatedConstructorCall {
return this
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirLazyDelegatedConstructorCall {
calleeReference = calleeReference.transform(transformer, data)
return this
}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {}
override fun replaceContextReceiverArguments(newContextReceiverArguments: List<FirExpression>) {}
override fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef) {
constructedTypeRef = newConstructedTypeRef
}
override fun replaceCalleeReference(newCalleeReference: FirReference) {
calleeReference = newCalleeReference
}
}
@@ -654,10 +654,15 @@ class FirRenderer(
} }
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
val dispatchReceiver = delegatedConstructorCall.dispatchReceiver if (delegatedConstructorCall !is FirLazyDelegatedConstructorCall) {
if (dispatchReceiver !is FirNoReceiverExpression) { val dispatchReceiver = delegatedConstructorCall.dispatchReceiver
dispatchReceiver.accept(this) if (dispatchReceiver !is FirNoReceiverExpression) {
print(".") dispatchReceiver.accept(this)
print(".")
}
}
if (delegatedConstructorCall is FirLazyDelegatedConstructorCall) {
print("LAZY_")
} }
if (delegatedConstructorCall.isSuper) { if (delegatedConstructorCall.isSuper) {
print("super<") print("super<")
@@ -666,7 +671,9 @@ class FirRenderer(
} }
delegatedConstructorCall.constructedTypeRef.accept(this) delegatedConstructorCall.constructedTypeRef.accept(this)
print(">") print(">")
visitCall(delegatedConstructorCall) if (delegatedConstructorCall !is FirLazyDelegatedConstructorCall) {
visitCall(delegatedConstructorCall)
}
} }
override fun visitTypeRef(typeRef: FirTypeRef) { override fun visitTypeRef(typeRef: FirTypeRef) {
@@ -190,7 +190,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
defaultNull("label") defaultNull("label")
} }
builder(delegatedConstructorCall) { builder(delegatedConstructorCall, type = "FirDelegatedConstructorCallImpl") {
parents += callBuilder parents += callBuilder
default("argumentList") { default("argumentList") {
value = "FirEmptyArgumentList" value = "FirEmptyArgumentList"
@@ -128,6 +128,35 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
useTypes(explicitThisReferenceType, explicitSuperReferenceType) useTypes(explicitThisReferenceType, explicitSuperReferenceType)
} }
impl(delegatedConstructorCall, "FirLazyDelegatedConstructorCall") {
val error = """error("FirLazyDelegatedConstructorCall should be calculated before accessing")"""
default("source") {
value = error
withGetter = true
}
default("annotations") {
value = error
withGetter = true
}
default("argumentList") {
value = error
withGetter = true
}
default("contextReceiverArguments") {
value = error
withGetter = true
}
default("dispatchReceiver") {
value = error
withGetter = true
}
default("isSuper") {
value = "!isThis"
withGetter = true
}
publicImplementation()
}
impl(expression, "FirElseIfTrueCondition") { impl(expression, "FirElseIfTrueCondition") {
defaultTypeRefWithSource("FirImplicitBooleanTypeRef") defaultTypeRefWithSource("FirImplicitBooleanTypeRef")
useTypes(implicitBooleanTypeRefType) useTypes(implicitBooleanTypeRefType)
@@ -379,7 +379,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
constructor.configure { constructor.configure {
+annotations +annotations
+symbol("FirConstructorSymbol") +symbol("FirConstructorSymbol")
+field("delegatedConstructor", delegatedConstructorCall, nullable = true).withTransform() +field("delegatedConstructor", delegatedConstructorCall, nullable = true, withReplace = true).withTransform()
+body(nullable = true) +body(nullable = true)
+booleanField("isPrimary") +booleanField("isPrimary")
} }