@Override public DescriptorProto decode(ProtoReader reader) throws IOException { Builder builder = new Builder(); long token = reader.beginMessage(); for (int tag; (tag = reader.nextTag()) != -1; ) { switch (tag) { case 1: builder.name(ProtoAdapter.STRING.decode(reader)); break; case 8: builder.doc(ProtoAdapter.STRING.decode(reader)); break; case 2: builder.field.add(FieldDescriptorProto.ADAPTER.decode(reader)); break; case 6: builder.extension.add(FieldDescriptorProto.ADAPTER.decode(reader)); break; case 3: builder.nested_type.add(DescriptorProto.ADAPTER.decode(reader)); break; case 4: builder.enum_type.add(EnumDescriptorProto.ADAPTER.decode(reader)); break; case 5: builder.extension_range.add(ExtensionRange.ADAPTER.decode(reader)); break; case 7: builder.options(MessageOptions.ADAPTER.decode(reader)); break; default: { FieldEncoding fieldEncoding = reader.peekFieldEncoding(); Object value = fieldEncoding.rawProtoAdapter().decode(reader); builder.addUnknownField(tag, fieldEncoding, value); } } } reader.endMessage(token); return builder.build(); }