Do not fail on unknown visibilities, modalities, etc in deserialization
Provide some sensible defaults like "private", "final", "class" instead, which will give us a small possibility to not break the format if a new modality/visibility/... is introduced in the case when the old compiler may safely consider it as the default one
This commit is contained in:
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.serialization;
|
|||||||
|
|
||||||
import com.google.protobuf.Internal;
|
import com.google.protobuf.Internal;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
|
|
||||||
public class Flags {
|
public class Flags {
|
||||||
@@ -25,49 +26,49 @@ public class Flags {
|
|||||||
|
|
||||||
// Common
|
// Common
|
||||||
|
|
||||||
public static final FlagField<Boolean> HAS_ANNOTATIONS = FlagField.booleanFirst();
|
public static final BooleanFlagField HAS_ANNOTATIONS = FlagField.booleanFirst();
|
||||||
public static final FlagField<ProtoBuf.Visibility> VISIBILITY = FlagField.after(HAS_ANNOTATIONS, ProtoBuf.Visibility.values());
|
public static final FlagField<ProtoBuf.Visibility> VISIBILITY = FlagField.after(HAS_ANNOTATIONS, ProtoBuf.Visibility.values());
|
||||||
public static final FlagField<ProtoBuf.Modality> MODALITY = FlagField.after(VISIBILITY, ProtoBuf.Modality.values());
|
public static final FlagField<ProtoBuf.Modality> MODALITY = FlagField.after(VISIBILITY, ProtoBuf.Modality.values());
|
||||||
|
|
||||||
// Class
|
// Class
|
||||||
|
|
||||||
public static final FlagField<ProtoBuf.Class.Kind> CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values());
|
public static final FlagField<ProtoBuf.Class.Kind> CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values());
|
||||||
public static final FlagField<Boolean> IS_INNER = FlagField.booleanAfter(CLASS_KIND);
|
public static final BooleanFlagField IS_INNER = FlagField.booleanAfter(CLASS_KIND);
|
||||||
|
|
||||||
// Callables
|
// Callables
|
||||||
|
|
||||||
// TODO: use these flags
|
// TODO: use these flags
|
||||||
public static final FlagField<Boolean> RESERVED_1 = FlagField.booleanAfter(MODALITY);
|
public static final BooleanFlagField RESERVED_1 = FlagField.booleanAfter(MODALITY);
|
||||||
public static final FlagField<Boolean> RESERVED_2 = FlagField.booleanAfter(RESERVED_1);
|
public static final BooleanFlagField RESERVED_2 = FlagField.booleanAfter(RESERVED_1);
|
||||||
|
|
||||||
public static final FlagField<ProtoBuf.MemberKind> MEMBER_KIND = FlagField.after(RESERVED_2, ProtoBuf.MemberKind.values());
|
public static final FlagField<ProtoBuf.MemberKind> MEMBER_KIND = FlagField.after(RESERVED_2, ProtoBuf.MemberKind.values());
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
public static final FlagField<Boolean> IS_SECONDARY = FlagField.booleanAfter(VISIBILITY);
|
public static final BooleanFlagField IS_SECONDARY = FlagField.booleanAfter(VISIBILITY);
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|
||||||
public static final FlagField<Boolean> IS_OPERATOR = FlagField.booleanAfter(MEMBER_KIND);
|
public static final BooleanFlagField IS_OPERATOR = FlagField.booleanAfter(MEMBER_KIND);
|
||||||
public static final FlagField<Boolean> IS_INFIX = FlagField.booleanAfter(IS_OPERATOR);
|
public static final BooleanFlagField IS_INFIX = FlagField.booleanAfter(IS_OPERATOR);
|
||||||
|
|
||||||
// Properties
|
// Properties
|
||||||
|
|
||||||
public static final FlagField<Boolean> IS_VAR = FlagField.booleanAfter(MEMBER_KIND);
|
public static final BooleanFlagField IS_VAR = FlagField.booleanAfter(MEMBER_KIND);
|
||||||
public static final FlagField<Boolean> HAS_GETTER = FlagField.booleanAfter(IS_VAR);
|
public static final BooleanFlagField HAS_GETTER = FlagField.booleanAfter(IS_VAR);
|
||||||
public static final FlagField<Boolean> HAS_SETTER = FlagField.booleanAfter(HAS_GETTER);
|
public static final BooleanFlagField HAS_SETTER = FlagField.booleanAfter(HAS_GETTER);
|
||||||
public static final FlagField<Boolean> IS_CONST = FlagField.booleanAfter(HAS_SETTER);
|
public static final BooleanFlagField IS_CONST = FlagField.booleanAfter(HAS_SETTER);
|
||||||
public static final FlagField<Boolean> IS_LATEINIT = FlagField.booleanAfter(IS_CONST);
|
public static final BooleanFlagField IS_LATEINIT = FlagField.booleanAfter(IS_CONST);
|
||||||
public static final FlagField<Boolean> HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT);
|
public static final BooleanFlagField HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT);
|
||||||
|
|
||||||
// Parameters
|
// Parameters
|
||||||
|
|
||||||
public static final FlagField<Boolean> DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS);
|
public static final BooleanFlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS);
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
|
|
||||||
// It's important that this flag is negated: "is NOT default" instead of "is default"
|
// It's important that this flag is negated: "is NOT default" instead of "is default"
|
||||||
public static final FlagField<Boolean> IS_NOT_DEFAULT = FlagField.booleanAfter(MODALITY);
|
public static final BooleanFlagField IS_NOT_DEFAULT = FlagField.booleanAfter(MODALITY);
|
||||||
|
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
@@ -253,11 +254,11 @@ public class Flags {
|
|||||||
return new EnumLiteFlagField<E>(0, values);
|
return new EnumLiteFlagField<E>(0, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FlagField<Boolean> booleanFirst() {
|
public static BooleanFlagField booleanFirst() {
|
||||||
return new BooleanFlagField(0);
|
return new BooleanFlagField(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FlagField<Boolean> booleanAfter(FlagField<?> previousField) {
|
public static BooleanFlagField booleanAfter(FlagField<?> previousField) {
|
||||||
int offset = previousField.offset + previousField.bitWidth;
|
int offset = previousField.offset + previousField.bitWidth;
|
||||||
return new BooleanFlagField(offset);
|
return new BooleanFlagField(offset);
|
||||||
}
|
}
|
||||||
@@ -272,6 +273,7 @@ public class Flags {
|
|||||||
this.values = values;
|
this.values = values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
public E get(int flags) {
|
public E get(int flags) {
|
||||||
int maskUnshifted = (1 << bitWidth) - 1;
|
int maskUnshifted = (1 << bitWidth) - 1;
|
||||||
int mask = maskUnshifted << offset;
|
int mask = maskUnshifted << offset;
|
||||||
@@ -281,7 +283,7 @@ public class Flags {
|
|||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalStateException("Flag not found: " + value);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int toFlags(E value) {
|
public int toFlags(E value) {
|
||||||
@@ -292,7 +294,7 @@ public class Flags {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class BooleanFlagField extends FlagField<Boolean> {
|
public static class BooleanFlagField extends FlagField<Boolean> {
|
||||||
private static final Boolean[] BOOLEAN = { false, true };
|
private static final Boolean[] BOOLEAN = { false, true };
|
||||||
|
|
||||||
public BooleanFlagField(int offset) {
|
public BooleanFlagField(int offset) {
|
||||||
@@ -303,6 +305,13 @@ public class Flags {
|
|||||||
protected int getIntValue(Boolean value) {
|
protected int getIntValue(Boolean value) {
|
||||||
return value ? 1 : 0;
|
return value ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Boolean get(int flags) {
|
||||||
|
//noinspection ConstantConditions
|
||||||
|
return super.get(flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class EnumLiteFlagField<E extends Internal.EnumLite> extends FlagField<E> {
|
private static class EnumLiteFlagField<E extends Internal.EnumLite> extends FlagField<E> {
|
||||||
|
|||||||
+13
-6
@@ -26,39 +26,43 @@ import org.jetbrains.kotlin.types.Variance
|
|||||||
|
|
||||||
object Deserialization {
|
object Deserialization {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun memberKind(memberKind: ProtoBuf.MemberKind) = when (memberKind) {
|
fun memberKind(memberKind: ProtoBuf.MemberKind?) = when (memberKind) {
|
||||||
ProtoBuf.MemberKind.DECLARATION -> CallableMemberDescriptor.Kind.DECLARATION
|
ProtoBuf.MemberKind.DECLARATION -> CallableMemberDescriptor.Kind.DECLARATION
|
||||||
ProtoBuf.MemberKind.FAKE_OVERRIDE -> CallableMemberDescriptor.Kind.FAKE_OVERRIDE
|
ProtoBuf.MemberKind.FAKE_OVERRIDE -> CallableMemberDescriptor.Kind.FAKE_OVERRIDE
|
||||||
ProtoBuf.MemberKind.DELEGATION -> CallableMemberDescriptor.Kind.DELEGATION
|
ProtoBuf.MemberKind.DELEGATION -> CallableMemberDescriptor.Kind.DELEGATION
|
||||||
ProtoBuf.MemberKind.SYNTHESIZED -> CallableMemberDescriptor.Kind.SYNTHESIZED
|
ProtoBuf.MemberKind.SYNTHESIZED -> CallableMemberDescriptor.Kind.SYNTHESIZED
|
||||||
|
else -> CallableMemberDescriptor.Kind.DECLARATION
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun modality(modality: ProtoBuf.Modality) = when (modality) {
|
fun modality(modality: ProtoBuf.Modality?) = when (modality) {
|
||||||
ProtoBuf.Modality.FINAL -> Modality.FINAL
|
ProtoBuf.Modality.FINAL -> Modality.FINAL
|
||||||
ProtoBuf.Modality.OPEN -> Modality.OPEN
|
ProtoBuf.Modality.OPEN -> Modality.OPEN
|
||||||
ProtoBuf.Modality.ABSTRACT -> Modality.ABSTRACT
|
ProtoBuf.Modality.ABSTRACT -> Modality.ABSTRACT
|
||||||
ProtoBuf.Modality.SEALED -> Modality.SEALED
|
ProtoBuf.Modality.SEALED -> Modality.SEALED
|
||||||
|
else -> Modality.FINAL
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun visibility(visibility: ProtoBuf.Visibility) = when (visibility) {
|
fun visibility(visibility: ProtoBuf.Visibility?) = when (visibility) {
|
||||||
ProtoBuf.Visibility.INTERNAL -> Visibilities.INTERNAL
|
ProtoBuf.Visibility.INTERNAL -> Visibilities.INTERNAL
|
||||||
ProtoBuf.Visibility.PRIVATE -> Visibilities.PRIVATE
|
ProtoBuf.Visibility.PRIVATE -> Visibilities.PRIVATE
|
||||||
ProtoBuf.Visibility.PRIVATE_TO_THIS -> Visibilities.PRIVATE_TO_THIS
|
ProtoBuf.Visibility.PRIVATE_TO_THIS -> Visibilities.PRIVATE_TO_THIS
|
||||||
ProtoBuf.Visibility.PROTECTED -> Visibilities.PROTECTED
|
ProtoBuf.Visibility.PROTECTED -> Visibilities.PROTECTED
|
||||||
ProtoBuf.Visibility.PUBLIC -> Visibilities.PUBLIC
|
ProtoBuf.Visibility.PUBLIC -> Visibilities.PUBLIC
|
||||||
ProtoBuf.Visibility.LOCAL -> Visibilities.LOCAL
|
ProtoBuf.Visibility.LOCAL -> Visibilities.LOCAL
|
||||||
|
else -> Visibilities.PRIVATE
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun classKind(kind: ProtoBuf.Class.Kind): ClassKind = when (kind) {
|
fun classKind(kind: ProtoBuf.Class.Kind?): ClassKind = when (kind) {
|
||||||
ProtoBuf.Class.Kind.CLASS -> ClassKind.CLASS
|
ProtoBuf.Class.Kind.CLASS -> ClassKind.CLASS
|
||||||
ProtoBuf.Class.Kind.INTERFACE -> ClassKind.INTERFACE
|
ProtoBuf.Class.Kind.INTERFACE -> ClassKind.INTERFACE
|
||||||
ProtoBuf.Class.Kind.ENUM_CLASS -> ClassKind.ENUM_CLASS
|
ProtoBuf.Class.Kind.ENUM_CLASS -> ClassKind.ENUM_CLASS
|
||||||
ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY
|
ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY
|
||||||
ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS
|
ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS
|
||||||
ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.COMPANION_OBJECT -> ClassKind.OBJECT
|
ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.COMPANION_OBJECT -> ClassKind.OBJECT
|
||||||
|
else -> ClassKind.CLASS
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -66,6 +70,7 @@ object Deserialization {
|
|||||||
ProtoBuf.TypeParameter.Variance.IN -> Variance.IN_VARIANCE
|
ProtoBuf.TypeParameter.Variance.IN -> Variance.IN_VARIANCE
|
||||||
ProtoBuf.TypeParameter.Variance.OUT -> Variance.OUT_VARIANCE
|
ProtoBuf.TypeParameter.Variance.OUT -> Variance.OUT_VARIANCE
|
||||||
ProtoBuf.TypeParameter.Variance.INV -> Variance.INVARIANT
|
ProtoBuf.TypeParameter.Variance.INV -> Variance.INVARIANT
|
||||||
|
else -> Variance.INVARIANT
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -73,6 +78,8 @@ object Deserialization {
|
|||||||
ProtoBuf.Type.Argument.Projection.IN -> Variance.IN_VARIANCE
|
ProtoBuf.Type.Argument.Projection.IN -> Variance.IN_VARIANCE
|
||||||
ProtoBuf.Type.Argument.Projection.OUT -> Variance.OUT_VARIANCE
|
ProtoBuf.Type.Argument.Projection.OUT -> Variance.OUT_VARIANCE
|
||||||
ProtoBuf.Type.Argument.Projection.INV -> Variance.INVARIANT
|
ProtoBuf.Type.Argument.Projection.INV -> Variance.INVARIANT
|
||||||
else -> throw IllegalArgumentException("Only IN, OUT and INV are supported. Actual argument: $variance")
|
ProtoBuf.Type.Argument.Projection.STAR ->
|
||||||
|
throw IllegalArgumentException("Only IN, OUT and INV are supported. Actual argument: $variance")
|
||||||
|
else -> Variance.INVARIANT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user