diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 6101c084f98..12168848761 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -35,7 +35,6 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; -import org.jetbrains.kotlin.load.kotlin.PackageClassUtils; import org.jetbrains.kotlin.psi.JetElement; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -357,14 +356,10 @@ public class ClosureCodegen extends MemberCodegen { value.put(K_CLASS_TYPE, iv); } else if (container instanceof PackageFragmentDescriptor) { - String packageClassInternalName = PackageClassUtils.getPackageClassInternalName( - ((PackageFragmentDescriptor) container).getFqName() - ); - iv.aconst(Type.getObjectType(packageClassInternalName)); + iv.aconst(state.getTypeMapper().mapOwner(descriptor)); iv.aconst(state.getModuleName()); - // TODO: create KPackage with a useful class, not the old package facade - iv.invokestatic(REFLECTION, "createKotlinPackage", - Type.getMethodDescriptor(K_PACKAGE_TYPE, getType(Class.class), getType(String.class)), false); + iv.invokestatic(REFLECTION, "getOrCreateKotlinPackage", + Type.getMethodDescriptor(K_DECLARATION_CONTAINER_TYPE, getType(Class.class), getType(String.class)), false); } else if (container instanceof ScriptDescriptor) { // TODO: correct container for scripts (KScript?) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java index ea288900c2c..5d44c787686 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/AsmTypes.java @@ -43,7 +43,6 @@ public class AsmTypes { public static final Type K_CLASS_TYPE = reflect("KClass"); public static final Type K_CLASS_ARRAY_TYPE = Type.getObjectType("[" + K_CLASS_TYPE.getDescriptor()); - public static final Type K_PACKAGE_TYPE = reflect("KPackage"); public static final Type K_DECLARATION_CONTAINER_TYPE = reflect("KDeclarationContainer"); public static final Type K_FUNCTION = reflect("KFunction"); diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/extensionProperty.kt b/compiler/testData/codegen/boxWithStdlib/reflection/mapping/extensionProperty.kt index 9d470a193d0..ae4d00a1c69 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/extensionProperty.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/mapping/extensionProperty.kt @@ -15,8 +15,8 @@ fun box(): String { val getter = p.javaGetter!! val setter = p.javaSetter!! - assertEquals(getter, Class.forName("_DefaultPackage").getMethod("getExt", javaClass())) - assertEquals(setter, Class.forName("_DefaultPackage").getMethod("setExt", javaClass(), javaClass())) + assertEquals(getter, Class.forName("ExtensionPropertyKt").getMethod("getExt", javaClass())) + assertEquals(setter, Class.forName("ExtensionPropertyKt").getMethod("setExt", javaClass(), javaClass())) val k = K(42L) assert(getter.invoke(null, k) == 42.0, "Fail k getter") diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/package.kt b/compiler/testData/codegen/boxWithStdlib/reflection/mapping/package.kt deleted file mode 100644 index e2236c6769a..00000000000 --- a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/package.kt +++ /dev/null @@ -1,13 +0,0 @@ -package test - -import kotlin.reflect.jvm.* -import kotlin.test.* - -fun box(): String { - val facadeJClass = Class.forName("test.TestPackage") as Class - - assertEquals(facadeJClass, facadeJClass.kotlinPackage!!.javaFacade) - assertEquals(facadeJClass, facadeJClass.kotlin.java) - - return "OK" -} diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/topLevelProperty.kt b/compiler/testData/codegen/boxWithStdlib/reflection/mapping/topLevelProperty.kt index c19e93dba90..2925f3ead89 100644 --- a/compiler/testData/codegen/boxWithStdlib/reflection/mapping/topLevelProperty.kt +++ b/compiler/testData/codegen/boxWithStdlib/reflection/mapping/topLevelProperty.kt @@ -14,8 +14,8 @@ fun box(): String { val getter = p.javaGetter!! val setter = p.javaSetter!! - assertEquals(getter, Class.forName("_DefaultPackage").getMethod("getTopLevel")) - assertEquals(setter, Class.forName("_DefaultPackage").getMethod("setTopLevel", javaClass())) + assertEquals(getter, Class.forName("TopLevelPropertyKt").getMethod("getTopLevel")) + assertEquals(setter, Class.forName("TopLevelPropertyKt").getMethod("setTopLevel", javaClass())) assert(getter.invoke(null) == "123", "Fail k getter") setter.invoke(null, "456") diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/defaultPackageToString.kt b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/defaultPackageToString.kt deleted file mode 100644 index cc711bc7d8d..00000000000 --- a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/defaultPackageToString.kt +++ /dev/null @@ -1,8 +0,0 @@ -import kotlin.test.* -import kotlin.reflect.jvm.kotlinPackage - -fun box(): String { - val p = Class.forName("_DefaultPackage").kotlinPackage - if ("$p" != "package ") return "Fail: $p" - return "OK" -} diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/packageToString.kt b/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/packageToString.kt deleted file mode 100644 index 0f60b75b211..00000000000 --- a/compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/packageToString.kt +++ /dev/null @@ -1,10 +0,0 @@ -package test.foo.bar - -import kotlin.test.* -import kotlin.reflect.jvm.kotlinPackage - -fun box(): String { - val p = Class.forName("test.foo.bar.BarPackage").kotlinPackage - if ("$p" != "package test.foo.bar") return "Fail: $p" - return "OK" -} diff --git a/compiler/testData/codegen/boxWithStdlib/reflection/packages/simpleGetMembers.kt b/compiler/testData/codegen/boxWithStdlib/reflection/packages/simpleGetMembers.kt deleted file mode 100644 index a71ad49e403..00000000000 --- a/compiler/testData/codegen/boxWithStdlib/reflection/packages/simpleGetMembers.kt +++ /dev/null @@ -1,23 +0,0 @@ -import kotlin.reflect.* -import kotlin.reflect.jvm.* -import kotlin.test.assertEquals - -fun foo() {} -fun Int.bar() {} -val baz = 42 -val Int.quux: Int get() = this - -fun box(): String { - fun check(actual: Collection>, expected: Set) { - assertEquals(expected, actual.map { it.name }.toSet()) - } - - val kp = Class.forName("_DefaultPackage").kotlinPackage ?: return "Fail: package class not found" - - check(kp.members, setOf("bar", "baz", "foo", "box", "quux")) - check(kp.functions, setOf("bar", "foo", "box")) - check(kp.properties, setOf("baz")) - check(kp.extensionProperties, setOf("quux")) - - return "OK" -} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 220c14c798c..7a878d4372e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -3678,12 +3678,6 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } - @TestMetadata("package.kt") - public void testPackage() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/package.kt"); - doTestWithStdlib(fileName); - } - @TestMetadata("propertyAccessors.kt") public void testPropertyAccessors() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/mapping/propertyAccessors.kt"); @@ -3801,12 +3795,6 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } - @TestMetadata("defaultPackageToString.kt") - public void testDefaultPackageToString() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/defaultPackageToString.kt"); - doTestWithStdlib(fileName); - } - @TestMetadata("extensionPropertyReceiverToString.kt") public void testExtensionPropertyReceiverToString() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/extensionPropertyReceiverToString.kt"); @@ -3831,12 +3819,6 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } - @TestMetadata("packageToString.kt") - public void testPackageToString() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/packageToString.kt"); - doTestWithStdlib(fileName); - } - @TestMetadata("parametersEqualsHashCode.kt") public void testParametersEqualsHashCode() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/methodsFromAny/parametersEqualsHashCode.kt"); @@ -3919,21 +3901,6 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode } } - @TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/packages") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Packages extends AbstractBlackBoxCodegenTest { - public void testAllFilesPresentInPackages() throws Exception { - JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/packages"), Pattern.compile("^(.+)\\.kt$"), true); - } - - @TestMetadata("simpleGetMembers.kt") - public void testSimpleGetMembers() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/packages/simpleGetMembers.kt"); - doTestWithStdlib(fileName); - } - } - @TestMetadata("compiler/testData/codegen/boxWithStdlib/reflection/parameters") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/builtins/src/kotlin/reflect/KPackage.kt b/core/builtins/src/kotlin/reflect/KPackage.kt index a2788d14ac9..0bc292c8f71 100644 --- a/core/builtins/src/kotlin/reflect/KPackage.kt +++ b/core/builtins/src/kotlin/reflect/KPackage.kt @@ -19,4 +19,6 @@ package kotlin.reflect /** * Represents a package and provides introspection capabilities. */ +@Deprecated("This class will be deleted soon because reflection on packages is going to be redesigned " + + "after the introduction of new kinds of runtime representations of packages on JVM.") public interface KPackage : KDeclarationContainer diff --git a/core/reflection.jvm/src/kotlin/reflect/KPackageExtensions.kt b/core/reflection.jvm/src/kotlin/reflect/KPackageExtensions.kt deleted file mode 100644 index b93b0efb33e..00000000000 --- a/core/reflection.jvm/src/kotlin/reflect/KPackageExtensions.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package kotlin.reflect - -import kotlin.reflect.jvm.internal.KPackageImpl - -/** - * Returns all non-extension properties declared in this package. - */ -public val KPackage.properties: Collection> - get() = (this as KPackageImpl) - .getMembers(scope, declaredOnly = false, nonExtensions = true, extensions = false) - .filterIsInstance>() - .toList() - -/** - * Returns all extension properties declared in this package. - */ -public val KPackage.extensionProperties: Collection> - get() = (this as KPackageImpl) - .getMembers(scope, declaredOnly = false, nonExtensions = false, extensions = true) - .filterIsInstance>() - .toList() diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionFactoryImpl.java b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionFactoryImpl.java index 3fd875cea75..20d1d2dce7d 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionFactoryImpl.java +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/ReflectionFactoryImpl.java @@ -18,7 +18,6 @@ package kotlin.reflect.jvm.internal; import kotlin.jvm.internal.*; import kotlin.reflect.*; -import org.jetbrains.kotlin.load.java.JvmAbi; /** * @suppress @@ -31,12 +30,7 @@ public class ReflectionFactoryImpl extends ReflectionFactory { } @Override - public KPackage createKotlinPackage(Class javaClass) { - return createKotlinPackage(javaClass, JvmAbi.DEFAULT_MODULE_NAME); - } - - @Override - public KPackage createKotlinPackage(Class javaClass, String moduleName) { + public KDeclarationContainer getOrCreateKotlinPackage(Class javaClass, String moduleName) { return new KPackageImpl(javaClass, moduleName); } @@ -92,4 +86,9 @@ public class ReflectionFactoryImpl extends ReflectionFactory { public KClass foreignKotlinClass(Class javaClass) { return getOrCreateKotlinClass(javaClass); } + + @Override + public KPackage createKotlinPackage(Class javaClass, String moduleName) { + return new KPackageImpl(javaClass, moduleName); + } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt index 3d3f16598e3..41799f59f5b 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt @@ -19,24 +19,15 @@ package kotlin.reflect.jvm import org.jetbrains.kotlin.load.java.JvmAbi import java.lang.reflect.* import java.util.* +import kotlin.jvm.internal.KotlinFileFacade +import kotlin.jvm.internal.Reflection import kotlin.reflect.* import kotlin.reflect.jvm.internal.KCallableImpl -import kotlin.reflect.jvm.internal.KPackageImpl import kotlin.reflect.jvm.internal.KPropertyImpl import kotlin.reflect.jvm.internal.KTypeImpl // Kotlin reflection -> Java reflection -/** - * Returns a Java [Class] instance that represents a Kotlin package. - * The methods and fields of this class are generated from top level functions and properties in the Kotlin package. - * See the [Kotlin language documentation](http://kotlinlang.org/docs/reference/java-interop.html#package-level-functions) - * for more information. - */ -public val KPackage.javaFacade: Class<*> - get() = (this as KPackageImpl).jClass - - /** * Returns a Java [Field] instance corresponding to the backing field of the given property, * or `null` if the property has no backing field. @@ -87,31 +78,6 @@ public val KType.javaType: Type // Java reflection -> Kotlin reflection -/** - * Returns a [KPackage] instance corresponding to the Java [Class] instance. - * The given class is generated from top level functions and properties in the Kotlin package. - * See the [Kotlin language documentation](http://kotlinlang.org/docs/reference/java-interop.html#package-level-functions) - * for more information. - */ -@Deprecated("After dropping old package facades it would be impossible to retrieve package by java class") -public val Class<*>.kotlinPackage: KPackage? - get() = if (getSimpleName().endsWith("Package") && - getAnnotation(javaClass()) != null) { - try { - val field = this.getField(JvmAbi.MODULE_NAME_FIELD) - if (field != null) { - KPackageImpl(this, field.get(null) as String) - } - else { - null - } - } - catch(e: NoSuchFieldException) { - null - } - } else null - - /** * Returns a [KProperty] instance corresponding to the given Java [Field] instance, * or `null` if this field cannot be represented by a Kotlin property @@ -137,10 +103,7 @@ public val Method.kotlinFunction: KFunction<*>? if (isSynthetic) return null if (Modifier.isStatic(modifiers)) { - val kotlinPackage = declaringClass.kotlinPackage - if (kotlinPackage != null) { - return kotlinPackage.functions.firstOrNull { it.javaMethod == this } - } + // TODO: support file facades & multifile classes // For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter val companion = declaringClass.kotlin.companionObject diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/Reflection.java b/core/runtime.jvm/src/kotlin/jvm/internal/Reflection.java index d5c09b82b54..f15e74e6f1c 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/Reflection.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/Reflection.java @@ -45,12 +45,8 @@ public class Reflection { return factory.createKotlinClass(javaClass); } - public static KPackage createKotlinPackage(Class javaClass) { - return factory.createKotlinPackage(javaClass); - } - - public static KPackage createKotlinPackage(Class javaClass, String moduleName) { - return factory.createKotlinPackage(javaClass, moduleName); + public static KDeclarationContainer getOrCreateKotlinPackage(Class javaClass, String moduleName) { + return factory.getOrCreateKotlinPackage(javaClass, moduleName); } public static KClass getOrCreateKotlinClass(Class javaClass) { @@ -101,6 +97,11 @@ public class Reflection { // Deprecated + @Deprecated + public static KPackage createKotlinPackage(Class javaClass, String moduleName) { + return (KPackage) factory.getOrCreateKotlinPackage(javaClass, moduleName); + } + @Deprecated public static KClass foreignKotlinClass(Class javaClass) { return getOrCreateKotlinClass(javaClass); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/ReflectionFactory.java b/core/runtime.jvm/src/kotlin/jvm/internal/ReflectionFactory.java index 2eb48eefc66..37b1d939880 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/ReflectionFactory.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/ReflectionFactory.java @@ -23,11 +23,7 @@ public class ReflectionFactory { return new ClassReference(javaClass); } - public KPackage createKotlinPackage(Class javaClass) { - return null; - } - - public KPackage createKotlinPackage(Class javaClass, String moduleName) { + public KDeclarationContainer getOrCreateKotlinPackage(Class javaClass, String moduleName) { return null; } @@ -73,4 +69,9 @@ public class ReflectionFactory { public KClass foreignKotlinClass(Class javaClass) { return new ClassReference(javaClass); } + + @Deprecated + public KPackage createKotlinPackage(Class javaClass, String moduleName) { + return null; + } }