org.jetbrains.kotlin.ir.symbols.impl.IrPrivateSymbolBase.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2020 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.
*/
package org.jetbrains.kotlin.ir.symbols.impl
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor
import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.render
/**
* The base class for all non-public (wrt linkage) symbols.
*
* Its [signature] is always `null`.
*
* TODO: Merge with [IrPublicSymbolBase] ([KT-44721](https://youtrack.jetbrains.com/issue/KT-44721))
*/
@OptIn(ObsoleteDescriptorBasedAPI::class)
abstract class IrSymbolBase(
private val _descriptor: Descriptor?
) : IrSymbol {
@ObsoleteDescriptorBasedAPI
@Suppress("UNCHECKED_CAST")
override val descriptor: Descriptor
get() = _descriptor ?: (owner as IrDeclaration).toIrBasedDescriptor() as Descriptor
@ObsoleteDescriptorBasedAPI
override val hasDescriptor: Boolean
get() = _descriptor != null
override fun toString(): String {
if (isBound) return owner.render()
return "Unbound private symbol " +
if (_descriptor != null) "${this::class.java.simpleName}: $_descriptor" else super.toString()
}
}
abstract class IrBindableSymbolBase(
descriptor: Descriptor?,
) : IrSymbolBase(descriptor), IrBindableSymbol
where Descriptor : DeclarationDescriptor,
Owner : IrSymbolOwner {
init {
assert(descriptor == null || isOriginalDescriptor(descriptor)) {
"Substituted descriptor $descriptor for ${descriptor!!.original}"
}
if (descriptor != null) {
val containingDeclaration = descriptor.containingDeclaration
assert(containingDeclaration == null || isOriginalDescriptor(containingDeclaration)) {
"Substituted containing declaration: $containingDeclaration\nfor descriptor: $descriptor"
}
}
}
private fun isOriginalDescriptor(descriptor: DeclarationDescriptor): Boolean =
// TODO fix declaring/referencing value parameters: compute proper original descriptor
descriptor is ValueParameterDescriptor && isOriginalDescriptor(descriptor.containingDeclaration) ||
descriptor == descriptor.original
private var _owner: Owner? = null
override val owner: Owner
get() = _owner ?: error("${javaClass.simpleName} is unbound. Signature: $signature")
override fun bind(owner: Owner) {
if (_owner == null) {
_owner = owner
} else {
error("${javaClass.simpleName} is already bound. Signature: $signature. Owner: ${_owner?.render()}")
}
}
override val signature: IdSignature?
get() = null
override val isBound: Boolean
get() = _owner != null
override var privateSignature: IdSignature? = null
}
class IrFileSymbolImpl(descriptor: PackageFragmentDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrFileSymbol
class IrExternalPackageFragmentSymbolImpl(descriptor: PackageFragmentDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrExternalPackageFragmentSymbol
@OptIn(ObsoleteDescriptorBasedAPI::class)
class IrAnonymousInitializerSymbolImpl(descriptor: ClassDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrAnonymousInitializerSymbol {
constructor(irClassSymbol: IrClassSymbol) : this(irClassSymbol.descriptor)
}
class IrClassSymbolImpl(descriptor: ClassDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrClassSymbol
class IrEnumEntrySymbolImpl(descriptor: ClassDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrEnumEntrySymbol
class IrFieldSymbolImpl(descriptor: PropertyDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrFieldSymbol
class IrTypeParameterSymbolImpl(descriptor: TypeParameterDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrTypeParameterSymbol
class IrValueParameterSymbolImpl(descriptor: ParameterDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrValueParameterSymbol
class IrVariableSymbolImpl(descriptor: VariableDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrVariableSymbol
class IrSimpleFunctionSymbolImpl(descriptor: FunctionDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrSimpleFunctionSymbol
class IrConstructorSymbolImpl(descriptor: ClassConstructorDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrConstructorSymbol
class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrReturnableBlockSymbol
class IrPropertySymbolImpl(descriptor: PropertyDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrPropertySymbol
class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors? = null) :
IrBindableSymbolBase(descriptor),
IrLocalDelegatedPropertySymbol
class IrTypeAliasSymbolImpl(descriptor: TypeAliasDescriptor? = null) :
IrBindableSymbolBase(descriptor),
IrTypeAliasSymbol
class IrScriptSymbolImpl(descriptor: ScriptDescriptor? = null) :
IrScriptSymbol, IrBindableSymbolBase(descriptor)
© 2015 - 2024 Weber Informatics LLC | Privacy Policy