Skip to content

Commit 6a3451a

Browse files
authored
Merge pull request #214 from CantelopePeel/hex-field-nums-1
Message fields can have hex field numbers
2 parents 3802b81 + 42a8352 commit 6a3451a

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/parsing/proto_types.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ function parse_field(ps::ParserState, labelable::Bool=true)
148148
labelable && ps.is_proto3 && label == REQUIRED && (ps.errored = true) && error("Field `$(name)` has a `required` label which is not supported in proto3 syntax.")
149149
labelable && !ps.is_proto3 && label == DEFAULT && (ps.errored = true) && error("Field `$(name)` is missing a label (`required`, `optional` or `repeated`), this is not supported in proto2 syntax.")
150150
expectnext(ps, Tokens.EQ)
151-
number = parse(Int, val(expectnext(ps, Tokens.DEC_INT_LIT)))
151+
number = parse(Int, val(expectnext(ps, kind -> (kind == Tokens.DEC_INT_LIT || kind == Tokens.HEX_INT_LIT))))
152152
if !(1 <= number <= MAX_FIELD_NUMBER) || (19000 <= number <= 19999)
153153
ps.errored = true
154154
error("Invalid field number $number for field $name")

test/test_parser.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,26 @@ end
6262
@test haskey(p.definitions, "A")
6363
@test p.definitions["A"] isa Parsers.MessageType
6464
end
65+
66+
@testset "Single message proto file with single decimal-numbered field" begin
67+
s, p, ctx = translate_simple_proto("message A { required uint32 b = 1234; }")
68+
69+
@test haskey(p.definitions, "A")
70+
@test p.definitions["A"] isa Parsers.MessageType
71+
@test p.definitions["A"].fields[1].name == "b"
72+
@test p.definitions["A"].fields[1].number == 1234
73+
@test p.definitions["A"].fields[1].type isa Parsers.UInt32Type
74+
end
75+
76+
@testset "Single message proto file with single hex-numbered field" begin
77+
s, p, ctx = translate_simple_proto("message A { required uint32 b = 0x4321; }")
78+
79+
@test haskey(p.definitions, "A")
80+
@test p.definitions["A"] isa Parsers.MessageType
81+
@test p.definitions["A"].fields[1].name == "b"
82+
@test p.definitions["A"].fields[1].number == 0x4321
83+
@test p.definitions["A"].fields[1].type isa Parsers.UInt32Type
84+
end
6585

6686
@testset "Single enum proto file" begin
6787
s, p, ctx = translate_simple_proto("enum A { a = 0; }")

0 commit comments

Comments
 (0)