in crumb-compiler/src/main/kotlin/com/uber/crumb/internal/wire/ProtoReader.kt [132:188]
fun nextTag(): Int {
if (state == STATE_PACKED_TAG) {
state = STATE_LENGTH_DELIMITED
return tag
} else if (state != STATE_TAG) {
throw IllegalStateException("Unexpected call to nextTag()")
}
loop@ while (pos < limit && !source.exhausted()) {
val tagAndFieldEncoding = internalReadVarint32()
if (tagAndFieldEncoding == 0) throw ProtocolException("Unexpected tag 0")
tag = tagAndFieldEncoding shr TAG_FIELD_ENCODING_BITS
when (val groupOrFieldEncoding = tagAndFieldEncoding and FIELD_ENCODING_MASK) {
STATE_START_GROUP -> {
skipGroup(tag)
continue@loop
}
STATE_END_GROUP -> throw ProtocolException("Unexpected end group")
STATE_LENGTH_DELIMITED -> {
nextFieldEncoding = FieldEncoding.LENGTH_DELIMITED
state = STATE_LENGTH_DELIMITED
val length = internalReadVarint32()
if (length < 0) throw ProtocolException("Negative length: $length")
if (pushedLimit != -1L) throw IllegalStateException()
// Push the current limit, and set a new limit to the length of this value.
pushedLimit = limit
limit = pos + length
if (limit > pushedLimit) throw EOFException()
return tag
}
STATE_VARINT -> {
nextFieldEncoding = FieldEncoding.VARINT
state = STATE_VARINT
return tag
}
STATE_FIXED64 -> {
nextFieldEncoding = FieldEncoding.FIXED64
state = STATE_FIXED64
return tag
}
STATE_FIXED32 -> {
nextFieldEncoding = FieldEncoding.FIXED32
state = STATE_FIXED32
return tag
}
else -> throw ProtocolException("Unexpected field encoding: $groupOrFieldEncoding")
}
}
return -1
}