diff --git a/Parser.Test/TestParser.fs b/Parser.Test/TestParser.fs index d54eba3..1be7a32 100644 --- a/Parser.Test/TestParser.fs +++ b/Parser.Test/TestParser.fs @@ -1060,7 +1060,6 @@ module RegressionTests = [] let ``proto3 oneof type doesn't parse (#88)`` () = - System.Diagnostics.Debugger.Break() Parse.fromStringWithParser pProto """ syntax = "proto3"; @@ -1083,4 +1082,47 @@ module RegressionTests = ]) ]) - ]) \ No newline at end of file + ]) + + [] + let ``proto3 message with enum type doesn't parse (#93)`` () = + Parse.fromStringWithParser pProto """ + syntax = "proto3"; + + message SearchRequest { + string query = 1; + int32 page_number = 2; + int32 result_per_page = 3; + enum Corpus { + UNIVERSAL = 0; + WEB = 1; + IMAGES = 2; + LOCAL = 3; + NEWS = 4; + PRODUCTS = 5; + VIDEO = 6; + } + Corpus corpus = 4; + } + """ + |> should equal ( + [ + TSyntax TProto3 + TMessage ("SearchRequest", + [ + TField ("query",TOptional,TString,1u,[]) + TField ("page_number",TOptional,TInt32,2u,[]) + TField ("result_per_page",TOptional,TInt32,3u,[]) + TMessageEnum("Corpus", + [ + TEnumField ("UNIVERSAL",0,[]) + TEnumField ("WEB",1,[]) + TEnumField ("IMAGES",2,[]) + TEnumField ("LOCAL",3,[]) + TEnumField ("NEWS",4,[]) + TEnumField ("PRODUCTS",5,[]) + TEnumField ("VIDEO",6,[]) + ]) + TField ("corpus", TOptional,TIdent "Corpus",4u,[]) + ]) + ]) diff --git a/Parser/Parser.fs b/Parser/Parser.fs index ab86dd1..586024a 100644 --- a/Parser/Parser.fs +++ b/Parser/Parser.fs @@ -482,7 +482,6 @@ module Parse = choice [ (isProto2 >>. pGroup) // must be parsed first to avoid confusion pOneOf // must be parsed before pField, so 'oneof' isn't considered a type in Proto3 - pField pMessageEnum pMessageMessage (isProto2 >>. pMessageExtend) @@ -490,6 +489,7 @@ module Parse = pMessageOption pMap pReserved + pField ] /// Parse message option: "option" (ident | "(" fullIdent ")" { "." ident }