Drop 'index' JVM binary format extension

Compute the JVM parameer index manually instead
This commit is contained in:
Alexander Udalov
2015-12-24 03:13:52 +03:00
parent 8dc604ac8b
commit 39c10867a0
12 changed files with 44 additions and 105 deletions
@@ -109,11 +109,6 @@ extend TypeParameter {
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 {
repeated Annotation class_annotation = 100;
}
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.kotlin
import com.google.protobuf.MessageLite
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.load.java.JvmAbi
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.jvm.ClassMapperLite
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.JvmProtoBufUtil
import org.jetbrains.kotlin.storage.StorageManager
@@ -139,7 +139,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
): List<A> {
val methodSignature = getCallableSignature(message, container.nameResolver, container.typeTable, kind)
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)
return findClassAndLoadMemberAnnotations(container, paramSignature)
}
@@ -147,6 +147,19 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
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(
container: ProtoContainer,
message: MessageLite,
@@ -187,7 +200,8 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
}
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
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? {
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 as? ProtoContainer.Package)?.packagePartSource as? JvmPackagePartSource)?.classId
@@ -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.isRaw);
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);
}
public interface StringTableTypesOrBuilder
@@ -3802,21 +3801,6 @@ public final class JvmProtoBuf {
100,
com.google.protobuf.WireFormat.FieldType.MESSAGE,
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;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>