Preliminary implementation of parts & facade in FIR-based compiler

This commit is contained in:
Mikhail Glukhikh
2019-05-16 12:58:38 +03:00
parent 2bf80ff64e
commit f3960c9482
10 changed files with 89 additions and 23 deletions
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral
import org.jetbrains.kotlin.types.expressions.LabelResolver
@@ -554,7 +554,7 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
val owner = state.typeMapper.mapImplementationOwner(functionDescriptor)
val methodId = MethodId(owner.internalName, asmMethod)
val directMember = getDirectMemberAndCallableFromObject(functionDescriptor)
if (!isBuiltInArrayIntrinsic(functionDescriptor) && directMember !is DeserializedCallableMemberDescriptor) {
if (!isBuiltInArrayIntrinsic(functionDescriptor) && directMember !is DescriptorWithContainerSource) {
return sourceCompilerForInline.doCreateMethodNodeFromSource(functionDescriptor, jvmSignature, callDefault, asmMethod)
}
@@ -608,16 +608,16 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
return SMAPAndMethodNode(body, SMAP(listOf(FileMapping.SKIP)))
}
assert(callableDescriptor is DeserializedCallableMemberDescriptor) { "Not a deserialized function or proper: " + callableDescriptor }
assert(callableDescriptor is DescriptorWithContainerSource) { "Not a deserialized function or proper: $callableDescriptor" }
val containingClasses =
KotlinTypeMapper.getContainingClassesForDeserializedCallable(callableDescriptor as DeserializedCallableMemberDescriptor)
KotlinTypeMapper.getContainingClassesForDeserializedCallable(callableDescriptor as DescriptorWithContainerSource)
val containerId = containingClasses.implClassId
val bytes = state.inlineCache.classBytes.getOrPut(containerId) {
findVirtualFile(state, containerId)?.contentsToByteArray()
?: throw IllegalStateException("Couldn't find declaration file for " + containerId)
?: throw IllegalStateException("Couldn't find declaration file for $containerId")
}
val methodNode =
@@ -66,6 +66,7 @@ import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmDefaultAnnotation
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.*
@@ -1291,7 +1292,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
val directMember = DescriptorUtils.getDirectMember(descriptor)
if (directMember is DeserializedCallableMemberDescriptor) {
if (directMember is DescriptorWithContainerSource) {
val facadeFqName = getPackageMemberOwnerInternalName(directMember, publicFacade)
if (facadeFqName != null) return facadeFqName
}
@@ -1319,7 +1320,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
descriptor is PropertyDescriptor && !descriptor.isConst
fun getContainingClassesForDeserializedCallable(
deserializedDescriptor: DeserializedCallableMemberDescriptor
deserializedDescriptor: DescriptorWithContainerSource
): ContainingClassesInfo {
val parentDeclaration = deserializedDescriptor.containingDeclaration
@@ -1351,7 +1352,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
return classId
}
private fun getPackageMemberOwnerInternalName(descriptor: DeserializedCallableMemberDescriptor, publicFacade: Boolean): String? {
private fun getPackageMemberOwnerInternalName(descriptor: DescriptorWithContainerSource, publicFacade: Boolean): String? {
val containingDeclaration = descriptor.containingDeclaration
assert(containingDeclaration is PackageFragmentDescriptor) { "Not a top-level member: $descriptor" }
@@ -1366,7 +1367,7 @@ class KotlinTypeMapper @JvmOverloads constructor(
private val FAKE_CLASS_ID_FOR_BUILTINS = ClassId.topLevel(FqName("kotlin.KotlinPackage"))
private fun getPackageMemberContainingClassesInfo(descriptor: DeserializedCallableMemberDescriptor): ContainingClassesInfo? {
private fun getPackageMemberContainingClassesInfo(descriptor: DescriptorWithContainerSource): ContainingClassesInfo? {
val containingDeclaration = descriptor.containingDeclaration
if (containingDeclaration is BuiltInsPackageFragment) {
return ContainingClassesInfo(FAKE_CLASS_ID_FOR_BUILTINS, FAKE_CLASS_ID_FOR_BUILTINS)
@@ -1377,6 +1378,8 @@ class KotlinTypeMapper @JvmOverloads constructor(
val facadeName = when (containingDeclaration) {
is LazyJavaPackageFragment -> containingDeclaration.getFacadeNameForPartName(implClassName) ?: return null
is IncrementalMultifileClassPackageFragment -> containingDeclaration.facadeName
// TODO: for multi-file class part, they can be different
is PackageFragmentDescriptor -> implClassName
else -> throw AssertionError(
"Unexpected package fragment for $descriptor: $containingDeclaration (${containingDeclaration.javaClass.simpleName})"
)