diff --git a/build.xml b/build.xml index daf8f2c64a7..8296334b4f8 100644 --- a/build.xml +++ b/build.xml @@ -553,6 +553,7 @@ source="${java.target}" target="${java.target}"> + @@ -630,6 +631,7 @@ + @@ -654,6 +656,7 @@ source="${java.target}" target="${java.target}"> + @@ -756,6 +759,7 @@ + @@ -930,7 +934,7 @@ - + @@ -1025,6 +1029,7 @@ source="${java.target}" target="${java.target}"> + diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 2b8b6e03ba8..4cbcf71719a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -792,17 +792,19 @@ public class AsmUtil { public static void writeAnnotationData( @NotNull AnnotationVisitor av, @NotNull DescriptorSerializer serializer, - @NotNull MessageLite message + @NotNull MessageLite message, + boolean old ) { byte[] bytes = serializer.serialize(message); - JvmCodegenUtil.writeAbiVersion(av); - AnnotationVisitor data = av.visitArray(JvmAnnotationNames.DATA_FIELD_NAME); + AnnotationVisitor data = av.visitArray(old ? JvmAnnotationNames.DATA_FIELD_NAME : JvmAnnotationNames.METADATA_DATA_FIELD_NAME); for (String string : BitEncoding.encodeBytes(bytes)) { data.visit(null, string); } data.visitEnd(); - AnnotationVisitor strings = av.visitArray(JvmAnnotationNames.STRINGS_FIELD_NAME); + AnnotationVisitor strings = av.visitArray( + old ? JvmAnnotationNames.STRINGS_FIELD_NAME : JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME + ); for (String string : ((JvmStringTable) serializer.getStringTable()).getStrings()) { strings.visit(null, string); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index d6e159b4fd5..d567d548f02 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -18,8 +18,8 @@ package org.jetbrains.kotlin.codegen; import com.google.common.collect.Lists; import com.intellij.util.ArrayUtil; -import kotlin.collections.CollectionsKt; import kotlin.Unit; +import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,6 +35,7 @@ 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.header.KotlinClassHeader; import org.jetbrains.kotlin.psi.KtElement; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -58,8 +59,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.JvmCodegenUtil.*; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForAnonymousClass; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; @@ -221,15 +221,25 @@ public class ClosureCodegen extends MemberCodegen { protected void generateKotlinAnnotation() { writeKotlinSyntheticClassAnnotation(v, state); - DescriptorSerializer serializer = + final DescriptorSerializer serializer = DescriptorSerializer.createForLambda( new JvmSerializerExtension(v.getSerializationBindings(), typeMapper, state.getUseTypeTableInSerializer()) ); - ProtoBuf.Function functionProto = serializer.functionProto(funDescriptor).build(); + final ProtoBuf.Function functionProto = serializer.functionProto(funDescriptor).build(); + + WriteAnnotationUtilKt.writeKotlinMetadata(v, KotlinClassHeader.Kind.SYNTHETIC_CLASS, new Function1() { + @Override + public Unit invoke(AnnotationVisitor av) { + writeAnnotationData(av, serializer, functionProto, false); + av.visit(JvmAnnotationNames.SYNTHETIC_CLASS_KIND_FIELD_NAME, KotlinClassHeader.SyntheticClassKind.FUNCTION.getId()); + return Unit.INSTANCE; + } + }); AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FUNCTION), true); - writeAnnotationData(av, serializer, functionProto); + writeAbiVersion(av); + writeAnnotationData(av, serializer, functionProto, true); 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 65dcdd81071..8c9f9dd278e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -19,8 +19,8 @@ package org.jetbrains.kotlin.codegen; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; -import kotlin.collections.CollectionsKt; import kotlin.Unit; +import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function2; @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor; +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; @@ -250,15 +251,27 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_LOCAL_CLASS), true).visitEnd(); } - DescriptorSerializer serializer = + final DescriptorSerializer serializer = DescriptorSerializer.create(descriptor, new JvmSerializerExtension( v.getSerializationBindings(), typeMapper, state.getUseTypeTableInSerializer() )); - ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); + final ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); + + WriteAnnotationUtilKt.writeKotlinMetadata(v, KotlinClassHeader.Kind.CLASS, new Function1() { + @Override + public Unit invoke(AnnotationVisitor av) { + writeAnnotationData(av, serializer, classProto, false); + if (!isTopLevelOrInnerClass(descriptor)) { + av.visit(JvmAnnotationNames.SYNTHETIC_CLASS_KIND_FIELD_NAME, KotlinClassHeader.SyntheticClassKind.LOCAL_CLASS.getId()); + } + return Unit.INSTANCE; + } + }); AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true); - writeAnnotationData(av, serializer, classProto); + writeAbiVersion(av); + writeAnnotationData(av, serializer, classProto, true); writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt index 1ff8effb074..4fb3ec571e1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAnnotationNames.KOTLIN_INTERFACE_DEFAULT_IMPLS import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils @@ -152,6 +153,8 @@ class InterfaceImplBodyCodegen( v.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(KOTLIN_INTERFACE_DEFAULT_IMPLS), true).visitEnd() AsmUtil.writeKotlinSyntheticClassAnnotation(v, state) + + writeSyntheticClassMetadata(v, KotlinClassHeader.SyntheticClassKind.INTERFACE_DEFAULT_IMPLS); } override fun done() { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 4ddd4ac63c5..07b700ff7ae 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.kotlin.PackageParts +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus @@ -48,6 +49,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor +import org.jetbrains.org.objectweb.asm.AnnotationVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type @@ -271,17 +273,24 @@ class MultifileClassCodegen( if (state.classBuilderMode != ClassBuilderMode.FULL) return if (files.any { it.isScript }) return + val partInternalNames = partFqNames.map(AsmUtil::internalNameByFqNameWithoutInnerClasses).sorted() + + fun writePartNames(av: AnnotationVisitor, fieldName: String) { + val arv = av.visitArray(fieldName) + for (internalName in partInternalNames) { + arv.visit(null, internalName) + } + arv.visitEnd() + } + + writeKotlinMetadata(classBuilder, KotlinClassHeader.Kind.MULTIFILE_CLASS) { av -> + writePartNames(av, JvmAnnotationNames.METADATA_DATA_FIELD_NAME) + } + 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) - for (internalName in partInternalNames) { - arv.visit(null, internalName) - } - arv.visitEnd() - + writePartNames(av, JvmAnnotationNames.FILE_PART_CLASS_NAMES_FIELD_NAME) av.visitEnd() } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index d34aedb4e3f..45382359294 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.load.java.JvmAnnotationNames +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty @@ -90,8 +91,14 @@ class MultifileClassPartCodegen( ) val packageProto = serializer.packagePartProto(members).build() + writeKotlinMetadata(v, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { av -> + AsmUtil.writeAnnotationData(av, serializer, packageProto, false) + av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, multifileClassType.internalName) + } + val av = v.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_MULTIFILE_CLASS_PART), true) - AsmUtil.writeAnnotationData(av, serializer, packageProto) + JvmCodegenUtil.writeAbiVersion(av) + AsmUtil.writeAnnotationData(av, serializer, packageProto, true) av.visit(JvmAnnotationNames.MULTIFILE_CLASS_NAME_FIELD_NAME, multifileClassType.internalName) av.visitEnd() } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 6af5f124927..714fed99c23 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -17,7 +17,9 @@ package org.jetbrains.kotlin.codegen; import com.intellij.util.ArrayUtil; +import kotlin.Unit; import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.annotation.AnnotatedSimple; import org.jetbrains.kotlin.codegen.context.FieldOwnerContext; @@ -31,6 +33,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotated; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.serialization.DescriptorSerializer; @@ -43,6 +46,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.writeAbiVersion; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -121,13 +125,22 @@ public class PackagePartCodegen extends MemberCodegen { JvmSerializationBindings bindings = v.getSerializationBindings(); - DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(new JvmSerializerExtension( + final DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(new JvmSerializerExtension( bindings, state.getTypeMapper(), state.getUseTypeTableInSerializer() )); - ProtoBuf.Package packageProto = serializer.packagePartProto(members).build(); + final ProtoBuf.Package packageProto = serializer.packagePartProto(members).build(); + + WriteAnnotationUtilKt.writeKotlinMetadata(v, KotlinClassHeader.Kind.FILE_FACADE, new Function1() { + @Override + public Unit invoke(AnnotationVisitor av) { + writeAnnotationData(av, serializer, packageProto, false); + return Unit.INSTANCE; + } + }); AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FILE_FACADE), true); - writeAnnotationData(av, serializer, packageProto); + writeAbiVersion(av); + writeAnnotationData(av, serializer, packageProto, true); 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 7bf7a7fda03..86e750cafa6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -160,6 +160,8 @@ class PropertyReferenceCodegen( override fun generateKotlinAnnotation() { writeKotlinSyntheticClassAnnotation(v, state) + + writeSyntheticClassMetadata(v, null) } 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 ca728c51add..6285472d0d4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -96,6 +96,8 @@ public class SamWrapperCodegen { writeKotlinSyntheticClassAnnotation(cv, state); + WriteAnnotationUtilKt.writeSyntheticClassMetadata(cv, null); + // 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 5c52ce0470f..652b83aeaf0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen.when; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.ClassBuilder; +import org.jetbrains.kotlin.codegen.WriteAnnotationUtilKt; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.resolve.constants.EnumValue; @@ -59,6 +60,8 @@ public class MappingClassesForWhenByEnumCodegen { writeKotlinSyntheticClassAnnotation(cb, state); + WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, null); + cb.done(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/writeAnnotationUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/writeAnnotationUtil.kt new file mode 100644 index 00000000000..9d303e5b80e --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/writeAnnotationUtil.kt @@ -0,0 +1,40 @@ +/* + * 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 org.jetbrains.kotlin.codegen + +import org.jetbrains.kotlin.load.java.JvmAnnotationNames +import org.jetbrains.kotlin.load.java.JvmBytecodeBinaryVersion +import org.jetbrains.kotlin.load.kotlin.JvmMetadataVersion +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader +import org.jetbrains.org.objectweb.asm.AnnotationVisitor + +fun writeKotlinMetadata(cb: ClassBuilder, kind: KotlinClassHeader.Kind, action: (AnnotationVisitor) -> Unit) { + val av = cb.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.METADATA), true) + av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, JvmMetadataVersion.INSTANCE.toArray()) + av.visit(JvmAnnotationNames.BYTECODE_VERSION_FIELD_NAME, JvmBytecodeBinaryVersion.INSTANCE.toArray()) + av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id) + action(av) + av.visitEnd() +} + +fun writeSyntheticClassMetadata(cb: ClassBuilder, kind: KotlinClassHeader.SyntheticClassKind?) { + writeKotlinMetadata(cb, KotlinClassHeader.Kind.SYNTHETIC_CLASS) { av -> + if (kind != null) { + av.visit(JvmAnnotationNames.SYNTHETIC_CLASS_KIND_FIELD_NAME, kind.id) + } + } +} diff --git a/compiler/testData/codegen/bytecodeListing/annotations/JvmSynthetic.txt b/compiler/testData/codegen/bytecodeListing/annotations/JvmSynthetic.txt index b8f9f2fc9f1..d0d1f144e78 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/JvmSynthetic.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/JvmSynthetic.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class Example { private field prop2: int diff --git a/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt b/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt index 747f7992733..2c09977bbb6 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/defaultTargets.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class A { private final @AnnField @AnnParameterField @AnnTypeField field a: int @@ -12,45 +13,53 @@ public final class A { @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnFieldProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnParameterField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnParameterProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnProperty @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnTypeField @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class Anno +@kotlin.Metadata @kotlin.jvm.internal.KotlinFileFacade public final class DefaultTargetsKt { private final static @Anno field p2: int diff --git a/compiler/testData/codegen/bytecodeListing/annotations/literals.txt b/compiler/testData/codegen/bytecodeListing/annotations/literals.txt index 6d5d3013c5b..f9eef08db63 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/literals.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/literals.txt @@ -1,22 +1,26 @@ @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class ClsAnn @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class ExprAnn @kotlin.annotation.Target @java.lang.annotation.Retention @java.lang.annotation.Target +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class FunAnn @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata @kotlin.jvm.internal.KotlinFunction final class LiteralsKt$foo$1 { synthetic final field $arg: int @@ -27,6 +31,7 @@ final class LiteralsKt$foo$1 { } @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata @kotlin.jvm.internal.KotlinFunction final class LiteralsKt$foo$2 { synthetic final field $arg: int @@ -37,6 +42,7 @@ final class LiteralsKt$foo$2 { } @kotlin.jvm.internal.KotlinLocalClass +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class LiteralsKt$foo$3 { inner class LiteralsKt$foo$3 @@ -44,6 +50,7 @@ public final class LiteralsKt$foo$3 { } @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata @kotlin.jvm.internal.KotlinFunction final class LiteralsKt$foo$x$1 { synthetic final field $arg: int @@ -53,6 +60,7 @@ final class LiteralsKt$foo$x$1 { public synthetic method invoke(): java.lang.Object } +@kotlin.Metadata @kotlin.jvm.internal.KotlinFileFacade public final class LiteralsKt { inner class LiteralsKt$foo$1 @@ -63,6 +71,7 @@ public final class LiteralsKt { public final static @org.jetbrains.annotations.NotNull method foo(p0: int): My } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public class My { public method (): void diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt b/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt index 0ac9239740d..a9d1e5918ae 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onProperties.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class A { private synthetic final static field $$delegatedProperties: kotlin.reflect.KProperty[] @@ -19,33 +20,41 @@ public final class A { } @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnDelegate @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnField @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnGetter @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnParam @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnProp @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnProp2 @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class AnnSetter +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class CustomDelegate { public method (): void diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt index 5d9e098e173..407d7a270e1 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class A { public method (): void @@ -6,9 +7,11 @@ public final class A { } @java.lang.annotation.Retention +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class Ann +@kotlin.Metadata @kotlin.jvm.internal.KotlinFileFacade public final class OnReceiverKt { public final static @org.jetbrains.annotations.NotNull method getTopLevelP(@Ann p0: java.lang.String): java.lang.String diff --git a/compiler/testData/codegen/bytecodeListing/defaultImpls.txt b/compiler/testData/codegen/bytecodeListing/defaultImpls.txt index b1140e6a70f..7570e5efeb3 100644 --- a/compiler/testData/codegen/bytecodeListing/defaultImpls.txt +++ b/compiler/testData/codegen/bytecodeListing/defaultImpls.txt @@ -1,11 +1,14 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class B { public abstract method foo(): void } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class C { public abstract method getBar(): int @@ -13,23 +16,27 @@ public abstract class C { @kotlin.jvm.internal.KotlinInterfaceDefaultImpls @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata public final class D$DefaultImpls { inner class D$DefaultImpls public static method baz(p0: D): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class D { inner class D$DefaultImpls public abstract method baz(): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class E$InsideE { inner class E$InsideE public method (): void } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class E { inner class E$InsideE diff --git a/compiler/testData/codegen/bytecodeListing/inlineOnly.txt b/compiler/testData/codegen/bytecodeListing/inlineOnly.txt index d44965bde2d..355583b230f 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineOnly.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineOnly.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public final class Foo { public method (): void @@ -6,6 +7,7 @@ public final class Foo { private final @kotlin.jvm.internal.InlineOnly method foo(): void } +@kotlin.Metadata @kotlin.jvm.internal.KotlinFileFacade public final class InlineOnlyKt { public final static method bar(): void diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt index 0f6f2fc64b2..601539e7a50 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/contains.txt @@ -1,3 +1,4 @@ +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A1 { public method (): void @@ -10,6 +11,7 @@ public abstract class A1 { public method toArray(p0: java.lang.Object[]): java.lang.Object[] } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A2 { public method (): void @@ -24,6 +26,7 @@ public abstract class A2 { public method toArray(p0: java.lang.Object[]): java.lang.Object[] } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A3 { public method (): void @@ -37,6 +40,7 @@ public abstract class A3 { public final method size(): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A4 { public method (): void @@ -51,6 +55,7 @@ public abstract class A4 { public final method size(): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A5 { public method (): void @@ -68,6 +73,7 @@ public abstract class A5 { public final method size(): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A6 { public method (): void @@ -86,6 +92,7 @@ public abstract class A6 { public final method size(): int } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A7 { public method (): void @@ -99,6 +106,7 @@ public abstract class A7 { public method toArray(p0: java.lang.Object[]): java.lang.Object[] } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class A8 { public method (): void @@ -112,12 +120,14 @@ public abstract class A8 { @kotlin.jvm.internal.KotlinInterfaceDefaultImpls @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata public final class I1$DefaultImpls { inner class I1$DefaultImpls public static method contains(p0: I1, p1: java.lang.Object): boolean public static method containsAll(@org.jetbrains.annotations.NotNull p0: I1, p1: java.util.Collection): boolean } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class I1 { inner class I1$DefaultImpls @@ -129,12 +139,14 @@ public abstract class I1 { @kotlin.jvm.internal.KotlinInterfaceDefaultImpls @kotlin.jvm.internal.KotlinSyntheticClass +@kotlin.Metadata public final class I2$DefaultImpls { inner class I2$DefaultImpls public static method contains(@org.jetbrains.annotations.NotNull p0: I2, p1: java.lang.String): boolean public static method containsAll(@org.jetbrains.annotations.NotNull p0: I2, p1: java.util.Collection): boolean } +@kotlin.Metadata @kotlin.jvm.internal.KotlinClass public abstract class I2 { inner class I2$DefaultImpls 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 e26707fd59a..493649b36cc 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 @@ -28,6 +28,8 @@ import java.util.HashSet; import java.util.Set; public final class JvmAnnotationNames { + public static final FqName METADATA = new FqName("kotlin.Metadata"); + public static final FqName KOTLIN_CLASS = new FqName("kotlin.jvm.internal.KotlinClass"); public static final FqName KOTLIN_FILE_FACADE = new FqName("kotlin.jvm.internal.KotlinFileFacade"); public static final FqName KOTLIN_MULTIFILE_CLASS = new FqName("kotlin.jvm.internal.KotlinMultifileClass"); @@ -38,8 +40,15 @@ public final class JvmAnnotationNames { public static final FqName KOTLIN_LOCAL_CLASS = new FqName("kotlin.jvm.internal.KotlinLocalClass"); public static final String VERSION_FIELD_NAME = "version"; + public static final String METADATA_VERSION_FIELD_NAME = "mv"; + public static final String BYTECODE_VERSION_FIELD_NAME = "bv"; public static final String FILE_PART_CLASS_NAMES_FIELD_NAME = "filePartClassNames"; public static final String MULTIFILE_CLASS_NAME_FIELD_NAME = "multifileClassName"; + public static final String KIND_FIELD_NAME = "k"; + public static final String METADATA_DATA_FIELD_NAME = "d1"; + public static final String METADATA_STRINGS_FIELD_NAME = "d2"; + public static final String SYNTHETIC_CLASS_KIND_FIELD_NAME = "xi"; + public static final String METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME = "xs"; 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"; @@ -66,7 +75,9 @@ public final class JvmAnnotationNames { private static final Set NULLABILITY_ANNOTATIONS = new HashSet(); private static final Set SPECIAL_META_ANNOTATIONS = new HashSet(); static { - for (FqName fqName : Arrays.asList(KOTLIN_CLASS, KOTLIN_SYNTHETIC_CLASS, KOTLIN_INTERFACE_DEFAULT_IMPLS, KOTLIN_LOCAL_CLASS)) { + for (FqName fqName : Arrays.asList( + METADATA, KOTLIN_CLASS, KOTLIN_SYNTHETIC_CLASS, KOTLIN_INTERFACE_DEFAULT_IMPLS, KOTLIN_LOCAL_CLASS + )) { SPECIAL_ANNOTATIONS.add(JvmClassName.byFqNameWithoutInnerClasses(fqName)); } 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 c3d02e8fc57..dd79bba7596 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 @@ -29,12 +29,19 @@ class KotlinClassHeader( val isInterfaceDefaultImpls: Boolean, val isLocalClass: Boolean ) { - enum class Kind { - CLASS, - FILE_FACADE, - MULTIFILE_CLASS, - MULTIFILE_CLASS_PART, - SYNTHETIC_CLASS + // See kotlin.Metadata + enum class Kind(val id: Int) { + CLASS(1), + FILE_FACADE(2), + SYNTHETIC_CLASS(3), + MULTIFILE_CLASS(4), + MULTIFILE_CLASS_PART(5); + } + + enum class SyntheticClassKind(val id: Int) { + FUNCTION(1), + LOCAL_CLASS(2), + INTERFACE_DEFAULT_IMPLS(3); } override fun toString() = "$kind " + (if (isLocalClass) "(local) " else "") + "version=$metadataVersion" diff --git a/core/runtime.jvm/src/kotlin/Metadata.kt b/core/runtime.jvm/src/kotlin/Metadata.kt new file mode 100644 index 00000000000..d66ba7fdaf3 --- /dev/null +++ b/core/runtime.jvm/src/kotlin/Metadata.kt @@ -0,0 +1,70 @@ +/* + * 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 + +/** + * This annotation is present on any class file produced by the Kotlin compiler and is read by the compiler and reflection. + * Parameters have very short names on purpose: these names appear in the generated class files, and we'd like to reduce their size. + */ +@Retention(AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.CLASS) +internal annotation class Metadata( + /** + * A kind of the metadata this annotation encodes. Kotlin compiler recognizes the following kinds (see KotlinClassHeader.Kind): + * + * 1 Class + * 2 File + * 3 Synthetic class + * 4 Multi-file class facade + * 5 Multi-file class part + * + * The class file with a kind not listed here is treated as a non-Kotlin file. + */ + val k: Int = 1, + /** + * The version of the metadata provided in the arguments of this annotation. + */ + val mv: IntArray = intArrayOf(), + /** + * The version of the bytecode interface (naming conventions, signatures) of the class file annotated with this annotation. + */ + val bv: IntArray = intArrayOf(), + /** + * Metadata in a custom format. The format may be different (or even absent) for different kinds. + */ + val d1: Array = arrayOf(), + /** + * An addition to [d1]: array of strings which occur in metadata, written in plain text so that strings already present + * in the constant pool are reused. These strings may be then indexed in the metadata by an integer index in this array. + */ + val d2: Array = arrayOf(), + /** + * An extra string. For a multi-file part class, internal name of the facade class. + */ + val xs: String = "", + /** + * An extra integer. For a synthetic class, the specific kind of this class which is one of the following: + * + * 1 Anonymous class for a lambda or a function reference + * 2 Local class or anonymous object literal + * 3 Implicit nested DefaultImpls class for an interface + * + * A value other than this (e.g. 0) or a missing value means this is a synthetic class of some other sort. + * This kind has no effect on the compiler because it doesn't read synthetic class metadata. It may be used in IDEs and tools. + */ + val xi: Int = 0 +) diff --git a/generators/infrastructure/strip-kotlin-annotations.kts b/generators/infrastructure/strip-kotlin-annotations.kts index 10ae346c387..5c8f614f8fb 100644 --- a/generators/infrastructure/strip-kotlin-annotations.kts +++ b/generators/infrastructure/strip-kotlin-annotations.kts @@ -23,7 +23,7 @@ import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream /** - * Removes kotlin.jvm.internal.* annotations from Kotlin classes + * Removes metadata annotations from Kotlin classes */ fun main(args: Array) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index 886802b684b..74794ec005c 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -20,12 +20,15 @@ import com.intellij.codeInsight.completion.AllClassesGetter import com.intellij.codeInsight.completion.CompletionParameters import com.intellij.codeInsight.completion.PrefixMatcher import com.intellij.psi.PsiClass +import com.intellij.psi.PsiLiteral import org.jetbrains.kotlin.asJava.KtLightClass import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.project.ProjectStructureUtil import org.jetbrains.kotlin.idea.resolve.ResolutionFacade +import org.jetbrains.kotlin.load.java.JvmAnnotationNames +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -87,7 +90,14 @@ class AllClassesCompletion(private val parameters: CompletionParameters, } private fun PsiClass.isSyntheticKotlinClass(): Boolean { - if (!name!!.contains('$')) return false // optimization to not analyze annotations of all classes - return modifierList?.findAnnotation(kotlin.jvm.internal.KotlinSyntheticClass::class.java.name) != null + if ('$' !in name!!) return false // optimization to not analyze annotations of all classes + val metadata = modifierList?.findAnnotation(JvmAnnotationNames.METADATA.asString()) + if (metadata != null && + (metadata.findAttributeValue(JvmAnnotationNames.KIND_FIELD_NAME) as? PsiLiteral)?.value == + KotlinClassHeader.Kind.SYNTHETIC_CLASS.id) { + return true + } + + return modifierList?.findAnnotation(JvmAnnotationNames.KOTLIN_SYNTHETIC_CLASS.asString()) != null } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt index ef99da22c3e..f502078efb7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/AbstractIdeLightClassTest.kt @@ -23,7 +23,6 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.asJava.LightClassTestCommon import org.jetbrains.kotlin.idea.KotlinDaemonAnalyzerTestCase -import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.test.KotlinTestUtils @@ -81,14 +80,13 @@ private fun testLightClass(project: Project, testDataPath: String, normalize: (S .replace("java.lang.String s)", "java.lang.String p)") .replace("java.lang.String s1", "java.lang.String p1") .replace("java.lang.String s2", "java.lang.String p2") - .removeLinesStartingWith("@kotlin.jvm.internal.KotlinClass") - .removeLinesStartingWith("@kotlin.jvm.internal.KotlinFileFacade") + .removeLinesStartingWith("@kotlin.jvm.internal.") + .removeLinesStartingWith("@kotlin.Metadata") .run(normalize) } ) } -private fun String.removeLinesStartingWith(prefix: String) : String { +private fun String.removeLinesStartingWith(prefix: String): String { return lines().filterNot { it.trimStart().startsWith(prefix) }.joinToString(separator = "\n") } - diff --git a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/AnnotationCollectorExtension.kt b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/AnnotationCollectorExtension.kt index de6f56c42c9..c5ae2b47557 100644 --- a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/AnnotationCollectorExtension.kt +++ b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/AnnotationCollectorExtension.kt @@ -28,11 +28,9 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.org.objectweb.asm.* import java.io.File import java.io.IOException -import java.io.StringWriter import java.io.Writer import java.util.regex.Pattern import java.util.regex.PatternSyntaxException -import kotlin.properties.Delegates abstract class AnnotationCollectorExtensionBase(val supportInheritedAnnotations: Boolean) : ClassBuilderInterceptorExtension { @@ -167,7 +165,7 @@ abstract class AnnotationCollectorExtensionBase(val supportInheritedAnnotations: private fun isAnnotationHandled(annotationFqName: String): Boolean { return if (annotationFilterEnabled) annotationFilters.any { it.matcher(annotationFqName).matches() } - else !annotationFqName.startsWith("kotlin.jvm.internal.") //apply to all + else !annotationFqName.startsWith("kotlin.jvm.internal.") && annotationFqName != "kotlin.Metadata" //apply to all } private fun recordClass(packageName: String, className: String) {