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) {