31 package com.google.protobuf;
40 final class FieldInfo
implements Comparable<FieldInfo> {
43 private final Class<?> messageClass;
44 private final int fieldNumber;
45 private final Field presenceField;
46 private final int presenceMask;
47 private final boolean required;
48 private final boolean enforceUtf8;
49 private final OneofInfo oneof;
50 private final Field cachedSizeField;
56 private final Class<?> oneofStoredType;
59 private final Object mapDefaultEntry;
61 private final EnumVerifier enumVerifier;
64 public static FieldInfo forField(
66 checkFieldNumber(fieldNumber);
67 checkNotNull(
field,
"field");
68 checkNotNull(fieldType,
"fieldType");
70 throw new IllegalStateException(
"Shouldn't be called for repeated message fields.");
89 public static FieldInfo forPackedField(
91 checkFieldNumber(fieldNumber);
92 checkNotNull(
field,
"field");
93 checkNotNull(fieldType,
"fieldType");
95 throw new IllegalStateException(
"Shouldn't be called for repeated message fields.");
114 public static FieldInfo forRepeatedMessageField(
116 checkFieldNumber(fieldNumber);
117 checkNotNull(
field,
"field");
118 checkNotNull(fieldType,
"fieldType");
119 checkNotNull(messageClass,
"messageClass");
120 return new FieldInfo(
136 public static FieldInfo forFieldWithEnumVerifier(
138 checkFieldNumber(fieldNumber);
139 checkNotNull(
field,
"field");
140 return new FieldInfo(
156 public static FieldInfo forPackedFieldWithEnumVerifier(
160 EnumVerifier enumVerifier,
161 Field cachedSizeField) {
162 checkFieldNumber(fieldNumber);
163 checkNotNull(
field,
"field");
164 return new FieldInfo(
181 public static FieldInfo forProto2OptionalField(
188 EnumVerifier enumVerifier) {
189 checkFieldNumber(fieldNumber);
190 checkNotNull(
field,
"field");
191 checkNotNull(fieldType,
"fieldType");
192 checkNotNull(presenceField,
"presenceField");
193 if (presenceField !=
null && !isExactlyOneBitSet(presenceMask)) {
194 throw new IllegalArgumentException(
195 "presenceMask must have exactly one bit set: " + presenceMask);
197 return new FieldInfo(
225 public static FieldInfo forOneofMemberField(
229 Class<?> oneofStoredType,
231 EnumVerifier enumVerifier) {
232 checkFieldNumber(fieldNumber);
233 checkNotNull(fieldType,
"fieldType");
234 checkNotNull(oneof,
"oneof");
235 checkNotNull(oneofStoredType,
"oneofStoredType");
236 if (!fieldType.isScalar()) {
237 throw new IllegalArgumentException(
238 "Oneof is only supported for scalar fields. Field "
243 return new FieldInfo(
259 private static void checkFieldNumber(
int fieldNumber) {
260 if (fieldNumber <= 0) {
261 throw new IllegalArgumentException(
"fieldNumber must be positive: " + fieldNumber);
266 public static FieldInfo forProto2RequiredField(
273 EnumVerifier enumVerifier) {
274 checkFieldNumber(fieldNumber);
275 checkNotNull(
field,
"field");
276 checkNotNull(fieldType,
"fieldType");
277 checkNotNull(presenceField,
"presenceField");
278 if (presenceField !=
null && !isExactlyOneBitSet(presenceMask)) {
279 throw new IllegalArgumentException(
280 "presenceMask must have exactly one bit set: " + presenceMask);
282 return new FieldInfo(
298 public static FieldInfo forMapField(
299 Field field,
int fieldNumber, Object mapDefaultEntry, EnumVerifier enumVerifier) {
300 checkNotNull(mapDefaultEntry,
"mapDefaultEntry");
301 checkFieldNumber(fieldNumber);
302 checkNotNull(
field,
"field");
303 return new FieldInfo(
323 Class<?> messageClass,
329 Class<?> oneofStoredType,
330 Object mapDefaultEntry,
331 EnumVerifier enumVerifier,
332 Field cachedSizeField) {
335 this.messageClass = messageClass;
336 this.fieldNumber = fieldNumber;
337 this.presenceField = presenceField;
338 this.presenceMask = presenceMask;
339 this.required = required;
340 this.enforceUtf8 = enforceUtf8;
342 this.oneofStoredType = oneofStoredType;
343 this.mapDefaultEntry = mapDefaultEntry;
344 this.enumVerifier = enumVerifier;
345 this.cachedSizeField = cachedSizeField;
349 public int getFieldNumber() {
354 public Field getField() {
364 public OneofInfo getOneof() {
373 public Class<?> getOneofStoredType() {
374 return oneofStoredType;
378 public EnumVerifier getEnumVerifier() {
383 public int compareTo(FieldInfo o) {
384 return fieldNumber - o.fieldNumber;
391 public Class<?> getListElementType() {
396 public Field getPresenceField() {
397 return presenceField;
400 public Object getMapDefaultEntry() {
401 return mapDefaultEntry;
408 public int getPresenceMask() {
413 public boolean isRequired() {
420 public boolean isEnforceUtf8() {
424 public Field getCachedSizeField() {
425 return cachedSizeField;
432 public Class<?> getMessageFieldClass() {
436 return field !=
null ?
field.getType() : oneofStoredType;
445 public static Builder newBuilder() {
472 throw new IllegalStateException(
"Cannot set field when building a oneof.");
492 this.presenceField = checkNotNull(
presenceField,
"presenceField");
507 throw new IllegalStateException(
508 "Cannot set oneof when field or presenceField have been provided");
542 return forOneofMemberField(
550 return forProto2RequiredField(
553 return forProto2OptionalField(
561 return forPackedFieldWithEnumVerifier(
574 private static boolean isExactlyOneBitSet(
int value) {