JVM IR: generate facade class for property accessors from dependencies

This commit is contained in:
Alexander Udalov
2019-07-24 17:32:01 +02:00
parent 28e2fd63ca
commit babbbd0ff6
3 changed files with 9 additions and 6 deletions
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.declarations.IrFunction
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.IrFunctionSymbol
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 =
symbol is IrSimpleFunctionSymbol && symbol.owner.let { function ->
function.name.asString() == "<get-isInitialized>" &&
function.parent is IrPackageFragment &&
function.isTopLevel &&
function.getPackageFragment()!!.fqName.asString() == "kotlin" &&
function.valueParameters.isEmpty() &&
symbol.owner.extensionReceiverParameter?.type?.classOrNull?.owner.let { receiverClass ->
@@ -350,8 +350,11 @@ val IrFunction.isStatic: Boolean
get() = parent is IrClass && dispatchReceiverParameter == null
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(
irExpression: IrExpression,
@@ -67,8 +67,9 @@ class DeclarationStubGenerator(
}
fun generateOrGetFacadeClass(descriptor: DeclarationDescriptor): IrClass? {
val packageFragment = descriptor.containingDeclaration as? PackageFragmentDescriptor ?: return null
val containerSource = descriptor.safeAs<DescriptorWithContainerSource>()?.containerSource ?: return null
val directMember = descriptor.safeAs<PropertyAccessorDescriptor>()?.correspondingProperty ?: descriptor
val packageFragment = directMember.containingDeclaration as? PackageFragmentDescriptor ?: return null
val containerSource = directMember.safeAs<DescriptorWithContainerSource>()?.containerSource ?: return null
return facadeClassMap.getOrPut(containerSource) {
facadeClassGenerator(containerSource)?.also { facade ->
val packageStub = generateOrGetEmptyExternalPackageFragmentStub(packageFragment)