diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 267d1b4328b..63197d049a8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -836,9 +836,10 @@ public class AsmUtil { } } - public static void writeKotlinSyntheticClassAnnotation(@NotNull ClassBuilder v) { + public static void writeKotlinSyntheticClassAnnotation(@NotNull ClassBuilder v, @NotNull GenerationState state) { AnnotationVisitor av = v.newAnnotation(Type.getObjectType(KotlinSyntheticClass.CLASS_NAME.getInternalName()).getDescriptor(), true); JvmCodegenUtil.writeAbiVersion(av); + JvmCodegenUtil.writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 12168848761..8771a5f7d1e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -57,6 +57,7 @@ import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.*; import static org.jetbrains.kotlin.codegen.ExpressionCodegen.generateClassLiteralReference; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForAnonymousClass; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage.getBuiltIns; @@ -218,7 +219,7 @@ public class ClosureCodegen extends MemberCodegen { @Override protected void generateKotlinAnnotation() { - writeKotlinSyntheticClassAnnotation(v); + writeKotlinSyntheticClassAnnotation(v, state); DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(new JvmSerializerExtension(v.getSerializationBindings(), typeMapper)); @@ -227,6 +228,7 @@ public class ClosureCodegen extends MemberCodegen { AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CALLABLE), true); writeAnnotationData(av, serializer, functionProto); + writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 6dd3b0994c4..c8efe47ca2d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -264,6 +264,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true); writeAnnotationData(av, serializer, classProto); + writeModuleName(av, state); av.visitEnd(); } @@ -279,7 +280,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } - private static Map KOTLIN_MARKER_INTERFACES = new HashMap(); + private static final Map KOTLIN_MARKER_INTERFACES = new HashMap(); static { KOTLIN_MARKER_INTERFACES.put("kotlin.Iterator", "kotlin/jvm/internal/markers/KMappedMarker"); KOTLIN_MARKER_INTERFACES.put("kotlin.Iterable", "kotlin/jvm/internal/markers/KMappedMarker"); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt index 8722cfa1001..134f4696c74 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt @@ -148,6 +148,6 @@ public class InterfaceImplBodyCodegen( val av = v.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(KOTLIN_INTERFACE_DEFAULT_IMPLS), true) av.visit(JvmAnnotationNames.VERSION_FIELD_NAME, JvmAbi.VERSION.toArray()) av.visitEnd() - AsmUtil.writeKotlinSyntheticClassAnnotation(v) + AsmUtil.writeKotlinSyntheticClassAnnotation(v, state) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index f8bad33f402..76f5215e47c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.context.PackageContext; import org.jetbrains.kotlin.codegen.context.RootContext; +import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.load.java.JvmAbi; @@ -228,6 +229,13 @@ public class JvmCodegenUtil { av.visit(JvmAnnotationNames.OLD_ABI_VERSION_FIELD_NAME, JvmAbi.VERSION.getMinor()); } + public static void writeModuleName(@NotNull AnnotationVisitor av, @NotNull GenerationState state) { + String name = state.getModuleName(); + if (!name.equals(JvmAbi.DEFAULT_MODULE_NAME)) { + av.visit(JvmAnnotationNames.MODULE_NAME_FIELD_NAME, name); + } + } + @NotNull public static String sanitizeAsJavaIdentifier(@NotNull String str) { return PackagePartClassUtils.sanitizeAsJavaIdentifier(str); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index de38c5c577e..89ff642a4a1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -262,6 +262,7 @@ public class MultifileClassCodegen( val av = classBuilder.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_MULTIFILE_CLASS), true) JvmCodegenUtil.writeAbiVersion(av) + JvmCodegenUtil.writeModuleName(av, state) val partInternalNames = partFqNames.map { JvmClassName.byFqNameWithoutInnerClasses(it).internalName }.sorted() val arv = av.visitArray(JvmAnnotationNames.FILE_PART_CLASS_NAMES_FIELD_NAME) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index f19a5825484..5acbe52546d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -43,6 +43,7 @@ import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses; import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class PackagePartCodegen extends MemberCodegen { @@ -125,6 +126,7 @@ public class PackagePartCodegen extends MemberCodegen { AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FILE_FACADE), true); writeAnnotationData(av, serializer, packageProto); + writeModuleName(av, state); av.visitEnd(); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 0856a999151..e48d9731cb9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -196,7 +196,7 @@ public class PropertyReferenceCodegen( } override fun generateKotlinAnnotation() { - writeKotlinSyntheticClassAnnotation(v) + writeKotlinSyntheticClassAnnotation(v, state) } public fun putInstanceOnStack(): StackValue = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index 22c128d27e8..fd370416255 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -93,7 +93,7 @@ public class SamWrapperCodegen { ); cv.visitSource(file.getName(), null); - writeKotlinSyntheticClassAnnotation(cv); + writeKotlinSyntheticClassAnnotation(cv, state); // e.g. ASM type for Function2 Type functionAsmType = typeMapper.mapType(functionType); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java index ff25f5a9f33..e967e4c1d11 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java @@ -57,7 +57,7 @@ public class MappingClassesForWhenByEnumCodegen { generateFields(cb, mappings); generateInitialization(cb, mappings); - writeKotlinSyntheticClassAnnotation(cb); + writeKotlinSyntheticClassAnnotation(cb, state); cb.done(); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java index 6c8148f3b4e..1275a83ee83 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java @@ -50,6 +50,7 @@ public final class JvmAnnotationNames { public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName"; public static final String DATA_FIELD_NAME = "data"; public static final String STRINGS_FIELD_NAME = "strings"; + public static final String MODULE_NAME_FIELD_NAME = "moduleName"; public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); public static final Name DEPRECATED_ANNOTATION_MESSAGE = Name.identifier("message"); public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets"); 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 f4cc50a177a..d927d8b576f 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -29,11 +29,9 @@ import kotlin.reflect.KPackage internal class KPackageImpl(override val jClass: Class<*>, val moduleName: String) : KDeclarationContainerImpl(), KPackage { val descriptor by ReflectProperties.lazySoft { - val moduleData = jClass.getOrCreateModule() + val moduleData = moduleData moduleData.packageFacadeProvider.registerModule(moduleName) - val fqName = jClass.classId.getPackageFqName() - - moduleData.module.getPackage(fqName) + moduleData.module.getPackage(jClass.classId.packageFqName) } internal val scope: JetScope get() = descriptor.memberScope diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt index 41799f59f5b..45e0e2404b4 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/mapping.kt @@ -103,7 +103,13 @@ public val Method.kotlinFunction: KFunction<*>? if (isSynthetic) return null if (Modifier.isStatic(modifiers)) { - // TODO: support file facades & multifile classes + // TODO: support multifile classes + + val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java) + if (fileFacade != null) { + val kotlinPackage = Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName) + return kotlinPackage.functions.firstOrNull { it.javaMethod == this } + } // 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/KotlinCallable.java b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinCallable.java index 8355dcff95a..79ce604107f 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinCallable.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinCallable.java @@ -29,6 +29,8 @@ public @interface KotlinCallable { int[] version() default {}; + String moduleName() default "main"; + String[] data(); String[] strings(); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinClass.java b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinClass.java index e821e6e0b39..2e247fd95c4 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinClass.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinClass.java @@ -29,6 +29,8 @@ public @interface KotlinClass { int[] version() default {}; + String moduleName() default "main"; + String[] data(); String[] strings(); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinFileFacade.java b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinFileFacade.java index 7901f23e1c2..3ca22d71a21 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinFileFacade.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinFileFacade.java @@ -29,6 +29,8 @@ public @interface KotlinFileFacade { int[] version() default {}; + String moduleName() default "main"; + String[] data(); String[] strings(); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinMultifileClass.java b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinMultifileClass.java index bcdd6780804..ba38a615774 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinMultifileClass.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinMultifileClass.java @@ -29,6 +29,8 @@ public @interface KotlinMultifileClass { int[] version() default {}; + String moduleName() default "main"; + String[] filePartClassNames(); String[] strings(); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinSyntheticClass.java b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinSyntheticClass.java index 67dd552a46f..06c341ebc86 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/KotlinSyntheticClass.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/KotlinSyntheticClass.java @@ -28,4 +28,6 @@ public @interface KotlinSyntheticClass { int abiVersion(); int[] version() default {}; + + String moduleName() default "main"; }