Don't write field signatures when not necessary

This commit is contained in:
Alexander Udalov
2015-10-07 19:42:35 +03:00
parent 864926ee2e
commit 934ffed944
10 changed files with 120 additions and 135 deletions
@@ -136,7 +136,7 @@ public class JvmSerializerExtension extends SerializerExtension {
Method syntheticMethod = bindings.get(SYNTHETIC_METHOD_FOR_PROPERTY, descriptor); Method syntheticMethod = bindings.get(SYNTHETIC_METHOD_FOR_PROPERTY, descriptor);
JvmProtoBuf.JvmPropertySignature signature = signatureSerializer.propertySignature( JvmProtoBuf.JvmPropertySignature signature = signatureSerializer.propertySignature(
fieldName, fieldDesc, isStaticInOuter, descriptor, fieldName, fieldDesc, isStaticInOuter,
syntheticMethod != null ? signatureSerializer.methodSignature(null, syntheticMethod) : null, syntheticMethod != null ? signatureSerializer.methodSignature(null, syntheticMethod) : null,
getterMethod != null ? signatureSerializer.methodSignature(null, getterMethod) : null, getterMethod != null ? signatureSerializer.methodSignature(null, getterMethod) : null,
setterMethod != null ? signatureSerializer.methodSignature(null, setterMethod) : null setterMethod != null ? signatureSerializer.methodSignature(null, setterMethod) : null
@@ -201,6 +201,10 @@ public class JvmSerializerExtension extends SerializerExtension {
return !sb.toString().equals(desc); return !sb.toString().equals(desc);
} }
private boolean requiresSignature(@NotNull PropertyDescriptor descriptor, @NotNull String desc) {
return !desc.equals(mapTypeDefault(descriptor.getType()));
}
@Nullable @Nullable
private String mapTypeDefault(@NotNull JetType type) { private String mapTypeDefault(@NotNull JetType type) {
ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor(); ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor();
@@ -226,6 +230,7 @@ public class JvmSerializerExtension extends SerializerExtension {
@NotNull @NotNull
public JvmProtoBuf.JvmPropertySignature propertySignature( public JvmProtoBuf.JvmPropertySignature propertySignature(
@NotNull PropertyDescriptor descriptor,
@Nullable String fieldName, @Nullable String fieldName,
@Nullable String fieldDesc, @Nullable String fieldDesc,
boolean isStaticInOuter, boolean isStaticInOuter,
@@ -237,7 +242,7 @@ public class JvmSerializerExtension extends SerializerExtension {
if (fieldDesc != null) { if (fieldDesc != null) {
assert fieldName != null : "Field name shouldn't be null when there's a field type: " + fieldDesc; assert fieldName != null : "Field name shouldn't be null when there's a field type: " + fieldDesc;
signature.setField(fieldSignature(fieldName, fieldDesc, isStaticInOuter)); signature.setField(fieldSignature(descriptor, fieldName, fieldDesc, isStaticInOuter));
} }
if (syntheticMethod != null) { if (syntheticMethod != null) {
@@ -255,10 +260,19 @@ public class JvmSerializerExtension extends SerializerExtension {
} }
@NotNull @NotNull
public JvmProtoBuf.JvmFieldSignature fieldSignature(@NotNull String name, @NotNull String desc, boolean isStaticInOuter) { public JvmProtoBuf.JvmFieldSignature fieldSignature(
JvmProtoBuf.JvmFieldSignature.Builder builder = JvmProtoBuf.JvmFieldSignature.newBuilder() @NotNull PropertyDescriptor descriptor,
.setName(stringTable.getStringIndex(name)) @NotNull String name,
.setDesc(stringTable.getStringIndex(desc)); @NotNull String desc,
boolean isStaticInOuter
) {
JvmProtoBuf.JvmFieldSignature.Builder builder = JvmProtoBuf.JvmFieldSignature.newBuilder();
if (!descriptor.getName().asString().equals(name)) {
builder.setName(stringTable.getStringIndex(name));
}
if (requiresSignature(descriptor, desc)) {
builder.setDesc(stringTable.getStringIndex(desc));
}
if (isStaticInOuter) { if (isStaticInOuter) {
builder.setIsStaticInOuter(true); builder.setIsStaticInOuter(true);
} }
@@ -2673,19 +2673,19 @@ public final class DebugJvmProtoBuf {
public interface JvmFieldSignatureOrBuilder public interface JvmFieldSignatureOrBuilder
extends com.google.protobuf.MessageOrBuilder { extends com.google.protobuf.MessageOrBuilder {
// required int32 name = 1; // optional int32 name = 1;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
boolean hasName(); boolean hasName();
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
int getName(); int getName();
// required int32 desc = 2; // optional int32 desc = 2;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2693,7 +2693,7 @@ public final class DebugJvmProtoBuf {
*/ */
boolean hasDesc(); boolean hasDesc();
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2827,27 +2827,27 @@ public final class DebugJvmProtoBuf {
} }
private int bitField0_; private int bitField0_;
// required int32 name = 1; // optional int32 name = 1;
public static final int NAME_FIELD_NUMBER = 1; public static final int NAME_FIELD_NUMBER = 1;
private int name_; private int name_;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public boolean hasName() { public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001); return ((bitField0_ & 0x00000001) == 0x00000001);
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public int getName() { public int getName() {
return name_; return name_;
} }
// required int32 desc = 2; // optional int32 desc = 2;
public static final int DESC_FIELD_NUMBER = 2; public static final int DESC_FIELD_NUMBER = 2;
private int desc_; private int desc_;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2857,7 +2857,7 @@ public final class DebugJvmProtoBuf {
return ((bitField0_ & 0x00000002) == 0x00000002); return ((bitField0_ & 0x00000002) == 0x00000002);
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2903,14 +2903,6 @@ public final class DebugJvmProtoBuf {
byte isInitialized = memoizedIsInitialized; byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1; if (isInitialized != -1) return isInitialized == 1;
if (!hasName()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasDesc()) {
memoizedIsInitialized = 0;
return false;
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -3140,14 +3132,6 @@ public final class DebugJvmProtoBuf {
} }
public final boolean isInitialized() { public final boolean isInitialized() {
if (!hasName()) {
return false;
}
if (!hasDesc()) {
return false;
}
return true; return true;
} }
@@ -3170,22 +3154,22 @@ public final class DebugJvmProtoBuf {
} }
private int bitField0_; private int bitField0_;
// required int32 name = 1; // optional int32 name = 1;
private int name_ ; private int name_ ;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public boolean hasName() { public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001); return ((bitField0_ & 0x00000001) == 0x00000001);
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public int getName() { public int getName() {
return name_; return name_;
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public Builder setName(int value) { public Builder setName(int value) {
bitField0_ |= 0x00000001; bitField0_ |= 0x00000001;
@@ -3194,7 +3178,7 @@ public final class DebugJvmProtoBuf {
return this; return this;
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public Builder clearName() { public Builder clearName() {
bitField0_ = (bitField0_ & ~0x00000001); bitField0_ = (bitField0_ & ~0x00000001);
@@ -3203,10 +3187,10 @@ public final class DebugJvmProtoBuf {
return this; return this;
} }
// required int32 desc = 2; // optional int32 desc = 2;
private int desc_ ; private int desc_ ;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -3216,7 +3200,7 @@ public final class DebugJvmProtoBuf {
return ((bitField0_ & 0x00000002) == 0x00000002); return ((bitField0_ & 0x00000002) == 0x00000002);
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -3226,7 +3210,7 @@ public final class DebugJvmProtoBuf {
return desc_; return desc_;
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -3239,7 +3223,7 @@ public final class DebugJvmProtoBuf {
return this; return this;
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -3641,12 +3625,6 @@ public final class DebugJvmProtoBuf {
byte isInitialized = memoizedIsInitialized; byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1; if (isInitialized != -1) return isInitialized == 1;
if (hasField()) {
if (!getField().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -3928,12 +3906,6 @@ public final class DebugJvmProtoBuf {
} }
public final boolean isInitialized() { public final boolean isInitialized() {
if (hasField()) {
if (!getField().isInitialized()) {
return false;
}
}
return true; return true;
} }
@@ -4621,8 +4593,8 @@ public final class DebugJvmProtoBuf {
"\022\030\n\024INTERNAL_TO_CLASS_ID\020\001\022\024\n\020DESC_TO_CL" + "\022\030\n\024INTERNAL_TO_CLASS_ID\020\001\022\024\n\020DESC_TO_CL" +
"ASS_ID\020\002\"<\n\022JvmMethodSignature\022\022\n\004name\030\001" + "ASS_ID\020\002\"<\n\022JvmMethodSignature\022\022\n\004name\030\001" +
" \001(\005B\004\230\265\030\001\022\022\n\004desc\030\002 \001(\005B\004\230\265\030\001\"^\n\021JvmFie" + " \001(\005B\004\230\265\030\001\022\022\n\004desc\030\002 \001(\005B\004\230\265\030\001\"^\n\021JvmFie" +
"ldSignature\022\022\n\004name\030\001 \002(\005B\004\230\265\030\001\022\022\n\004desc\030" + "ldSignature\022\022\n\004name\030\001 \001(\005B\004\230\265\030\001\022\022\n\004desc\030" +
"\002 \002(\005B\004\230\265\030\001\022!\n\022is_static_in_outer\030\003 \001(\010:" + "\002 \001(\005B\004\230\265\030\001\022!\n\022is_static_in_outer\030\003 \001(\010:" +
"\005false\"\316\002\n\024JvmPropertySignature\022H\n\005field", "\005false\"\316\002\n\024JvmPropertySignature\022H\n\005field",
"\030\001 \001(\01329.org.jetbrains.kotlin.serializat" + "\030\001 \001(\01329.org.jetbrains.kotlin.serializat" +
"ion.jvm.JvmFieldSignature\022T\n\020synthetic_m" + "ion.jvm.JvmFieldSignature\022T\n\020synthetic_m" +
@@ -69,10 +69,10 @@ message JvmMethodSignature {
} }
message JvmFieldSignature { message JvmFieldSignature {
required int32 name = 1 [(string_id_in_table) = true]; optional int32 name = 1 [(string_id_in_table) = true];
// JVM descriptor of the field type, e.g. 'Ljava/lang/String;' // JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
required int32 desc = 2 [(string_id_in_table) = true]; optional int32 desc = 2 [(string_id_in_table) = true];
// True iff this field is a backing field for a companion object and is really present as a static // True iff this field is a backing field for a companion object and is really present as a static
// field in the outer class, not as an instance field here // field in the outer class, not as an instance field here
@@ -286,11 +286,9 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C
if (proto.hasExtension(propertySignature)) proto.getExtension(propertySignature) if (proto.hasExtension(propertySignature)) proto.getExtension(propertySignature)
else return null else return null
if (field && signature.hasField()) { if (field) {
return MemberSignature.fromFieldNameAndDesc( val (name, desc) = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver) ?: return null
nameResolver.getString(signature.field.name), return MemberSignature.fromFieldNameAndDesc(name, desc)
nameResolver.getString(signature.field.desc)
)
} }
else if (synthetic && signature.hasSyntheticMethod()) { else if (synthetic && signature.hasSyntheticMethod()) {
return MemberSignature.fromMethod(nameResolver, signature.syntheticMethod) return MemberSignature.fromMethod(nameResolver, signature.syntheticMethod)
@@ -2306,19 +2306,19 @@ public final class JvmProtoBuf {
public interface JvmFieldSignatureOrBuilder public interface JvmFieldSignatureOrBuilder
extends com.google.protobuf.MessageLiteOrBuilder { extends com.google.protobuf.MessageLiteOrBuilder {
// required int32 name = 1; // optional int32 name = 1;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
boolean hasName(); boolean hasName();
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
int getName(); int getName();
// required int32 desc = 2; // optional int32 desc = 2;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2326,7 +2326,7 @@ public final class JvmProtoBuf {
*/ */
boolean hasDesc(); boolean hasDesc();
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2439,27 +2439,27 @@ public final class JvmProtoBuf {
} }
private int bitField0_; private int bitField0_;
// required int32 name = 1; // optional int32 name = 1;
public static final int NAME_FIELD_NUMBER = 1; public static final int NAME_FIELD_NUMBER = 1;
private int name_; private int name_;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public boolean hasName() { public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001); return ((bitField0_ & 0x00000001) == 0x00000001);
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public int getName() { public int getName() {
return name_; return name_;
} }
// required int32 desc = 2; // optional int32 desc = 2;
public static final int DESC_FIELD_NUMBER = 2; public static final int DESC_FIELD_NUMBER = 2;
private int desc_; private int desc_;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2469,7 +2469,7 @@ public final class JvmProtoBuf {
return ((bitField0_ & 0x00000002) == 0x00000002); return ((bitField0_ & 0x00000002) == 0x00000002);
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2515,14 +2515,6 @@ public final class JvmProtoBuf {
byte isInitialized = memoizedIsInitialized; byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1; if (isInitialized != -1) return isInitialized == 1;
if (!hasName()) {
memoizedIsInitialized = 0;
return false;
}
if (!hasDesc()) {
memoizedIsInitialized = 0;
return false;
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -2710,14 +2702,6 @@ public final class JvmProtoBuf {
} }
public final boolean isInitialized() { public final boolean isInitialized() {
if (!hasName()) {
return false;
}
if (!hasDesc()) {
return false;
}
return true; return true;
} }
@@ -2740,22 +2724,22 @@ public final class JvmProtoBuf {
} }
private int bitField0_; private int bitField0_;
// required int32 name = 1; // optional int32 name = 1;
private int name_ ; private int name_ ;
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public boolean hasName() { public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001); return ((bitField0_ & 0x00000001) == 0x00000001);
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public int getName() { public int getName() {
return name_; return name_;
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public Builder setName(int value) { public Builder setName(int value) {
bitField0_ |= 0x00000001; bitField0_ |= 0x00000001;
@@ -2764,7 +2748,7 @@ public final class JvmProtoBuf {
return this; return this;
} }
/** /**
* <code>required int32 name = 1;</code> * <code>optional int32 name = 1;</code>
*/ */
public Builder clearName() { public Builder clearName() {
bitField0_ = (bitField0_ & ~0x00000001); bitField0_ = (bitField0_ & ~0x00000001);
@@ -2773,10 +2757,10 @@ public final class JvmProtoBuf {
return this; return this;
} }
// required int32 desc = 2; // optional int32 desc = 2;
private int desc_ ; private int desc_ ;
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2786,7 +2770,7 @@ public final class JvmProtoBuf {
return ((bitField0_ & 0x00000002) == 0x00000002); return ((bitField0_ & 0x00000002) == 0x00000002);
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2796,7 +2780,7 @@ public final class JvmProtoBuf {
return desc_; return desc_;
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -2809,7 +2793,7 @@ public final class JvmProtoBuf {
return this; return this;
} }
/** /**
* <code>required int32 desc = 2;</code> * <code>optional int32 desc = 2;</code>
* *
* <pre> * <pre>
* JVM descriptor of the field type, e.g. 'Ljava/lang/String;' * JVM descriptor of the field type, e.g. 'Ljava/lang/String;'
@@ -3142,12 +3126,6 @@ public final class JvmProtoBuf {
byte isInitialized = memoizedIsInitialized; byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1; if (isInitialized != -1) return isInitialized == 1;
if (hasField()) {
if (!getField().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -3351,12 +3329,6 @@ public final class JvmProtoBuf {
} }
public final boolean isInitialized() { public final boolean isInitialized() {
if (hasField()) {
if (!getField().isInitialized()) {
return false;
}
}
return true; return true;
} }
@@ -93,6 +93,22 @@ public object JvmProtoBufUtil {
return "<init>" + desc return "<init>" + desc
} }
fun getJvmFieldSignature(proto: ProtoBuf.Property, nameResolver: NameResolver): PropertySignature? {
val signature =
if (proto.hasExtension(JvmProtoBuf.propertySignature)) proto.getExtension(JvmProtoBuf.propertySignature) else return null
val field =
if (signature.hasField()) signature.field else null
val name = if (field != null && field.hasName()) field.name else proto.name
val desc =
if (field != null && field.hasDesc()) nameResolver.getString(field.desc)
else mapTypeDefault(proto.returnType, nameResolver) ?: return null
return PropertySignature(nameResolver.getString(name), desc)
}
data class PropertySignature(val name: String, val desc: String)
private fun mapTypeDefault(type: ProtoBuf.Type, nameResolver: NameResolver): String? { private fun mapTypeDefault(type: ProtoBuf.Type, nameResolver: NameResolver): String? {
return if (type.hasClassName()) mapClassIdDefault(nameResolver.getClassId(type.className)) else null return if (type.hasClassName()) mapClassIdDefault(nameResolver.getClassId(type.className)) else null
} }
@@ -17,6 +17,7 @@
package kotlin.reflect.jvm.internal package kotlin.reflect.jvm.internal
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import java.lang.reflect.Field import java.lang.reflect.Field
import kotlin.reflect.jvm.internal.JvmPropertySignature.JavaField import kotlin.reflect.jvm.internal.JvmPropertySignature.JavaField
import kotlin.reflect.jvm.internal.JvmPropertySignature.KotlinProperty import kotlin.reflect.jvm.internal.JvmPropertySignature.KotlinProperty
@@ -46,8 +47,9 @@ internal abstract class DescriptorBasedProperty<out R> protected constructor(
val jvmSignature = RuntimeTypeMapper.mapPropertySignature(descriptor) val jvmSignature = RuntimeTypeMapper.mapPropertySignature(descriptor)
when (jvmSignature) { when (jvmSignature) {
is KotlinProperty -> { is KotlinProperty -> {
if (!jvmSignature.signature.hasField()) null JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver)?.let {
else container.findFieldBySignature(jvmSignature.proto, jvmSignature.signature.field, jvmSignature.nameResolver) container.findFieldBySignature(jvmSignature.proto, jvmSignature.nameResolver, it.name)
}
} }
is JavaField -> jvmSignature.field is JavaField -> jvmSignature.field
} }
@@ -240,17 +240,14 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain
// TODO: check resulting field's type // TODO: check resulting field's type
fun findFieldBySignature( fun findFieldBySignature(
proto: ProtoBuf.Property, proto: ProtoBuf.Property,
signature: JvmProtoBuf.JvmFieldSignature, nameResolver: NameResolver,
nameResolver: NameResolver name: String
): Field? { ): Field? {
val name = nameResolver.getString(signature.getName()) val owner = implClassForCallable(nameResolver, proto) ?:
if (proto.hasExtension(JvmProtoBuf.propertySignature) &&
val owner = proto.getExtension(JvmProtoBuf.propertySignature).let { it.hasField() && it.field.getIsStaticInOuter() }) {
implClassForCallable(nameResolver, proto) ?: jClass.enclosingClass ?: throw KotlinReflectionInternalError("Inconsistent metadata for field $name in $jClass")
if (signature.getIsStaticInOuter()) { } else jClass
jClass.getEnclosingClass() ?: throw KotlinReflectionInternalError("Inconsistent metadata for field $name in $jClass")
}
else jClass
return try { return try {
owner.getDeclaredField(name) owner.getDeclaredField(name)
@@ -92,6 +92,7 @@ internal sealed class JvmPropertySignature {
abstract fun asString(): String abstract fun asString(): String
class KotlinProperty( class KotlinProperty(
val descriptor: PropertyDescriptor,
val proto: ProtoBuf.Property, val proto: ProtoBuf.Property,
val signature: JvmProtoBuf.JvmPropertySignature, val signature: JvmProtoBuf.JvmPropertySignature,
val nameResolver: NameResolver val nameResolver: NameResolver
@@ -103,9 +104,10 @@ internal sealed class JvmPropertySignature {
string = nameResolver.getString(signature.getter.name) + nameResolver.getString(signature.getter.desc) string = nameResolver.getString(signature.getter.name) + nameResolver.getString(signature.getter.desc)
} }
else { else {
string = JvmAbi.getterName(nameResolver.getString(signature.field.name)) + val (name, desc) =
"()" + JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver) ?:
nameResolver.getString(signature.field.desc) throw KotlinReflectionInternalError("No field signature for property: $descriptor")
string = JvmAbi.getterName(name) + "()" + desc
} }
} }
@@ -170,7 +172,9 @@ internal object RuntimeTypeMapper {
if (!proto.hasExtension(JvmProtoBuf.propertySignature)) { if (!proto.hasExtension(JvmProtoBuf.propertySignature)) {
throw KotlinReflectionInternalError("No metadata found for $property") throw KotlinReflectionInternalError("No metadata found for $property")
} }
return JvmPropertySignature.KotlinProperty(proto, proto.getExtension(JvmProtoBuf.propertySignature), property.nameResolver) return JvmPropertySignature.KotlinProperty(
property, proto, proto.getExtension(JvmProtoBuf.propertySignature), property.nameResolver
)
} }
else if (property is JavaPropertyDescriptor) { else if (property is JavaPropertyDescriptor) {
val field = ((property.source as? JavaSourceElement)?.javaElement as? ReflectJavaField)?.member ?: val field = ((property.source as? JavaSourceElement)?.javaElement as? ReflectJavaField)?.member ?:
@@ -390,9 +390,15 @@ open class ProtoCompareGenerated(public val oldNameResolver: NameResolver, publi
} }
open fun checkEquals(old: JvmProtoBuf.JvmFieldSignature, new: JvmProtoBuf.JvmFieldSignature): Boolean { open fun checkEquals(old: JvmProtoBuf.JvmFieldSignature, new: JvmProtoBuf.JvmFieldSignature): Boolean {
if (!checkStringEquals(old.name, new.name)) return false if (old.hasName() != new.hasName()) return false
if (old.hasName()) {
if (!checkStringEquals(old.name, new.name)) return false
}
if (!checkStringEquals(old.desc, new.desc)) return false if (old.hasDesc() != new.hasDesc()) return false
if (old.hasDesc()) {
if (!checkStringEquals(old.desc, new.desc)) return false
}
if (old.hasIsStaticInOuter() != new.hasIsStaticInOuter()) return false if (old.hasIsStaticInOuter() != new.hasIsStaticInOuter()) return false
if (old.hasIsStaticInOuter()) { if (old.hasIsStaticInOuter()) {
@@ -962,9 +968,13 @@ public fun ProtoBuf.Annotation.Argument.hashCode(stringIndexes: (Int) -> Int, fq
public fun JvmProtoBuf.JvmFieldSignature.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> Int): Int { public fun JvmProtoBuf.JvmFieldSignature.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> Int): Int {
var hashCode = 1 var hashCode = 1
hashCode = 31 * hashCode + stringIndexes(name) if (hasName()) {
hashCode = 31 * hashCode + stringIndexes(name)
}
hashCode = 31 * hashCode + stringIndexes(desc) if (hasDesc()) {
hashCode = 31 * hashCode + stringIndexes(desc)
}
if (hasIsStaticInOuter()) { if (hasIsStaticInOuter()) {
hashCode = 31 * hashCode + isStaticInOuter.hashCode() hashCode = 31 * hashCode + isStaticInOuter.hashCode()