JVM IR: generate facade class for property accessors from dependencies
This commit is contained in:
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
|||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
@@ -240,7 +239,7 @@ abstract class Symbols<out T : CommonBackendContext>(val context: T, private val
|
|||||||
fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean =
|
fun isLateinitIsInitializedPropertyGetter(symbol: IrFunctionSymbol): Boolean =
|
||||||
symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
|
symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
|
||||||
function.name.asString() == "<get-isInitialized>" &&
|
function.name.asString() == "<get-isInitialized>" &&
|
||||||
function.parent is IrPackageFragment &&
|
function.isTopLevel &&
|
||||||
function.getPackageFragment()!!.fqName.asString() == "kotlin" &&
|
function.getPackageFragment()!!.fqName.asString() == "kotlin" &&
|
||||||
function.valueParameters.isEmpty() &&
|
function.valueParameters.isEmpty() &&
|
||||||
symbol.owner.extensionReceiverParameter?.type?.classOrNull?.owner.let { receiverClass ->
|
symbol.owner.extensionReceiverParameter?.type?.classOrNull?.owner.let { receiverClass ->
|
||||||
|
|||||||
@@ -350,8 +350,11 @@ val IrFunction.isStatic: Boolean
|
|||||||
get() = parent is IrClass && dispatchReceiverParameter == null
|
get() = parent is IrClass && dispatchReceiverParameter == null
|
||||||
|
|
||||||
val IrDeclaration.isTopLevel: Boolean
|
val IrDeclaration.isTopLevel: Boolean
|
||||||
get() = parent is IrPackageFragment
|
get() {
|
||||||
|
if (parent is IrPackageFragment) return true
|
||||||
|
val parentClass = parent as? IrClass
|
||||||
|
return parentClass?.origin == IrDeclarationOrigin.FILE_CLASS && parentClass.parent is IrPackageFragment
|
||||||
|
}
|
||||||
|
|
||||||
fun Scope.createTemporaryVariableWithWrappedDescriptor(
|
fun Scope.createTemporaryVariableWithWrappedDescriptor(
|
||||||
irExpression: IrExpression,
|
irExpression: IrExpression,
|
||||||
|
|||||||
@@ -67,8 +67,9 @@ class DeclarationStubGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun generateOrGetFacadeClass(descriptor: DeclarationDescriptor): IrClass? {
|
fun generateOrGetFacadeClass(descriptor: DeclarationDescriptor): IrClass? {
|
||||||
val packageFragment = descriptor.containingDeclaration as? PackageFragmentDescriptor ?: return null
|
val directMember = descriptor.safeAs<PropertyAccessorDescriptor>()?.correspondingProperty ?: descriptor
|
||||||
val containerSource = descriptor.safeAs<DescriptorWithContainerSource>()?.containerSource ?: return null
|
val packageFragment = directMember.containingDeclaration as? PackageFragmentDescriptor ?: return null
|
||||||
|
val containerSource = directMember.safeAs<DescriptorWithContainerSource>()?.containerSource ?: return null
|
||||||
return facadeClassMap.getOrPut(containerSource) {
|
return facadeClassMap.getOrPut(containerSource) {
|
||||||
facadeClassGenerator(containerSource)?.also { facade ->
|
facadeClassGenerator(containerSource)?.also { facade ->
|
||||||
val packageStub = generateOrGetEmptyExternalPackageFragmentStub(packageFragment)
|
val packageStub = generateOrGetEmptyExternalPackageFragmentStub(packageFragment)
|
||||||
|
|||||||
Reference in New Issue
Block a user