diff options
Diffstat (limited to 'java/core/src/main/java/com/google/protobuf/FieldType.java')
-rw-r--r-- | java/core/src/main/java/com/google/protobuf/FieldType.java | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/java/core/src/main/java/com/google/protobuf/FieldType.java b/java/core/src/main/java/com/google/protobuf/FieldType.java new file mode 100644 index 00000000..1e368c11 --- /dev/null +++ b/java/core/src/main/java/com/google/protobuf/FieldType.java @@ -0,0 +1,535 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.util.List; + +/** + * Enumeration identifying all relevant type information for a protobuf field. + */ +@ExperimentalApi +public enum FieldType { + DOUBLE(0, Collection.SCALAR, JavaType.DOUBLE, JavaType.VOID), + FLOAT(1, Collection.SCALAR, JavaType.FLOAT, JavaType.VOID), + INT64(2, Collection.SCALAR, JavaType.LONG, JavaType.VOID), + UINT64(3, Collection.SCALAR, JavaType.LONG, JavaType.VOID), + INT32(4, Collection.SCALAR, JavaType.INT, JavaType.VOID), + FIXED64(5, Collection.SCALAR, JavaType.LONG, JavaType.VOID), + FIXED32(6, Collection.SCALAR, JavaType.INT, JavaType.VOID), + BOOL(7, Collection.SCALAR, JavaType.BOOLEAN, JavaType.VOID), + STRING(8, Collection.SCALAR, JavaType.STRING, JavaType.VOID), + MESSAGE(9, Collection.SCALAR, JavaType.MESSAGE, JavaType.VOID), + BYTES(10, Collection.SCALAR, JavaType.BYTE_STRING, JavaType.VOID), + UINT32(11, Collection.SCALAR, JavaType.INT, JavaType.VOID), + ENUM(12, Collection.SCALAR, JavaType.ENUM, JavaType.VOID), + SFIXED32(13, Collection.SCALAR, JavaType.INT, JavaType.VOID), + SFIXED64(14, Collection.SCALAR, JavaType.LONG, JavaType.VOID), + SINT32(15, Collection.SCALAR, JavaType.INT, JavaType.VOID), + SINT64(16, Collection.SCALAR, JavaType.LONG, JavaType.VOID), + DOUBLE_LIST(17, Collection.VECTOR, JavaType.DOUBLE, JavaType.VOID), + FLOAT_LIST(18, Collection.VECTOR, JavaType.FLOAT, JavaType.VOID), + INT64_LIST(19, Collection.VECTOR, JavaType.LONG, JavaType.VOID), + UINT64_LIST(20, Collection.VECTOR, JavaType.LONG, JavaType.VOID), + INT32_LIST(21, Collection.VECTOR, JavaType.INT, JavaType.VOID), + FIXED64_LIST(22, Collection.VECTOR, JavaType.LONG, JavaType.VOID), + FIXED32_LIST(23, Collection.VECTOR, JavaType.INT, JavaType.VOID), + BOOL_LIST(24, Collection.VECTOR, JavaType.BOOLEAN, JavaType.VOID), + STRING_LIST(25, Collection.VECTOR, JavaType.STRING, JavaType.VOID), + MESSAGE_LIST(26, Collection.VECTOR, JavaType.MESSAGE, JavaType.VOID), + BYTES_LIST(27, Collection.VECTOR, JavaType.BYTE_STRING, JavaType.VOID), + UINT32_LIST(28, Collection.VECTOR, JavaType.INT, JavaType.VOID), + ENUM_LIST(29, Collection.VECTOR, JavaType.ENUM, JavaType.VOID), + SFIXED32_LIST(30, Collection.VECTOR, JavaType.INT, JavaType.VOID), + SFIXED64_LIST(31, Collection.VECTOR, JavaType.LONG, JavaType.VOID), + SINT32_LIST(32, Collection.VECTOR, JavaType.INT, JavaType.VOID), + SINT64_LIST(33, Collection.VECTOR, JavaType.LONG, JavaType.VOID), + DOUBLE_LIST_PACKED(34, Collection.PACKED_VECTOR, JavaType.DOUBLE, JavaType.VOID), + FLOAT_LIST_PACKED(35, Collection.PACKED_VECTOR, JavaType.FLOAT, JavaType.VOID), + INT64_LIST_PACKED(36, Collection.PACKED_VECTOR, JavaType.LONG, JavaType.VOID), + UINT64_LIST_PACKED(37, Collection.PACKED_VECTOR, JavaType.LONG, JavaType.VOID), + INT32_LIST_PACKED(38, Collection.PACKED_VECTOR, JavaType.INT, JavaType.VOID), + FIXED64_LIST_PACKED(39, Collection.PACKED_VECTOR, JavaType.LONG, JavaType.VOID), + FIXED32_LIST_PACKED(40, Collection.PACKED_VECTOR, JavaType.INT, JavaType.VOID), + BOOL_LIST_PACKED(41, Collection.PACKED_VECTOR, JavaType.BOOLEAN, JavaType.VOID), + UINT32_LIST_PACKED(42, Collection.PACKED_VECTOR, JavaType.INT, JavaType.VOID), + ENUM_LIST_PACKED(43, Collection.PACKED_VECTOR, JavaType.ENUM, JavaType.VOID), + SFIXED32_LIST_PACKED(44, Collection.PACKED_VECTOR, JavaType.INT, JavaType.VOID), + SFIXED64_LIST_PACKED(45, Collection.PACKED_VECTOR, JavaType.LONG, JavaType.VOID), + SINT32_LIST_PACKED(46, Collection.PACKED_VECTOR, JavaType.INT, JavaType.VOID), + SINT64_LIST_PACKED(47, Collection.PACKED_VECTOR, JavaType.LONG, JavaType.VOID), + INT32_TO_INT32_MAP(48, Collection.MAP, JavaType.INT, JavaType.INT), + INT32_TO_INT64_MAP(49, Collection.MAP, JavaType.INT, JavaType.LONG), + INT32_TO_UINT32_MAP(50, Collection.MAP, JavaType.INT, JavaType.INT), + INT32_TO_UINT64_MAP(51, Collection.MAP, JavaType.INT, JavaType.LONG), + INT32_TO_SINT32_MAP(52, Collection.MAP, JavaType.INT, JavaType.INT), + INT32_TO_SINT64_MAP(53, Collection.MAP, JavaType.INT, JavaType.LONG), + INT32_TO_FIXED32_MAP(54, Collection.MAP, JavaType.INT, JavaType.INT), + INT32_TO_FIXED64_MAP(55, Collection.MAP, JavaType.INT, JavaType.LONG), + INT32_TO_SFIXED32_MAP(56, Collection.MAP, JavaType.INT, JavaType.INT), + INT32_TO_SFIXED64_MAP(57, Collection.MAP, JavaType.INT, JavaType.LONG), + INT32_TO_BOOL_MAP(58, Collection.MAP, JavaType.INT, JavaType.BOOLEAN), + INT32_TO_STRING_MAP(59, Collection.MAP, JavaType.INT, JavaType.STRING), + INT32_TO_ENUM_MAP(60, Collection.MAP, JavaType.INT, JavaType.ENUM), + INT32_TO_MESSAGE_MAP(61, Collection.MAP, JavaType.INT, JavaType.MESSAGE), + INT32_TO_BYTES_MAP(62, Collection.MAP, JavaType.INT, JavaType.BYTE_STRING), + INT32_TO_DOUBLE_MAP(63, Collection.MAP, JavaType.INT, JavaType.DOUBLE), + INT32_TO_FLOAT_MAP(64, Collection.MAP, JavaType.INT, JavaType.FLOAT), + INT64_TO_INT32_MAP(65, Collection.MAP, JavaType.LONG, JavaType.INT), + INT64_TO_INT64_MAP(66, Collection.MAP, JavaType.LONG, JavaType.LONG), + INT64_TO_UINT32_MAP(67, Collection.MAP, JavaType.LONG, JavaType.INT), + INT64_TO_UINT64_MAP(68, Collection.MAP, JavaType.LONG, JavaType.LONG), + INT64_TO_SINT32_MAP(69, Collection.MAP, JavaType.LONG, JavaType.INT), + INT64_TO_SINT64_MAP(70, Collection.MAP, JavaType.LONG, JavaType.LONG), + INT64_TO_FIXED32_MAP(71, Collection.MAP, JavaType.LONG, JavaType.INT), + INT64_TO_FIXED64_MAP(72, Collection.MAP, JavaType.LONG, JavaType.LONG), + INT64_TO_SFIXED32_MAP(73, Collection.MAP, JavaType.LONG, JavaType.INT), + INT64_TO_SFIXED64_MAP(74, Collection.MAP, JavaType.LONG, JavaType.LONG), + INT64_TO_BOOL_MAP(75, Collection.MAP, JavaType.LONG, JavaType.BOOLEAN), + INT64_TO_STRING_MAP(76, Collection.MAP, JavaType.LONG, JavaType.STRING), + INT64_TO_ENUM_MAP(77, Collection.MAP, JavaType.LONG, JavaType.ENUM), + INT64_TO_MESSAGE_MAP(78, Collection.MAP, JavaType.LONG, JavaType.MESSAGE), + INT64_TO_BYTES_MAP(79, Collection.MAP, JavaType.LONG, JavaType.BYTE_STRING), + INT64_TO_DOUBLE_MAP(80, Collection.MAP, JavaType.LONG, JavaType.DOUBLE), + INT64_TO_FLOAT_MAP(81, Collection.MAP, JavaType.LONG, JavaType.FLOAT), + UINT32_TO_INT32_MAP(82, Collection.MAP, JavaType.INT, JavaType.INT), + UINT32_TO_INT64_MAP(83, Collection.MAP, JavaType.INT, JavaType.LONG), + UINT32_TO_UINT32_MAP(84, Collection.MAP, JavaType.INT, JavaType.INT), + UINT32_TO_UINT64_MAP(85, Collection.MAP, JavaType.INT, JavaType.LONG), + UINT32_TO_SINT32_MAP(86, Collection.MAP, JavaType.INT, JavaType.INT), + UINT32_TO_SINT64_MAP(87, Collection.MAP, JavaType.INT, JavaType.LONG), + UINT32_TO_FIXED32_MAP(88, Collection.MAP, JavaType.INT, JavaType.INT), + UINT32_TO_FIXED64_MAP(89, Collection.MAP, JavaType.INT, JavaType.LONG), + UINT32_TO_SFIXED32_MAP(90, Collection.MAP, JavaType.INT, JavaType.INT), + UINT32_TO_SFIXED64_MAP(91, Collection.MAP, JavaType.INT, JavaType.LONG), + UINT32_TO_BOOL_MAP(92, Collection.MAP, JavaType.INT, JavaType.BOOLEAN), + UINT32_TO_STRING_MAP(93, Collection.MAP, JavaType.INT, JavaType.STRING), + UINT32_TO_ENUM_MAP(94, Collection.MAP, JavaType.INT, JavaType.ENUM), + UINT32_TO_MESSAGE_MAP(95, Collection.MAP, JavaType.INT, JavaType.MESSAGE), + UINT32_TO_BYTES_MAP(96, Collection.MAP, JavaType.INT, JavaType.BYTE_STRING), + UINT32_TO_DOUBLE_MAP(97, Collection.MAP, JavaType.INT, JavaType.DOUBLE), + UINT32_TO_FLOAT_MAP(98, Collection.MAP, JavaType.INT, JavaType.FLOAT), + UINT64_TO_INT32_MAP(99, Collection.MAP, JavaType.LONG, JavaType.INT), + UINT64_TO_INT64_MAP(100, Collection.MAP, JavaType.LONG, JavaType.LONG), + UINT64_TO_UINT32_MAP(101, Collection.MAP, JavaType.LONG, JavaType.INT), + UINT64_TO_UINT64_MAP(102, Collection.MAP, JavaType.LONG, JavaType.LONG), + UINT64_TO_SINT32_MAP(103, Collection.MAP, JavaType.LONG, JavaType.INT), + UINT64_TO_SINT64_MAP(104, Collection.MAP, JavaType.LONG, JavaType.LONG), + UINT64_TO_FIXED32_MAP(105, Collection.MAP, JavaType.LONG, JavaType.INT), + UINT64_TO_FIXED64_MAP(106, Collection.MAP, JavaType.LONG, JavaType.LONG), + UINT64_TO_SFIXED32_MAP(107, Collection.MAP, JavaType.LONG, JavaType.INT), + UINT64_TO_SFIXED64_MAP(108, Collection.MAP, JavaType.LONG, JavaType.LONG), + UINT64_TO_BOOL_MAP(109, Collection.MAP, JavaType.LONG, JavaType.BOOLEAN), + UINT64_TO_STRING_MAP(110, Collection.MAP, JavaType.LONG, JavaType.STRING), + UINT64_TO_ENUM_MAP(111, Collection.MAP, JavaType.LONG, JavaType.ENUM), + UINT64_TO_MESSAGE_MAP(112, Collection.MAP, JavaType.LONG, JavaType.MESSAGE), + UINT64_TO_BYTES_MAP(113, Collection.MAP, JavaType.LONG, JavaType.BYTE_STRING), + UINT64_TO_DOUBLE_MAP(114, Collection.MAP, JavaType.LONG, JavaType.DOUBLE), + UINT64_TO_FLOAT_MAP(115, Collection.MAP, JavaType.LONG, JavaType.FLOAT), + SINT32_TO_INT32_MAP(116, Collection.MAP, JavaType.INT, JavaType.INT), + SINT32_TO_INT64_MAP(117, Collection.MAP, JavaType.INT, JavaType.LONG), + SINT32_TO_UINT32_MAP(118, Collection.MAP, JavaType.INT, JavaType.INT), + SINT32_TO_UINT64_MAP(119, Collection.MAP, JavaType.INT, JavaType.LONG), + SINT32_TO_SINT32_MAP(120, Collection.MAP, JavaType.INT, JavaType.INT), + SINT32_TO_SINT64_MAP(121, Collection.MAP, JavaType.INT, JavaType.LONG), + SINT32_TO_FIXED32_MAP(122, Collection.MAP, JavaType.INT, JavaType.INT), + SINT32_TO_FIXED64_MAP(123, Collection.MAP, JavaType.INT, JavaType.LONG), + SINT32_TO_SFIXED32_MAP(124, Collection.MAP, JavaType.INT, JavaType.INT), + SINT32_TO_SFIXED64_MAP(125, Collection.MAP, JavaType.INT, JavaType.LONG), + SINT32_TO_BOOL_MAP(126, Collection.MAP, JavaType.INT, JavaType.BOOLEAN), + SINT32_TO_STRING_MAP(127, Collection.MAP, JavaType.INT, JavaType.STRING), + SINT32_TO_ENUM_MAP(128, Collection.MAP, JavaType.INT, JavaType.ENUM), + SINT32_TO_MESSAGE_MAP(129, Collection.MAP, JavaType.INT, JavaType.MESSAGE), + SINT32_TO_BYTES_MAP(130, Collection.MAP, JavaType.INT, JavaType.BYTE_STRING), + SINT32_TO_DOUBLE_MAP(131, Collection.MAP, JavaType.INT, JavaType.DOUBLE), + SINT32_TO_FLOAT_MAP(132, Collection.MAP, JavaType.INT, JavaType.FLOAT), + SINT64_TO_INT32_MAP(133, Collection.MAP, JavaType.LONG, JavaType.INT), + SINT64_TO_INT64_MAP(134, Collection.MAP, JavaType.LONG, JavaType.LONG), + SINT64_TO_UINT32_MAP(135, Collection.MAP, JavaType.LONG, JavaType.INT), + SINT64_TO_UINT64_MAP(136, Collection.MAP, JavaType.LONG, JavaType.LONG), + SINT64_TO_SINT32_MAP(137, Collection.MAP, JavaType.LONG, JavaType.INT), + SINT64_TO_SINT64_MAP(138, Collection.MAP, JavaType.LONG, JavaType.LONG), + SINT64_TO_FIXED32_MAP(139, Collection.MAP, JavaType.LONG, JavaType.INT), + SINT64_TO_FIXED64_MAP(140, Collection.MAP, JavaType.LONG, JavaType.LONG), + SINT64_TO_SFIXED32_MAP(141, Collection.MAP, JavaType.LONG, JavaType.INT), + SINT64_TO_SFIXED64_MAP(142, Collection.MAP, JavaType.LONG, JavaType.LONG), + SINT64_TO_BOOL_MAP(143, Collection.MAP, JavaType.LONG, JavaType.BOOLEAN), + SINT64_TO_STRING_MAP(144, Collection.MAP, JavaType.LONG, JavaType.STRING), + SINT64_TO_ENUM_MAP(145, Collection.MAP, JavaType.LONG, JavaType.ENUM), + SINT64_TO_MESSAGE_MAP(146, Collection.MAP, JavaType.LONG, JavaType.MESSAGE), + SINT64_TO_BYTES_MAP(147, Collection.MAP, JavaType.LONG, JavaType.BYTE_STRING), + SINT64_TO_DOUBLE_MAP(148, Collection.MAP, JavaType.LONG, JavaType.DOUBLE), + SINT64_TO_FLOAT_MAP(149, Collection.MAP, JavaType.LONG, JavaType.FLOAT), + FIXED32_TO_INT32_MAP(150, Collection.MAP, JavaType.INT, JavaType.INT), + FIXED32_TO_INT64_MAP(151, Collection.MAP, JavaType.INT, JavaType.LONG), + FIXED32_TO_UINT32_MAP(152, Collection.MAP, JavaType.INT, JavaType.INT), + FIXED32_TO_UINT64_MAP(153, Collection.MAP, JavaType.INT, JavaType.LONG), + FIXED32_TO_SINT32_MAP(154, Collection.MAP, JavaType.INT, JavaType.INT), + FIXED32_TO_SINT64_MAP(155, Collection.MAP, JavaType.INT, JavaType.LONG), + FIXED32_TO_FIXED32_MAP(156, Collection.MAP, JavaType.INT, JavaType.INT), + FIXED32_TO_FIXED64_MAP(157, Collection.MAP, JavaType.INT, JavaType.LONG), + FIXED32_TO_SFIXED32_MAP(158, Collection.MAP, JavaType.INT, JavaType.INT), + FIXED32_TO_SFIXED64_MAP(159, Collection.MAP, JavaType.INT, JavaType.LONG), + FIXED32_TO_BOOL_MAP(160, Collection.MAP, JavaType.INT, JavaType.BOOLEAN), + FIXED32_TO_STRING_MAP(161, Collection.MAP, JavaType.INT, JavaType.STRING), + FIXED32_TO_ENUM_MAP(162, Collection.MAP, JavaType.INT, JavaType.ENUM), + FIXED32_TO_MESSAGE_MAP(163, Collection.MAP, JavaType.INT, JavaType.MESSAGE), + FIXED32_TO_BYTES_MAP(164, Collection.MAP, JavaType.INT, JavaType.BYTE_STRING), + FIXED32_TO_DOUBLE_MAP(165, Collection.MAP, JavaType.INT, JavaType.DOUBLE), + FIXED32_TO_FLOAT_MAP(166, Collection.MAP, JavaType.INT, JavaType.FLOAT), + FIXED64_TO_INT32_MAP(167, Collection.MAP, JavaType.LONG, JavaType.INT), + FIXED64_TO_INT64_MAP(168, Collection.MAP, JavaType.LONG, JavaType.LONG), + FIXED64_TO_UINT32_MAP(169, Collection.MAP, JavaType.LONG, JavaType.INT), + FIXED64_TO_UINT64_MAP(170, Collection.MAP, JavaType.LONG, JavaType.LONG), + FIXED64_TO_SINT32_MAP(171, Collection.MAP, JavaType.LONG, JavaType.INT), + FIXED64_TO_SINT64_MAP(172, Collection.MAP, JavaType.LONG, JavaType.LONG), + FIXED64_TO_FIXED32_MAP(173, Collection.MAP, JavaType.LONG, JavaType.INT), + FIXED64_TO_FIXED64_MAP(174, Collection.MAP, JavaType.LONG, JavaType.LONG), + FIXED64_TO_SFIXED32_MAP(175, Collection.MAP, JavaType.LONG, JavaType.INT), + FIXED64_TO_SFIXED64_MAP(176, Collection.MAP, JavaType.LONG, JavaType.LONG), + FIXED64_TO_BOOL_MAP(177, Collection.MAP, JavaType.LONG, JavaType.BOOLEAN), + FIXED64_TO_STRING_MAP(178, Collection.MAP, JavaType.LONG, JavaType.STRING), + FIXED64_TO_ENUM_MAP(179, Collection.MAP, JavaType.LONG, JavaType.ENUM), + FIXED64_TO_MESSAGE_MAP(180, Collection.MAP, JavaType.LONG, JavaType.MESSAGE), + FIXED64_TO_BYTES_MAP(181, Collection.MAP, JavaType.LONG, JavaType.BYTE_STRING), + FIXED64_TO_DOUBLE_MAP(182, Collection.MAP, JavaType.LONG, JavaType.DOUBLE), + FIXED64_TO_FLOAT_MAP(183, Collection.MAP, JavaType.LONG, JavaType.FLOAT), + SFIXED32_TO_INT32_MAP(184, Collection.MAP, JavaType.INT, JavaType.INT), + SFIXED32_TO_INT64_MAP(185, Collection.MAP, JavaType.INT, JavaType.LONG), + SFIXED32_TO_UINT32_MAP(186, Collection.MAP, JavaType.INT, JavaType.INT), + SFIXED32_TO_UINT64_MAP(187, Collection.MAP, JavaType.INT, JavaType.LONG), + SFIXED32_TO_SINT32_MAP(188, Collection.MAP, JavaType.INT, JavaType.INT), + SFIXED32_TO_SINT64_MAP(189, Collection.MAP, JavaType.INT, JavaType.LONG), + SFIXED32_TO_FIXED32_MAP(190, Collection.MAP, JavaType.INT, JavaType.INT), + SFIXED32_TO_FIXED64_MAP(191, Collection.MAP, JavaType.INT, JavaType.LONG), + SFIXED32_TO_SFIXED32_MAP(192, Collection.MAP, JavaType.INT, JavaType.INT), + SFIXED32_TO_SFIXED64_MAP(193, Collection.MAP, JavaType.INT, JavaType.LONG), + SFIXED32_TO_BOOL_MAP(194, Collection.MAP, JavaType.INT, JavaType.BOOLEAN), + SFIXED32_TO_STRING_MAP(195, Collection.MAP, JavaType.INT, JavaType.STRING), + SFIXED32_TO_ENUM_MAP(196, Collection.MAP, JavaType.INT, JavaType.ENUM), + SFIXED32_TO_MESSAGE_MAP(197, Collection.MAP, JavaType.INT, JavaType.MESSAGE), + SFIXED32_TO_BYTES_MAP(198, Collection.MAP, JavaType.INT, JavaType.BYTE_STRING), + SFIXED32_TO_DOUBLE_MAP(199, Collection.MAP, JavaType.INT, JavaType.DOUBLE), + SFIXED32_TO_FLOAT_MAP(200, Collection.MAP, JavaType.INT, JavaType.FLOAT), + SFIXED64_TO_INT32_MAP(201, Collection.MAP, JavaType.LONG, JavaType.INT), + SFIXED64_TO_INT64_MAP(202, Collection.MAP, JavaType.LONG, JavaType.LONG), + SFIXED64_TO_UINT32_MAP(203, Collection.MAP, JavaType.LONG, JavaType.INT), + SFIXED64_TO_UINT64_MAP(204, Collection.MAP, JavaType.LONG, JavaType.LONG), + SFIXED64_TO_SINT32_MAP(205, Collection.MAP, JavaType.LONG, JavaType.INT), + SFIXED64_TO_SINT64_MAP(206, Collection.MAP, JavaType.LONG, JavaType.LONG), + SFIXED64_TO_FIXED32_MAP(207, Collection.MAP, JavaType.LONG, JavaType.INT), + SFIXED64_TO_FIXED64_MAP(208, Collection.MAP, JavaType.LONG, JavaType.LONG), + SFIXED64_TO_SFIXED32_MAP(209, Collection.MAP, JavaType.LONG, JavaType.INT), + SFIXED64_TO_SFIXED64_MAP(210, Collection.MAP, JavaType.LONG, JavaType.LONG), + SFIXED64_TO_BOOL_MAP(211, Collection.MAP, JavaType.LONG, JavaType.BOOLEAN), + SFIXED64_TO_STRING_MAP(212, Collection.MAP, JavaType.LONG, JavaType.STRING), + SFIXED64_TO_ENUM_MAP(213, Collection.MAP, JavaType.LONG, JavaType.ENUM), + SFIXED64_TO_MESSAGE_MAP(214, Collection.MAP, JavaType.LONG, JavaType.MESSAGE), + SFIXED64_TO_BYTES_MAP(215, Collection.MAP, JavaType.LONG, JavaType.BYTE_STRING), + SFIXED64_TO_DOUBLE_MAP(216, Collection.MAP, JavaType.LONG, JavaType.DOUBLE), + SFIXED64_TO_FLOAT_MAP(217, Collection.MAP, JavaType.LONG, JavaType.FLOAT), + BOOL_TO_INT32_MAP(218, Collection.MAP, JavaType.BOOLEAN, JavaType.INT), + BOOL_TO_INT64_MAP(219, Collection.MAP, JavaType.BOOLEAN, JavaType.LONG), + BOOL_TO_UINT32_MAP(220, Collection.MAP, JavaType.BOOLEAN, JavaType.INT), + BOOL_TO_UINT64_MAP(221, Collection.MAP, JavaType.BOOLEAN, JavaType.LONG), + BOOL_TO_SINT32_MAP(222, Collection.MAP, JavaType.BOOLEAN, JavaType.INT), + BOOL_TO_SINT64_MAP(223, Collection.MAP, JavaType.BOOLEAN, JavaType.LONG), + BOOL_TO_FIXED32_MAP(224, Collection.MAP, JavaType.BOOLEAN, JavaType.INT), + BOOL_TO_FIXED64_MAP(225, Collection.MAP, JavaType.BOOLEAN, JavaType.LONG), + BOOL_TO_SFIXED32_MAP(226, Collection.MAP, JavaType.BOOLEAN, JavaType.INT), + BOOL_TO_SFIXED64_MAP(227, Collection.MAP, JavaType.BOOLEAN, JavaType.LONG), + BOOL_TO_BOOL_MAP(228, Collection.MAP, JavaType.BOOLEAN, JavaType.BOOLEAN), + BOOL_TO_STRING_MAP(229, Collection.MAP, JavaType.BOOLEAN, JavaType.STRING), + BOOL_TO_ENUM_MAP(230, Collection.MAP, JavaType.BOOLEAN, JavaType.ENUM), + BOOL_TO_MESSAGE_MAP(231, Collection.MAP, JavaType.BOOLEAN, JavaType.MESSAGE), + BOOL_TO_BYTES_MAP(232, Collection.MAP, JavaType.BOOLEAN, JavaType.BYTE_STRING), + BOOL_TO_DOUBLE_MAP(233, Collection.MAP, JavaType.BOOLEAN, JavaType.DOUBLE), + BOOL_TO_FLOAT_MAP(234, Collection.MAP, JavaType.BOOLEAN, JavaType.FLOAT), + STRING_TO_INT32_MAP(235, Collection.MAP, JavaType.STRING, JavaType.INT), + STRING_TO_INT64_MAP(236, Collection.MAP, JavaType.STRING, JavaType.LONG), + STRING_TO_UINT32_MAP(237, Collection.MAP, JavaType.STRING, JavaType.INT), + STRING_TO_UINT64_MAP(238, Collection.MAP, JavaType.STRING, JavaType.LONG), + STRING_TO_SINT32_MAP(239, Collection.MAP, JavaType.STRING, JavaType.INT), + STRING_TO_SINT64_MAP(240, Collection.MAP, JavaType.STRING, JavaType.LONG), + STRING_TO_FIXED32_MAP(241, Collection.MAP, JavaType.STRING, JavaType.INT), + STRING_TO_FIXED64_MAP(242, Collection.MAP, JavaType.STRING, JavaType.LONG), + STRING_TO_SFIXED32_MAP(243, Collection.MAP, JavaType.STRING, JavaType.INT), + STRING_TO_SFIXED64_MAP(244, Collection.MAP, JavaType.STRING, JavaType.LONG), + STRING_TO_BOOL_MAP(245, Collection.MAP, JavaType.STRING, JavaType.BOOLEAN), + STRING_TO_STRING_MAP(246, Collection.MAP, JavaType.STRING, JavaType.STRING), + STRING_TO_ENUM_MAP(247, Collection.MAP, JavaType.STRING, JavaType.ENUM), + STRING_TO_MESSAGE_MAP(248, Collection.MAP, JavaType.STRING, JavaType.MESSAGE), + STRING_TO_BYTES_MAP(249, Collection.MAP, JavaType.STRING, JavaType.BYTE_STRING), + STRING_TO_DOUBLE_MAP(250, Collection.MAP, JavaType.STRING, JavaType.DOUBLE), + STRING_TO_FLOAT_MAP(251, Collection.MAP, JavaType.STRING, JavaType.FLOAT), + GROUP(252, Collection.SCALAR, JavaType.MESSAGE, JavaType.VOID), + GROUP_LIST(253, Collection.VECTOR, JavaType.MESSAGE, JavaType.VOID), + GROUP_LIST_PACKED(254, Collection.PACKED_VECTOR, JavaType.MESSAGE, JavaType.VOID); + + private final JavaType javaType1; + private final JavaType javaType2; + private final int id; + private final Collection collection; + private final Class<?> elementType1; + private final Class<?> elementType2; + + FieldType(int id, Collection collection, JavaType javaType1, JavaType javaType2) { + this.id = id; + this.collection = collection; + this.javaType1 = javaType1; + this.javaType2 = javaType2; + + switch (collection) { + case MAP: + elementType1 = javaType1.getBoxedType(); + elementType2 = javaType2.getBoxedType(); + break; + case VECTOR: + elementType1 = javaType1.getBoxedType(); + elementType2 = null; + break; + case SCALAR: + default: + elementType1 = null; + elementType2 = null; + break; + } + } + + /** + * A reliable unique identifier for this type. + */ + public int id() { + return id; + } + + /** + * Gets the {@link JavaType} for this field. For lists, this identifies the type of the elements + * contained within the list. + */ + public JavaType getJavaType() { + return javaType1; + } + + /** + * Indicates whether a list field should be represented on the wire in packed form. + */ + public boolean isPacked() { + return Collection.PACKED_VECTOR.equals(collection); + } + + /** + * Indicates whether this field represents a list of values. + */ + public boolean isList() { + return collection.isList(); + } + + /** + * Indicates whether or not this {@link FieldType} can be applied to the given {@link Field}. + */ + public boolean isValidForField(Field field) { + if (Collection.VECTOR.equals(collection)) { + return isValidForList(field); + } else { + return javaType1.getType().isAssignableFrom(field.getType()); + } + } + + private boolean isValidForList(Field field) { + Class<?> clazz = field.getType(); + if (!javaType1.getType().isAssignableFrom(clazz)) { + // The field isn't a List type. + return false; + } + Type[] types = EMPTY_TYPES; + Type genericType = field.getGenericType(); + if (genericType instanceof ParameterizedType) { + types = ((ParameterizedType) field.getGenericType()).getActualTypeArguments(); + } + Type listParameter = getListParameter(clazz, types); + if (!(listParameter instanceof Class)) { + // It's a wildcard, we should allow anything in the list. + return true; + } + return elementType1.isAssignableFrom((Class<?>) listParameter); + } + + /** + * Looks up the appropriate {@link FieldType} by it's identifier. + * + * @return the {@link FieldType} or {@code null} if not found. + */ + /* @Nullable */ + public static FieldType forId(byte id) { + if (id < 0 || id >= VALUES.length) { + return null; + } + return VALUES[id]; + } + + private static final FieldType[] VALUES; + private static final Type[] EMPTY_TYPES = new Type[0]; + + static { + FieldType[] values = values(); + VALUES = new FieldType[values.length]; + for (FieldType type : values) { + VALUES[type.id] = type; + } + } + + /** + * Given a class, finds a generic super class or interface that extends {@link List}. + * + * @return the generic super class/interface, or {@code null} if not found. + */ + /* @Nullable */ + private static Type getGenericSuperList(Class<?> clazz) { + // First look at interfaces. + Type[] genericInterfaces = clazz.getGenericInterfaces(); + for (Type genericInterface : genericInterfaces) { + if (genericInterface instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) genericInterface; + Class<?> rawType = (Class<?>) parameterizedType.getRawType(); + if (List.class.isAssignableFrom(rawType)) { + return genericInterface; + } + } + } + + // Try the subclass + Type type = clazz.getGenericSuperclass(); + if (type instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) type; + Class<?> rawType = (Class<?>) parameterizedType.getRawType(); + if (List.class.isAssignableFrom(rawType)) { + return type; + } + } + + // No super class/interface extends List. + return null; + } + + /** + * Inspects the inheritance hierarchy for the given class and finds the generic type parameter + * for {@link List}. + * + * @param clazz the class to begin the search. + * @param realTypes the array of actual type parameters for {@code clazz}. These will be used to + * substitute generic parameters up the inheritance hierarchy. If {@code clazz} does not have any + * generic parameters, this list should be empty. + * @return the {@link List} parameter. + */ + private static Type getListParameter(Class<?> clazz, Type[] realTypes) { + top: + while (clazz != List.class) { + // First look at generic subclass and interfaces. + Type genericType = getGenericSuperList(clazz); + if (genericType instanceof ParameterizedType) { + // Replace any generic parameters with the real values. + ParameterizedType parameterizedType = (ParameterizedType) genericType; + Type[] superArgs = parameterizedType.getActualTypeArguments(); + for (int i = 0; i < superArgs.length; ++i) { + Type superArg = superArgs[i]; + if (superArg instanceof TypeVariable) { + // Get the type variables for this class so that we can match them to the variables + // used on the super class. + TypeVariable<?>[] clazzParams = clazz.getTypeParameters(); + if (realTypes.length != clazzParams.length) { + throw new RuntimeException("Type array mismatch"); + } + + // Replace the variable parameter with the real type. + boolean foundReplacement = false; + for (int j = 0; j < clazzParams.length; ++j) { + if (superArg == clazzParams[j]) { + Type realType = realTypes[j]; + superArgs[i] = realType; + foundReplacement = true; + break; + } + } + if (!foundReplacement) { + throw new RuntimeException("Unable to find replacement for " + superArg); + } + } + } + + Class<?> parent = (Class<?>) parameterizedType.getRawType(); + + realTypes = superArgs; + clazz = parent; + continue; + } + + // None of the parameterized types inherit List. Just continue up the inheritance hierarchy + // toward the List interface until we can identify the parameters. + realTypes = EMPTY_TYPES; + for (Class<?> iface : clazz.getInterfaces()) { + if (List.class.isAssignableFrom(iface)) { + clazz = iface; + continue top; + } + } + clazz = clazz.getSuperclass(); + } + + if (realTypes.length != 1) { + throw new RuntimeException("Unable to identify parameter type for List<T>"); + } + return realTypes[0]; + } + + enum Collection { + SCALAR(false), + VECTOR(true), + PACKED_VECTOR(true), + MAP(false); + + private final boolean isList; + + Collection(boolean isList) { + this.isList = isList; + } + + /** + * @return the isList + */ + public boolean isList() { + return isList; + } + } +} |