Combine all metadata annotations into one kotlin/Metadata
This commit is contained in:
@@ -553,6 +553,7 @@
|
||||
source="${java.target}" target="${java.target}">
|
||||
<withKotlin modulename="kotlin-compiler"/>
|
||||
<skip pattern="kotlin/jvm/internal/.*"/>
|
||||
<skip pattern="kotlin/Metadata"/>
|
||||
<src refid="compilerSources.path"/>
|
||||
<classpath refid="classpath"/>
|
||||
</javac2>
|
||||
@@ -630,6 +631,7 @@
|
||||
<javac2 destdir="${output}/classes/android-compiler-plugin" debug="true" debuglevel="lines,vars,source" includeAntRuntime="false">
|
||||
<withKotlin modulename="kotlin-android-compiler-plugin"/>
|
||||
<skip pattern="kotlin/jvm/internal/.*"/>
|
||||
<skip pattern="kotlin/Metadata"/>
|
||||
<src>
|
||||
<pathelement path="plugins/android-compiler-plugin/src"/>
|
||||
</src>
|
||||
@@ -654,6 +656,7 @@
|
||||
source="${java.target}" target="${java.target}">
|
||||
<withKotlin modulename="kotlin-ant-tools"/>
|
||||
<skip pattern="kotlin/jvm/internal/.*"/>
|
||||
<skip pattern="kotlin/Metadata"/>
|
||||
<src>
|
||||
<dirset dir="${basedir}/ant">
|
||||
<include name="src"/>
|
||||
@@ -756,6 +759,7 @@
|
||||
<javac2 srcdir="${toString:src.dirset}" destdir="@{output}" debug="true" debuglevel="lines,vars,source"
|
||||
includeAntRuntime="false" source="${java.target}" target="${java.target}">
|
||||
<skip pattern="kotlin/jvm/internal/.*"/>
|
||||
<skip pattern="kotlin/Metadata"/>
|
||||
<classpath>
|
||||
<path refid="classpath.path"/>
|
||||
<!-- Include @{output} here for Java compiler to resolve symbols from Kotlin sources -->
|
||||
@@ -930,7 +934,7 @@
|
||||
|
||||
<kotlinc src="${basedir}/generators/infrastructure/strip-kotlin-annotations.kts" output="">
|
||||
<compilerarg value="-script"/>
|
||||
<compilerarg value="kotlin/jvm/internal/.*"/> <!-- Annotations to strip -->
|
||||
<compilerarg value="kotlin/jvm/internal/.*|kotlin/Metadata"/> <!-- Annotations to strip -->
|
||||
<compilerarg value="kotlin/reflect/jvm/internal/impl/.*"/> <!-- Classes to strip from -->
|
||||
<compilerarg value="${output}/kotlin-reflect-jarjar.jar"/>
|
||||
<compilerarg value="${kotlin-home}/lib/kotlin-reflect.jar"/>
|
||||
@@ -1025,6 +1029,7 @@
|
||||
source="${java.target}" target="${java.target}">
|
||||
<withKotlin modulename="kotlin-for-upsource"/>
|
||||
<skip pattern="kotlin/jvm/internal/.*"/>
|
||||
<skip pattern="kotlin/Metadata"/>
|
||||
<src>
|
||||
<dirset dir="${basedir}/idea/ide-common" includes="src"/>
|
||||
<dirset dir="${basedir}/idea/idea-analysis" includes="src"/>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<KtElement> {
|
||||
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<AnnotationVisitor, Unit>() {
|
||||
@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();
|
||||
}
|
||||
|
||||
@@ -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<AnnotationVisitor, Unit>() {
|
||||
@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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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<KtFile> {
|
||||
|
||||
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<AnnotationVisitor, Unit>() {
|
||||
@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();
|
||||
}
|
||||
|
||||
@@ -160,6 +160,8 @@ class PropertyReferenceCodegen(
|
||||
|
||||
override fun generateKotlinAnnotation() {
|
||||
writeKotlinSyntheticClassAnnotation(v, state)
|
||||
|
||||
writeSyntheticClassMetadata(v, null)
|
||||
}
|
||||
|
||||
fun putInstanceOnStack(): StackValue =
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+3
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
@kotlin.Metadata
|
||||
@kotlin.jvm.internal.KotlinClass
|
||||
public final class Example {
|
||||
private field prop2: int
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <init>(): void
|
||||
|
||||
@@ -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 <init>(): void
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
@kotlin.Metadata
|
||||
@kotlin.jvm.internal.KotlinClass
|
||||
public final class A {
|
||||
public method <init>(): 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
|
||||
|
||||
@@ -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 <init>(): void
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
@kotlin.jvm.internal.KotlinClass
|
||||
public abstract class E {
|
||||
inner class E$InsideE
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
@kotlin.Metadata
|
||||
@kotlin.jvm.internal.KotlinClass
|
||||
public final class Foo {
|
||||
public method <init>(): 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
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
@kotlin.Metadata
|
||||
@kotlin.jvm.internal.KotlinClass
|
||||
public abstract class A1 {
|
||||
public method <init>(): 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 <init>(): 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 <init>(): 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 <init>(): 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 <init>(): 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 <init>(): 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 <init>(): 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 <init>(): 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
|
||||
|
||||
+12
-1
@@ -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<JvmClassName> NULLABILITY_ANNOTATIONS = new HashSet<JvmClassName>();
|
||||
private static final Set<JvmClassName> SPECIAL_META_ANNOTATIONS = new HashSet<JvmClassName>();
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
+13
-6
@@ -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"
|
||||
|
||||
@@ -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<String> = 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<String> = 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
|
||||
)
|
||||
@@ -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<String>) {
|
||||
|
||||
+12
-2
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
|
||||
+1
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user