From 838433ba8af27be4e83e0dd31b96c9cbe25ca08a Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 11 Sep 2015 10:08:01 +0300 Subject: [PATCH] - call multifile class members (compiling against binaries) - inline multifile class members HACK? scope-based part/facade resolution --- .../kotlin/codegen/state/JetTypeMapper.java | 12 ++++++++++++ .../lazy/descriptors/LazyJavaPackageScope.kt | 17 ++++++++++++----- .../resolve/scopes/AbstractScopeAdapter.kt | 6 ++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 4823b105716..ae94af3113d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -55,9 +55,11 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; +import org.jetbrains.kotlin.resolve.scopes.AbstractScopeAdapter; import org.jetbrains.kotlin.serialization.deserialization.DeserializedType; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor; +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.expressions.OperatorConventions; import org.jetbrains.org.objectweb.asm.Type; @@ -174,6 +176,9 @@ public class JetTypeMapper { if (containingDeclaration instanceof PackageFragmentDescriptor) { PackageFragmentDescriptor packageFragmentDescriptor = (PackageFragmentDescriptor) containingDeclaration; JetScope scope = packageFragmentDescriptor.getMemberScope(); + if (scope instanceof AbstractScopeAdapter) { + scope = ((AbstractScopeAdapter) scope).getActualScope(); + } if (scope instanceof LazyJavaPackageScope) { String facadeShortName = ((LazyJavaPackageScope) scope).getFacadeSimpleNameForPartSimpleName(implClassName.asString()); if (facadeShortName != null) { @@ -181,6 +186,13 @@ public class JetTypeMapper { return internalNameByFqNameWithoutInnerClasses(facadeFqName); } } + else if (scope instanceof DeserializedPackageMemberScope) { + FqName implClassFqName = packageFragmentDescriptor.getFqName().child(implClassName); + return internalNameByFqNameWithoutInnerClasses(implClassFqName); + } + else { + throw new AssertionError("Unexpected member scope for deserialized callable: " + scope); + } } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt index 6c478a775d6..6e4ee9a4eb1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt @@ -61,12 +61,19 @@ public class LazyJavaPackageScope( private val partToFacade = c.storageManager.createLazyValue { val result = hashMapOf() - for (kotlinClass in kotlinBinaryClasses()) { + kotlinClasses@for (kotlinClass in kotlinBinaryClasses()) { val header = kotlinClass.classHeader - if (header.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { - val partName = kotlinClass.classId.shortClassName.asString() - val facadeName = header.multifileClassName ?: "" - result[partName] = facadeName + when (header.kind ) { + KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { + val partName = kotlinClass.classId.shortClassName.asString() + val facadeName = header.multifileClassName ?: continue@kotlinClasses + result[partName] = facadeName + } + KotlinClassHeader.Kind.FILE_FACADE -> { + val fileFacadeName = kotlinClass.classId.shortClassName.asString() + result[fileFacadeName] = fileFacadeName + } + else -> {} } } result diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt index a99a7aa78cb..c85c9dbd80c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt @@ -28,6 +28,12 @@ import org.jetbrains.kotlin.utils.Printer public abstract class AbstractScopeAdapter : JetScope { protected abstract val workerScope: JetScope + public fun getActualScope(): JetScope = + if (workerScope is AbstractScopeAdapter) + (workerScope as AbstractScopeAdapter).getActualScope() + else + workerScope + override fun getImplicitReceiversHierarchy(): List { return workerScope.getImplicitReceiversHierarchy() }