Drop 'index' JVM binary format extension
Compute the JVM parameer index manually instead
This commit is contained in:
@@ -77,7 +77,6 @@ import java.util.Set;
|
|||||||
|
|
||||||
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isNullableAny;
|
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isNullableAny;
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.INDEX_FOR_VALUE_PARAMETER;
|
|
||||||
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
||||||
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
||||||
import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*;
|
import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*;
|
||||||
@@ -271,9 +270,6 @@ public class FunctionCodegen {
|
|||||||
|
|
||||||
if (kind == JvmMethodParameterKind.VALUE) {
|
if (kind == JvmMethodParameterKind.VALUE) {
|
||||||
ValueParameterDescriptor parameter = iterator.next();
|
ValueParameterDescriptor parameter = iterator.next();
|
||||||
if (parameter.getIndex() != i) {
|
|
||||||
v.getSerializationBindings().put(INDEX_FOR_VALUE_PARAMETER, parameter, i);
|
|
||||||
}
|
|
||||||
AnnotationCodegen annotationCodegen = AnnotationCodegen.forParameter(i, mv, typeMapper);
|
AnnotationCodegen annotationCodegen = AnnotationCodegen.forParameter(i, mv, typeMapper);
|
||||||
|
|
||||||
if (functionDescriptor instanceof PropertySetterDescriptor) {
|
if (functionDescriptor instanceof PropertySetterDescriptor) {
|
||||||
|
|||||||
-3
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
|
|
||||||
import org.jetbrains.kotlin.util.slicedMap.BasicWritableSlice;
|
import org.jetbrains.kotlin.util.slicedMap.BasicWritableSlice;
|
||||||
import org.jetbrains.kotlin.util.slicedMap.MutableSlicedMap;
|
import org.jetbrains.kotlin.util.slicedMap.MutableSlicedMap;
|
||||||
import org.jetbrains.kotlin.util.slicedMap.SlicedMapImpl;
|
import org.jetbrains.kotlin.util.slicedMap.SlicedMapImpl;
|
||||||
@@ -36,8 +35,6 @@ public final class JvmSerializationBindings {
|
|||||||
SerializationMappingSlice.create();
|
SerializationMappingSlice.create();
|
||||||
public static final SerializationMappingSlice<PropertyDescriptor, Method> SYNTHETIC_METHOD_FOR_PROPERTY =
|
public static final SerializationMappingSlice<PropertyDescriptor, Method> SYNTHETIC_METHOD_FOR_PROPERTY =
|
||||||
SerializationMappingSlice.create();
|
SerializationMappingSlice.create();
|
||||||
public static final SerializationMappingSlice<ValueParameterDescriptor, Integer> INDEX_FOR_VALUE_PARAMETER =
|
|
||||||
SerializationMappingSlice.create();
|
|
||||||
|
|
||||||
private static final class SerializationMappingSlice<K, V> extends BasicWritableSlice<K, V> {
|
private static final class SerializationMappingSlice<K, V> extends BasicWritableSlice<K, V> {
|
||||||
public SerializationMappingSlice() {
|
public SerializationMappingSlice() {
|
||||||
|
|||||||
-8
@@ -60,14 +60,6 @@ public class JvmSerializerExtension extends SerializerExtension {
|
|||||||
return useTypeTable;
|
return useTypeTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void serializeValueParameter(@NotNull ValueParameterDescriptor descriptor, @NotNull ProtoBuf.ValueParameter.Builder proto) {
|
|
||||||
Integer index = bindings.get(INDEX_FOR_VALUE_PARAMETER, descriptor);
|
|
||||||
if (index != null) {
|
|
||||||
proto.setExtension(JvmProtoBuf.index, index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void serializeType(@NotNull KotlinType type, @NotNull ProtoBuf.Type.Builder proto) {
|
public void serializeType(@NotNull KotlinType type, @NotNull ProtoBuf.Type.Builder proto) {
|
||||||
// TODO: don't store type annotations in our binary metadata on Java 8, use *TypeAnnotations attributes instead
|
// TODO: don't store type annotations in our binary metadata on Java 8, use *TypeAnnotations attributes instead
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ public final class DebugJvmProtoBuf {
|
|||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeAnnotation);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.isRaw);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.isRaw);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeParameterAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeParameterAnnotation);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.index);
|
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classAnnotation);
|
||||||
}
|
}
|
||||||
public interface StringTableTypesOrBuilder
|
public interface StringTableTypesOrBuilder
|
||||||
@@ -4591,17 +4590,6 @@ public final class DebugJvmProtoBuf {
|
|||||||
.newFileScopedGeneratedExtension(
|
.newFileScopedGeneratedExtension(
|
||||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class,
|
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class,
|
||||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance());
|
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance());
|
||||||
public static final int INDEX_FIELD_NUMBER = 100;
|
|
||||||
/**
|
|
||||||
* <code>extend .org.jetbrains.kotlin.serialization.ValueParameter { ... }</code>
|
|
||||||
*/
|
|
||||||
public static final
|
|
||||||
com.google.protobuf.GeneratedMessage.GeneratedExtension<
|
|
||||||
org.jetbrains.kotlin.serialization.DebugProtoBuf.ValueParameter,
|
|
||||||
java.lang.Integer> index = com.google.protobuf.GeneratedMessage
|
|
||||||
.newFileScopedGeneratedExtension(
|
|
||||||
java.lang.Integer.class,
|
|
||||||
null);
|
|
||||||
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
|
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
|
||||||
/**
|
/**
|
||||||
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
|
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
|
||||||
@@ -4692,12 +4680,10 @@ public final class DebugJvmProtoBuf {
|
|||||||
"rameter_annotation\0221.org.jetbrains.kotli" +
|
"rameter_annotation\0221.org.jetbrains.kotli" +
|
||||||
"n.serialization.TypeParameter\030d \003(\0132..or" +
|
"n.serialization.TypeParameter\030d \003(\0132..or" +
|
||||||
"g.jetbrains.kotlin.serialization.Annotat" +
|
"g.jetbrains.kotlin.serialization.Annotat" +
|
||||||
"ion:A\n\005index\0222.org.jetbrains.kotlin.seri" +
|
"ion:s\n\020class_annotation\022).org.jetbrains." +
|
||||||
"alization.ValueParameter\030d \001(\005:s\n\020class_" +
|
"kotlin.serialization.Class\030d \003(\0132..org.j" +
|
||||||
"annotation\022).org.jetbrains.kotlin.serial" +
|
"etbrains.kotlin.serialization.Annotation" +
|
||||||
"ization.Class\030d \003(\0132..org.jetbrains.kotl" +
|
"B\022B\020DebugJvmProtoBuf"
|
||||||
"in.serialization.AnnotationB\022B\020DebugJvmP",
|
|
||||||
"rotoBuf"
|
|
||||||
};
|
};
|
||||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||||
@@ -4740,8 +4726,7 @@ public final class DebugJvmProtoBuf {
|
|||||||
typeAnnotation.internalInit(descriptor.getExtensions().get(3));
|
typeAnnotation.internalInit(descriptor.getExtensions().get(3));
|
||||||
isRaw.internalInit(descriptor.getExtensions().get(4));
|
isRaw.internalInit(descriptor.getExtensions().get(4));
|
||||||
typeParameterAnnotation.internalInit(descriptor.getExtensions().get(5));
|
typeParameterAnnotation.internalInit(descriptor.getExtensions().get(5));
|
||||||
index.internalInit(descriptor.getExtensions().get(6));
|
classAnnotation.internalInit(descriptor.getExtensions().get(6));
|
||||||
classAnnotation.internalInit(descriptor.getExtensions().get(7));
|
|
||||||
com.google.protobuf.ExtensionRegistry registry =
|
com.google.protobuf.ExtensionRegistry registry =
|
||||||
com.google.protobuf.ExtensionRegistry.newInstance();
|
com.google.protobuf.ExtensionRegistry.newInstance();
|
||||||
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
|
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
|
||||||
|
|||||||
@@ -109,11 +109,6 @@ extend TypeParameter {
|
|||||||
repeated Annotation type_parameter_annotation = 100;
|
repeated Annotation type_parameter_annotation = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
extend ValueParameter {
|
|
||||||
// Index of the corresponding parameter of this method in JVM (counting receiver parameters, enum constructor synthetic parameters, etc.)
|
|
||||||
optional int32 index = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
extend Class {
|
extend Class {
|
||||||
repeated Annotation class_annotation = 100;
|
repeated Annotation class_annotation = 100;
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-4
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.load.kotlin
|
package org.jetbrains.kotlin.load.kotlin
|
||||||
|
|
||||||
import com.google.protobuf.MessageLite
|
import com.google.protobuf.MessageLite
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
@@ -26,7 +27,6 @@ import org.jetbrains.kotlin.serialization.ProtoBuf
|
|||||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||||
import org.jetbrains.kotlin.serialization.jvm.ClassMapperLite
|
import org.jetbrains.kotlin.serialization.jvm.ClassMapperLite
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.index
|
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.propertySignature
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.propertySignature
|
||||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
@@ -139,7 +139,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
|
|||||||
): List<A> {
|
): List<A> {
|
||||||
val methodSignature = getCallableSignature(message, container.nameResolver, container.typeTable, kind)
|
val methodSignature = getCallableSignature(message, container.nameResolver, container.typeTable, kind)
|
||||||
if (methodSignature != null) {
|
if (methodSignature != null) {
|
||||||
val index = if (proto.hasExtension(index)) proto.getExtension(index) else parameterIndex
|
val index = parameterIndex + computeJvmParameterIndexShift(container, message)
|
||||||
val paramSignature = MemberSignature.fromMethodSignatureAndParameterIndex(methodSignature, index)
|
val paramSignature = MemberSignature.fromMethodSignatureAndParameterIndex(methodSignature, index)
|
||||||
return findClassAndLoadMemberAnnotations(container, paramSignature)
|
return findClassAndLoadMemberAnnotations(container, paramSignature)
|
||||||
}
|
}
|
||||||
@@ -147,6 +147,19 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
|
|||||||
return listOf()
|
return listOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun computeJvmParameterIndexShift(container: ProtoContainer, message: MessageLite): Int {
|
||||||
|
return when (message) {
|
||||||
|
is ProtoBuf.Function -> if (message.hasReceiver()) 1 else 0
|
||||||
|
is ProtoBuf.Property -> if (message.hasReceiver()) 1 else 0
|
||||||
|
is ProtoBuf.Constructor -> when {
|
||||||
|
(container as ProtoContainer.Class).kind == ProtoBuf.Class.Kind.ENUM_CLASS -> 2
|
||||||
|
container.isInner -> 1
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
else -> throw UnsupportedOperationException("Unsupported message: ${message.javaClass}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun loadExtensionReceiverParameterAnnotations(
|
override fun loadExtensionReceiverParameterAnnotations(
|
||||||
container: ProtoContainer,
|
container: ProtoContainer,
|
||||||
message: MessageLite,
|
message: MessageLite,
|
||||||
@@ -187,7 +200,8 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (container is ProtoContainer.Class) {
|
if (container is ProtoContainer.Class) {
|
||||||
if (field && container.isCompanionOfClass) {
|
if (field && container.kind == ProtoBuf.Class.Kind.COMPANION_OBJECT &&
|
||||||
|
(container.outerClassKind == ClassKind.CLASS || container.outerClassKind == ClassKind.ENUM_CLASS)) {
|
||||||
// Backing fields of properties of a companion object in a class are generated in the outer class
|
// Backing fields of properties of a companion object in a class are generated in the outer class
|
||||||
return kotlinClassFinder.findKotlinClass(container.classId.outerClassId)
|
return kotlinClassFinder.findKotlinClass(container.classId.outerClassId)
|
||||||
}
|
}
|
||||||
@@ -199,7 +213,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getImplClassName(container: ProtoContainer, property: Boolean): ClassId? {
|
private fun getImplClassName(container: ProtoContainer, property: Boolean): ClassId? {
|
||||||
if (property && container is ProtoContainer.Class && container.isInterface) {
|
if (property && container is ProtoContainer.Class && container.kind == ProtoBuf.Class.Kind.INTERFACE) {
|
||||||
return container.classId.createNestedClassId(Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME))
|
return container.classId.createNestedClassId(Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME))
|
||||||
}
|
}
|
||||||
return ((container as? ProtoContainer.Package)?.packagePartSource as? JvmPackagePartSource)?.classId
|
return ((container as? ProtoContainer.Package)?.packagePartSource as? JvmPackagePartSource)?.classId
|
||||||
|
|||||||
-16
@@ -13,7 +13,6 @@ public final class JvmProtoBuf {
|
|||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeAnnotation);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeParameterAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeParameterAnnotation);
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.index);
|
|
||||||
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation);
|
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation);
|
||||||
}
|
}
|
||||||
public interface StringTableTypesOrBuilder
|
public interface StringTableTypesOrBuilder
|
||||||
@@ -3802,21 +3801,6 @@ public final class JvmProtoBuf {
|
|||||||
100,
|
100,
|
||||||
com.google.protobuf.WireFormat.FieldType.MESSAGE,
|
com.google.protobuf.WireFormat.FieldType.MESSAGE,
|
||||||
false);
|
false);
|
||||||
public static final int INDEX_FIELD_NUMBER = 100;
|
|
||||||
/**
|
|
||||||
* <code>extend .org.jetbrains.kotlin.serialization.ValueParameter { ... }</code>
|
|
||||||
*/
|
|
||||||
public static final
|
|
||||||
com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
|
|
||||||
org.jetbrains.kotlin.serialization.ProtoBuf.ValueParameter,
|
|
||||||
java.lang.Integer> index = com.google.protobuf.GeneratedMessageLite
|
|
||||||
.newSingularGeneratedExtension(
|
|
||||||
org.jetbrains.kotlin.serialization.ProtoBuf.ValueParameter.getDefaultInstance(),
|
|
||||||
0,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
100,
|
|
||||||
com.google.protobuf.WireFormat.FieldType.INT32);
|
|
||||||
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
|
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
|
||||||
/**
|
/**
|
||||||
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
|
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
|
||||||
|
|||||||
+6
-17
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorFactory
|
import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|
||||||
import org.jetbrains.kotlin.serialization.Flags
|
import org.jetbrains.kotlin.serialization.Flags
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
|
||||||
@@ -219,7 +218,11 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
|||||||
val flags = if (proto.hasFlags()) proto.flags else 0
|
val flags = if (proto.hasFlags()) proto.flags else 0
|
||||||
ValueParameterDescriptorImpl(
|
ValueParameterDescriptorImpl(
|
||||||
callableDescriptor, null, i,
|
callableDescriptor, null, i,
|
||||||
containerOfCallable?.let { getParameterAnnotations(it, callable, kind, i, proto) } ?: Annotations.EMPTY,
|
containerOfCallable?.let { container ->
|
||||||
|
DeserializedAnnotations(c.storageManager) {
|
||||||
|
c.components.annotationAndConstantLoader.loadValueParameterAnnotations(container, callable, kind, i, proto)
|
||||||
|
}
|
||||||
|
} ?: Annotations.EMPTY,
|
||||||
c.nameResolver.getName(proto.name),
|
c.nameResolver.getName(proto.name),
|
||||||
c.typeDeserializer.type(proto.type(c.typeTable)),
|
c.typeDeserializer.type(proto.type(c.typeTable)),
|
||||||
Flags.DECLARES_DEFAULT_VALUE.get(flags),
|
Flags.DECLARES_DEFAULT_VALUE.get(flags),
|
||||||
@@ -231,24 +234,10 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
|||||||
}.toReadOnlyList()
|
}.toReadOnlyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getParameterAnnotations(
|
|
||||||
container: ProtoContainer,
|
|
||||||
callable: MessageLite,
|
|
||||||
kind: AnnotatedCallableKind,
|
|
||||||
index: Int,
|
|
||||||
valueParameter: ProtoBuf.ValueParameter
|
|
||||||
): Annotations {
|
|
||||||
return DeserializedAnnotations(c.storageManager) {
|
|
||||||
c.components.annotationAndConstantLoader.loadValueParameterAnnotations(container, callable, kind, index, valueParameter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when (this) {
|
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when (this) {
|
||||||
is PackageFragmentDescriptor -> ProtoContainer.Package(fqName, c.nameResolver, c.typeTable, c.packagePartSource)
|
is PackageFragmentDescriptor -> ProtoContainer.Package(fqName, c.nameResolver, c.typeTable, c.packagePartSource)
|
||||||
is DeserializedClassDescriptor -> ProtoContainer.Class(
|
is DeserializedClassDescriptor -> ProtoContainer.Class(
|
||||||
classProto, c.nameResolver, c.typeTable,
|
classProto, c.nameResolver, c.typeTable, (containingDeclaration as? ClassDescriptor)?.kind
|
||||||
isCompanionOfClass = DescriptorUtils.isCompanionObject(this) && DescriptorUtils.isClassOrEnumClass(containingDeclaration),
|
|
||||||
isInterface = kind == ClassKind.INTERFACE
|
|
||||||
)
|
)
|
||||||
else -> null // TODO: support annotations on lambdas and their parameters
|
else -> null // TODO: support annotations on lambdas and their parameters
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.serialization.deserialization
|
package org.jetbrains.kotlin.serialization.deserialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.serialization.Flags
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.PackagePartSource
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.PackagePartSource
|
||||||
|
|
||||||
@@ -29,11 +31,13 @@ sealed class ProtoContainer(
|
|||||||
val classProto: ProtoBuf.Class,
|
val classProto: ProtoBuf.Class,
|
||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
typeTable: TypeTable,
|
typeTable: TypeTable,
|
||||||
val isCompanionOfClass: Boolean,
|
val outerClassKind: ClassKind?
|
||||||
val isInterface: Boolean
|
|
||||||
) : ProtoContainer(nameResolver, typeTable) {
|
) : ProtoContainer(nameResolver, typeTable) {
|
||||||
val classId: ClassId = nameResolver.getClassId(classProto.fqName)
|
val classId: ClassId = nameResolver.getClassId(classProto.fqName)
|
||||||
|
|
||||||
|
val kind: ProtoBuf.Class.Kind = Flags.CLASS_KIND.get(classProto.flags) ?: ProtoBuf.Class.Kind.CLASS
|
||||||
|
val isInner: Boolean = Flags.IS_INNER.get(classProto.flags)
|
||||||
|
|
||||||
override fun debugFqName(): FqName = classId.asSingleFqName()
|
override fun debugFqName(): FqName = classId.asSingleFqName()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -288,19 +288,19 @@ public class DeserializedClassDescriptor(
|
|||||||
|
|
||||||
private inner class EnumEntryClassDescriptors {
|
private inner class EnumEntryClassDescriptors {
|
||||||
private val enumEntryProtos = classProto.enumEntryList.toMapBy { c.nameResolver.getName(it.name) }
|
private val enumEntryProtos = classProto.enumEntryList.toMapBy { c.nameResolver.getName(it.name) }
|
||||||
|
private val protoContainer =
|
||||||
|
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable, (containingDeclaration as? ClassDescriptor)?.kind)
|
||||||
|
|
||||||
val enumEntryByName = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> {
|
val enumEntryByName = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> {
|
||||||
name ->
|
name ->
|
||||||
|
|
||||||
enumEntryProtos[name]?.let { proto ->
|
enumEntryProtos[name]?.let { proto ->
|
||||||
val annotations = DeserializedAnnotations(c.storageManager) {
|
|
||||||
c.components.annotationAndConstantLoader.loadEnumEntryAnnotations(
|
|
||||||
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable, isCompanionOfClass = false, isInterface = false),
|
|
||||||
proto
|
|
||||||
)
|
|
||||||
}
|
|
||||||
EnumEntrySyntheticClassDescriptor.create(
|
EnumEntrySyntheticClassDescriptor.create(
|
||||||
c.storageManager, this@DeserializedClassDescriptor, name, enumMemberNames, annotations, SourceElement.NO_SOURCE
|
c.storageManager, this@DeserializedClassDescriptor, name, enumMemberNames,
|
||||||
|
DeserializedAnnotations(c.storageManager) {
|
||||||
|
c.components.annotationAndConstantLoader.loadEnumEntryAnnotations(protoContainer, proto)
|
||||||
|
},
|
||||||
|
SourceElement.NO_SOURCE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-10
@@ -35,10 +35,7 @@ import org.jetbrains.kotlin.psi.stubs.impl.KotlinObjectStubImpl
|
|||||||
import org.jetbrains.kotlin.psi.stubs.impl.KotlinPlaceHolderStubImpl
|
import org.jetbrains.kotlin.psi.stubs.impl.KotlinPlaceHolderStubImpl
|
||||||
import org.jetbrains.kotlin.serialization.Flags
|
import org.jetbrains.kotlin.serialization.Flags
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.supertypes
|
|
||||||
|
|
||||||
fun createClassStub(
|
fun createClassStub(
|
||||||
parent: StubElement<out PsiElement>,
|
parent: StubElement<out PsiElement>,
|
||||||
@@ -76,12 +73,7 @@ private class ClassClsStubBuilder(
|
|||||||
if (classProto.hasCompanionObjectName()) c.nameResolver.getName(classProto.companionObjectName) else null
|
if (classProto.hasCompanionObjectName()) c.nameResolver.getName(classProto.companionObjectName) else null
|
||||||
|
|
||||||
private val thisAsProtoContainer =
|
private val thisAsProtoContainer =
|
||||||
ProtoContainer.Class(
|
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable, outerContext.classKind?.let { Deserialization.classKind(it) })
|
||||||
classProto, c.nameResolver, c.typeTable,
|
|
||||||
classKind == ProtoBuf.Class.Kind.COMPANION_OBJECT &&
|
|
||||||
(outerContext.classKind?.let { it == ProtoBuf.Class.Kind.CLASS || it == ProtoBuf.Class.Kind.ENUM_CLASS } ?: false),
|
|
||||||
classKind == ProtoBuf.Class.Kind.INTERFACE
|
|
||||||
)
|
|
||||||
|
|
||||||
private val classOrObjectStub = createClassOrObjectStubAndModifierListStub()
|
private val classOrObjectStub = createClassOrObjectStubAndModifierListStub()
|
||||||
|
|
||||||
|
|||||||
@@ -430,11 +430,6 @@ open class ProtoCompareGenerated(public val oldNameResolver: NameResolver, publi
|
|||||||
if (old.varargElementTypeId != new.varargElementTypeId) return false
|
if (old.varargElementTypeId != new.varargElementTypeId) return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old.hasExtension(JvmProtoBuf.index) != new.hasExtension(JvmProtoBuf.index)) return false
|
|
||||||
if (old.hasExtension(JvmProtoBuf.index)) {
|
|
||||||
if (old.getExtension(JvmProtoBuf.index) != new.getExtension(JvmProtoBuf.index)) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1123,10 +1118,6 @@ public fun ProtoBuf.ValueParameter.hashCode(stringIndexes: (Int) -> Int, fqNameI
|
|||||||
hashCode = 31 * hashCode + varargElementTypeId
|
hashCode = 31 * hashCode + varargElementTypeId
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasExtension(JvmProtoBuf.index)) {
|
|
||||||
hashCode = 31 * hashCode + getExtension(JvmProtoBuf.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
return hashCode
|
return hashCode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user