From 371051b1d692051442f302a0cae4cfa3f502b8b6 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 20 Feb 2016 17:19:39 +0300 Subject: [PATCH] Filter out package members from other facades in KPackageImpl #KT-10690 Fixed --- .../testData/codegen/boxMultiFile/kt10690.kt | 24 +++++++++++++++++++ ...BlackBoxMultiFileCodegenTestGenerated.java | 6 +++++ .../kotlin/load/kotlin/ModuleMapping.kt | 10 ++++---- .../jvm/internal/KDeclarationContainerImpl.kt | 11 ++++----- .../reflect/jvm/internal/KPackageImpl.kt | 12 +++++++++- 5 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/codegen/boxMultiFile/kt10690.kt diff --git a/compiler/testData/codegen/boxMultiFile/kt10690.kt b/compiler/testData/codegen/boxMultiFile/kt10690.kt new file mode 100644 index 00000000000..db63d4306de --- /dev/null +++ b/compiler/testData/codegen/boxMultiFile/kt10690.kt @@ -0,0 +1,24 @@ +// WITH_REFLECT +// FILE: test.kt + +fun test2() { +} + +// FILE: main.kt + +import kotlin.reflect.jvm.javaMethod +import kotlin.reflect.jvm.kotlinFunction + +fun box(): String { + if (::box.javaMethod?.kotlinFunction == null) + return "Fail box" + if (::test1.javaMethod?.kotlinFunction == null) + return "Fail test1" + if (::test2.javaMethod?.kotlinFunction == null) + return "Fail test2" + + return "OK" +} + +fun test1() { +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxMultiFileCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxMultiFileCodegenTestGenerated.java index 121196b2f8d..53b01ebfb9a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxMultiFileCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxMultiFileCodegenTestGenerated.java @@ -83,6 +83,12 @@ public class BlackBoxMultiFileCodegenTestGenerated extends AbstractBlackBoxCodeg doTest(fileName); } + @TestMetadata("kt10690.kt") + public void testKt10690() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultiFile/kt10690.kt"); + doTest(fileName); + } + @TestMetadata("kt1515.kt") public void testKt1515() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultiFile/kt1515.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt index 1a1cb781980..c3cfc99a739 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/ModuleMapping.kt @@ -65,7 +65,6 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map() override fun equals(other: Any?) = @@ -74,15 +73,18 @@ class PackageParts(val packageFqName: String) { override fun hashCode() = packageFqName.hashCode() * 31 + parts.hashCode() + override fun toString() = + parts.toString() + companion object { - @JvmStatic fun PackageParts.serialize(builder: JvmPackageTable.PackageTable.Builder) { + @JvmStatic + fun PackageParts.serialize(builder: JvmPackageTable.PackageTable.Builder) { if (this.parts.isNotEmpty()) { val packageParts = JvmPackageTable.PackageParts.newBuilder() - packageParts.setPackageFqName(this.packageFqName) + packageParts.packageFqName = this.packageFqName packageParts.addAllClassName(this.parts.sorted()) builder.addPackageParts(packageParts) } } } } - diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt index 85ee47a6b40..7c940bc7374 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope import java.lang.reflect.Constructor import java.lang.reflect.Method import kotlin.jvm.internal.ClassBasedDeclarationContainer -import kotlin.reflect.KCallable import kotlin.reflect.KotlinReflectionInternalError internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContainer { @@ -45,8 +44,8 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain abstract fun getFunctions(name: Name): Collection - fun getMembers(scope: MemberScope, declaredOnly: Boolean, nonExtensions: Boolean, extensions: Boolean): Sequence> { - val visitor = object : DeclarationDescriptorVisitorEmptyBodies?, Unit>() { + fun getMembers(scope: MemberScope, declaredOnly: Boolean, nonExtensions: Boolean, extensions: Boolean): Sequence> { + val visitor = object : DeclarationDescriptorVisitorEmptyBodies?, Unit>() { private fun skipCallable(descriptor: CallableMemberDescriptor): Boolean { if (declaredOnly && !descriptor.kind.isReal) return true @@ -57,15 +56,15 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain return false } - override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit): KCallable<*>? { + override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit): KCallableImpl<*>? { return if (skipCallable(descriptor)) null else createProperty(descriptor) } - override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit): KCallable<*>? { + override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit): KCallableImpl<*>? { return if (skipCallable(descriptor)) null else KFunctionImpl(this@KDeclarationContainerImpl, descriptor) } - override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit): KCallable<*>? { + override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit): KCallableImpl<*>? { throw IllegalStateException("No constructors should appear in this scope: $descriptor") } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt index 697fb5021b4..32e16e4e691 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -18,11 +18,16 @@ package kotlin.reflect.jvm.internal import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment import org.jetbrains.kotlin.load.java.structure.reflect.classId +import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryPackageSourceElement +import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import kotlin.reflect.KCallable internal class KPackageImpl(override val jClass: Class<*>, val moduleName: String) : KDeclarationContainerImpl() { @@ -36,7 +41,12 @@ internal class KPackageImpl(override val jClass: Class<*>, val moduleName: Strin internal val scope: MemberScope get() = descriptor().memberScope override val members: Collection> - get() = getMembers(scope, declaredOnly = false, nonExtensions = true, extensions = true).toList() + get() = getMembers(scope, declaredOnly = false, nonExtensions = true, extensions = true).filter { member -> + val callableDescriptor = member.descriptor as DeserializedCallableMemberDescriptor + val packageFragment = callableDescriptor.containingDeclaration as PackageFragmentDescriptor + val source = (packageFragment as? LazyJavaPackageFragment)?.source as? KotlinJvmBinaryPackageSourceElement + (source?.getContainingBinaryClass(callableDescriptor) as? ReflectKotlinClass)?.klass == jClass + }.toList() override val constructorDescriptors: Collection get() = emptyList()