diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java index 37fec0ade8c..1cba157e892 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.serialization; import com.google.protobuf.Internal; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; public class Flags { @@ -25,49 +26,49 @@ public class Flags { // Common - public static final FlagField HAS_ANNOTATIONS = FlagField.booleanFirst(); + public static final BooleanFlagField HAS_ANNOTATIONS = FlagField.booleanFirst(); public static final FlagField VISIBILITY = FlagField.after(HAS_ANNOTATIONS, ProtoBuf.Visibility.values()); public static final FlagField MODALITY = FlagField.after(VISIBILITY, ProtoBuf.Modality.values()); // Class public static final FlagField CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values()); - public static final FlagField IS_INNER = FlagField.booleanAfter(CLASS_KIND); + public static final BooleanFlagField IS_INNER = FlagField.booleanAfter(CLASS_KIND); // Callables // TODO: use these flags - public static final FlagField RESERVED_1 = FlagField.booleanAfter(MODALITY); - public static final FlagField RESERVED_2 = FlagField.booleanAfter(RESERVED_1); + public static final BooleanFlagField RESERVED_1 = FlagField.booleanAfter(MODALITY); + public static final BooleanFlagField RESERVED_2 = FlagField.booleanAfter(RESERVED_1); public static final FlagField MEMBER_KIND = FlagField.after(RESERVED_2, ProtoBuf.MemberKind.values()); // Constructors - public static final FlagField IS_SECONDARY = FlagField.booleanAfter(VISIBILITY); + public static final BooleanFlagField IS_SECONDARY = FlagField.booleanAfter(VISIBILITY); // Functions - public static final FlagField IS_OPERATOR = FlagField.booleanAfter(MEMBER_KIND); - public static final FlagField IS_INFIX = FlagField.booleanAfter(IS_OPERATOR); + public static final BooleanFlagField IS_OPERATOR = FlagField.booleanAfter(MEMBER_KIND); + public static final BooleanFlagField IS_INFIX = FlagField.booleanAfter(IS_OPERATOR); // Properties - public static final FlagField IS_VAR = FlagField.booleanAfter(MEMBER_KIND); - public static final FlagField HAS_GETTER = FlagField.booleanAfter(IS_VAR); - public static final FlagField HAS_SETTER = FlagField.booleanAfter(HAS_GETTER); - public static final FlagField IS_CONST = FlagField.booleanAfter(HAS_SETTER); - public static final FlagField IS_LATEINIT = FlagField.booleanAfter(IS_CONST); - public static final FlagField HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT); + public static final BooleanFlagField IS_VAR = FlagField.booleanAfter(MEMBER_KIND); + public static final BooleanFlagField HAS_GETTER = FlagField.booleanAfter(IS_VAR); + public static final BooleanFlagField HAS_SETTER = FlagField.booleanAfter(HAS_GETTER); + public static final BooleanFlagField IS_CONST = FlagField.booleanAfter(HAS_SETTER); + public static final BooleanFlagField IS_LATEINIT = FlagField.booleanAfter(IS_CONST); + public static final BooleanFlagField HAS_CONSTANT = FlagField.booleanAfter(IS_LATEINIT); // Parameters - public static final FlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); + public static final BooleanFlagField DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS); // Accessors // It's important that this flag is negated: "is NOT default" instead of "is default" - public static final FlagField 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(0, values); } - public static FlagField booleanFirst() { + public static BooleanFlagField booleanFirst() { return new BooleanFlagField(0); } - public static FlagField booleanAfter(FlagField previousField) { + public static BooleanFlagField booleanAfter(FlagField previousField) { int offset = previousField.offset + previousField.bitWidth; return new BooleanFlagField(offset); } @@ -272,6 +273,7 @@ public class Flags { this.values = values; } + @Nullable public E get(int flags) { int maskUnshifted = (1 << bitWidth) - 1; int mask = maskUnshifted << offset; @@ -281,7 +283,7 @@ public class Flags { return e; } } - throw new IllegalStateException("Flag not found: " + value); + return null; } public int toFlags(E value) { @@ -292,7 +294,7 @@ public class Flags { } - private static class BooleanFlagField extends FlagField { + public static class BooleanFlagField extends FlagField { private static final Boolean[] BOOLEAN = { false, true }; public BooleanFlagField(int offset) { @@ -303,6 +305,13 @@ public class Flags { protected int getIntValue(Boolean value) { return value ? 1 : 0; } + + @NotNull + @Override + public Boolean get(int flags) { + //noinspection ConstantConditions + return super.get(flags); + } } private static class EnumLiteFlagField extends FlagField { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt index a0f1cbf0d2d..f0030c3b56e 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/protoEnumMapping.kt @@ -26,39 +26,43 @@ import org.jetbrains.kotlin.types.Variance object Deserialization { @JvmStatic - fun memberKind(memberKind: ProtoBuf.MemberKind) = when (memberKind) { + fun memberKind(memberKind: ProtoBuf.MemberKind?) = when (memberKind) { ProtoBuf.MemberKind.DECLARATION -> CallableMemberDescriptor.Kind.DECLARATION ProtoBuf.MemberKind.FAKE_OVERRIDE -> CallableMemberDescriptor.Kind.FAKE_OVERRIDE ProtoBuf.MemberKind.DELEGATION -> CallableMemberDescriptor.Kind.DELEGATION ProtoBuf.MemberKind.SYNTHESIZED -> CallableMemberDescriptor.Kind.SYNTHESIZED + else -> CallableMemberDescriptor.Kind.DECLARATION } @JvmStatic - fun modality(modality: ProtoBuf.Modality) = when (modality) { + fun modality(modality: ProtoBuf.Modality?) = when (modality) { ProtoBuf.Modality.FINAL -> Modality.FINAL ProtoBuf.Modality.OPEN -> Modality.OPEN ProtoBuf.Modality.ABSTRACT -> Modality.ABSTRACT ProtoBuf.Modality.SEALED -> Modality.SEALED + else -> Modality.FINAL } @JvmStatic - fun visibility(visibility: ProtoBuf.Visibility) = when (visibility) { + fun visibility(visibility: ProtoBuf.Visibility?) = when (visibility) { ProtoBuf.Visibility.INTERNAL -> Visibilities.INTERNAL ProtoBuf.Visibility.PRIVATE -> Visibilities.PRIVATE ProtoBuf.Visibility.PRIVATE_TO_THIS -> Visibilities.PRIVATE_TO_THIS ProtoBuf.Visibility.PROTECTED -> Visibilities.PROTECTED ProtoBuf.Visibility.PUBLIC -> Visibilities.PUBLIC ProtoBuf.Visibility.LOCAL -> Visibilities.LOCAL + else -> Visibilities.PRIVATE } @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.INTERFACE -> ClassKind.INTERFACE ProtoBuf.Class.Kind.ENUM_CLASS -> ClassKind.ENUM_CLASS ProtoBuf.Class.Kind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY ProtoBuf.Class.Kind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.COMPANION_OBJECT -> ClassKind.OBJECT + else -> ClassKind.CLASS } @JvmStatic @@ -66,6 +70,7 @@ object Deserialization { ProtoBuf.TypeParameter.Variance.IN -> Variance.IN_VARIANCE ProtoBuf.TypeParameter.Variance.OUT -> Variance.OUT_VARIANCE ProtoBuf.TypeParameter.Variance.INV -> Variance.INVARIANT + else -> Variance.INVARIANT } @JvmStatic @@ -73,6 +78,8 @@ object Deserialization { ProtoBuf.Type.Argument.Projection.IN -> Variance.IN_VARIANCE ProtoBuf.Type.Argument.Projection.OUT -> Variance.OUT_VARIANCE 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 } -} \ No newline at end of file +}