[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:
+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
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirErrorConstructor
|
||||
import org.jetbrains.kotlin.fir.isCatchParameter
|
||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
||||
|
||||
@@ -23,6 +24,9 @@ open class FirDeclarationRenderer {
|
||||
typeRenderer.render(it)
|
||||
printer.print(".")
|
||||
}
|
||||
if (declaration is FirErrorConstructor) {
|
||||
printer.print("error_")
|
||||
}
|
||||
printer.print("constructor")
|
||||
return
|
||||
}
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
fields from functionCall
|
||||
}
|
||||
|
||||
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl")) {
|
||||
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl", "FirErrorConstructor")) {
|
||||
builder(constructor, constructorType) {
|
||||
parents += abstractConstructorBuilder
|
||||
defaultNull("delegatedConstructor")
|
||||
|
||||
+5
@@ -26,6 +26,11 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
defaultTrue("isPrimary", withGetter = true)
|
||||
}
|
||||
|
||||
impl(constructor, "FirErrorConstructor") {
|
||||
publicImplementation()
|
||||
defaultFalse("isPrimary", withGetter = true)
|
||||
}
|
||||
|
||||
impl(typeParameterRef, "FirOuterClassTypeParameterRef") {
|
||||
publicImplementation()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user