org.jetbrains.kotlin.ir.symbols.impl.IrPrivateSymbolBase.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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.WrappedDeclarationDescriptor
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
@OptIn(ObsoleteDescriptorBasedAPI::class)
abstract class IrSymbolBase(
@ObsoleteDescriptorBasedAPI
override val descriptor: D
) : IrSymbol {
override fun toString(): String {
if (isBound) return owner.render()
return "Unbound private symbol ${super.toString()}"
}
}
abstract class IrBindableSymbolBase(descriptor: D) :
IrBindableSymbol, IrSymbolBase(descriptor) {
init {
assert(isOriginalDescriptor(descriptor)) {
"Substituted descriptor $descriptor for ${descriptor.original}"
}
if (descriptor !is WrappedDeclarationDescriptor<*>) {
val containingDeclaration = descriptor.containingDeclaration
assert(containingDeclaration == null || isOriginalDescriptor(containingDeclaration)) {
"Substituted containing declaration: $containingDeclaration\nfor descriptor: $descriptor"
}
}
}
private fun isOriginalDescriptor(descriptor: DeclarationDescriptor): Boolean =
descriptor is WrappedDeclarationDescriptor<*> ||
// TODO fix declaring/referencing value parameters: compute proper original descriptor
descriptor is ValueParameterDescriptor && isOriginalDescriptor(descriptor.containingDeclaration) ||
descriptor == descriptor.original
private var _owner: B? = null
override val owner: B
get() = _owner ?: throw IllegalStateException("Symbol with ${javaClass.simpleName} is unbound")
override fun bind(owner: B) {
if (_owner == null) {
_owner = owner
} else {
throw IllegalStateException("${javaClass.simpleName} is already bound: ${owner.render()}")
}
}
override val isPublicApi: Boolean = false
override val signature: IdSignature
get() = error("IdSignature is allowed only for PublicApi symbols")
override val isBound: Boolean
get() = _owner != null
}
class IrFileSymbolImpl(descriptor: PackageFragmentDescriptor) :
IrBindableSymbolBase(descriptor),
IrFileSymbol
class IrExternalPackageFragmentSymbolImpl(descriptor: PackageFragmentDescriptor) :
IrBindableSymbolBase(descriptor),
IrExternalPackageFragmentSymbol
@OptIn(ObsoleteDescriptorBasedAPI::class)
class IrAnonymousInitializerSymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase(descriptor),
IrAnonymousInitializerSymbol {
constructor(irClassSymbol: IrClassSymbol) : this(irClassSymbol.descriptor)
}
class IrClassSymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase(descriptor),
IrClassSymbol
class IrEnumEntrySymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase(descriptor),
IrEnumEntrySymbol
class IrFieldSymbolImpl(descriptor: PropertyDescriptor) :
IrBindableSymbolBase(descriptor),
IrFieldSymbol
class IrTypeParameterSymbolImpl(descriptor: TypeParameterDescriptor) :
IrBindableSymbolBase(descriptor),
IrTypeParameterSymbol
class IrValueParameterSymbolImpl(descriptor: ParameterDescriptor) :
IrBindableSymbolBase(descriptor),
IrValueParameterSymbol
class IrVariableSymbolImpl(descriptor: VariableDescriptor) :
IrBindableSymbolBase(descriptor),
IrVariableSymbol
class IrSimpleFunctionSymbolImpl(descriptor: FunctionDescriptor) :
IrBindableSymbolBase(descriptor),
IrSimpleFunctionSymbol
class IrConstructorSymbolImpl(descriptor: ClassConstructorDescriptor) :
IrBindableSymbolBase(descriptor),
IrConstructorSymbol
class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) :
IrBindableSymbolBase(descriptor),
IrReturnableBlockSymbol
class IrPropertySymbolImpl(descriptor: PropertyDescriptor) :
IrBindableSymbolBase(descriptor),
IrPropertySymbol
class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors) :
IrBindableSymbolBase(descriptor),
IrLocalDelegatedPropertySymbol
class IrTypeAliasSymbolImpl(descriptor: TypeAliasDescriptor) :
IrBindableSymbolBase(descriptor),
IrTypeAliasSymbol
class IrScriptSymbolImpl(descriptor: ScriptDescriptor) :
IrScriptSymbol, IrBindableSymbolBase(descriptor)