diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index c5c24aabed0..1d029742820 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -248,7 +248,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override protected void generateKotlinMetadataAnnotation() { - generateKotlinClassMetadataAnnotation(descriptor); + generateKotlinClassMetadataAnnotation(descriptor, false); } private void writeEnclosingMethod() { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 44279b8e52e..50e68cc7082 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.fileClasses.FileClasses; import org.jetbrains.kotlin.fileClasses.JvmFileClassesProvider; import org.jetbrains.kotlin.load.java.JavaVisibilities; import org.jetbrains.kotlin.load.java.JvmAbi; +import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.SpecialNames; @@ -86,12 +87,12 @@ public abstract class MemberCodegen parentCodegen; private final ReifiedTypeParametersUsages reifiedTypeParametersUsages = new ReifiedTypeParametersUsages(); private final Collection innerClasses = new LinkedHashSet(); - protected ExpressionCodegen clInit; + private ExpressionCodegen clInit; private NameGenerator inlineNameGenerator; private DefaultSourceMapper sourceMapper; @@ -439,7 +440,7 @@ public abstract class MemberCodegen"), SYNTHESIZED, KotlinSourceElementKt.toSourceElement(element)); clInit.initialize(null, null, Collections.emptyList(), @@ -698,7 +699,7 @@ public abstract class MemberCodegen() { + int flags = isScript ? JvmAnnotationNames.METADATA_SCRIPT_FLAG : 0; + + WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, flags, new Function1() { @Override public Unit invoke(AnnotationVisitor av) { writeAnnotationData(av, serializer, classProto); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java index 780cad3a614..efd571b54b4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java @@ -22,7 +22,10 @@ import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.context.ScriptContext; import org.jetbrains.kotlin.codegen.state.GenerationState; -import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.ClassDescriptor; +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; +import org.jetbrains.kotlin.descriptors.ScriptDescriptor; +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; @@ -33,7 +36,6 @@ import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; -import java.util.Collection; import java.util.Collections; import java.util.List; @@ -110,8 +112,7 @@ public class ScriptCodegen extends MemberCodegen { @Override protected void generateKotlinMetadataAnnotation() { - // TODO: copypaste from ImplementationBodyCodegen, so the script is seen as a KClass by reflection; implement separate kind with proper API - generateKotlinClassMetadataAnnotation(scriptDescriptor); + generateKotlinClassMetadataAnnotation(scriptDescriptor, true); } private void genConstructor( 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 6b98fd33b0b..480b3b91ccb 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 @@ -36,6 +36,7 @@ public final class JvmAnnotationNames { public static final int METADATA_MULTIFILE_PARTS_INHERIT_FLAG = 1 << 0; public static final int METADATA_PRE_RELEASE_FLAG = 1 << 1; + public static final int METADATA_SCRIPT_FLAG = 1 << 2; public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt index 879c737a502..527889865a7 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt @@ -71,5 +71,8 @@ class KotlinClassHeader( val isPreRelease: Boolean get() = (extraInt and JvmAnnotationNames.METADATA_PRE_RELEASE_FLAG) != 0 + val isScript: Boolean + get() = (extraInt and JvmAnnotationNames.METADATA_SCRIPT_FLAG) != 0 + override fun toString() = "$kind version=$metadataVersion" } diff --git a/core/runtime.jvm/src/kotlin/Metadata.kt b/core/runtime.jvm/src/kotlin/Metadata.kt index d36ff113ce8..73fe493867a 100644 --- a/core/runtime.jvm/src/kotlin/Metadata.kt +++ b/core/runtime.jvm/src/kotlin/Metadata.kt @@ -61,6 +61,7 @@ internal annotation class Metadata( * * 0 - this is a multi-file class facade or part, compiled with `-Xmultifile-parts-inherit`. * 1 - this class file is compiled by a pre-release version of Kotlin and is not visible to release versions. + * 2 - this class file is a compiled Kotlin script source file (.kts). */ val xi: Int = 0 )