From eb313c1f3d81ab3e7b36ffffa8a93cf689b049bb Mon Sep 17 00:00:00 2001 From: Matt Nathan Date: Fri, 28 Jan 2022 20:41:59 +0000 Subject: [PATCH] Correctly support proto3 optional fields in commonjs+dts .d.ts output (#1184) * Correctly support proto3 optional fields in commonjs+dts .d.ts output Fixes #1072 * Use has_optional_keyword instead of is_optional * Improve the readability of the condition guarding hasXxx .d.ts field generation. --- .../net/grpc/web/generator/grpc_generator.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/javascript/net/grpc/web/generator/grpc_generator.cc b/javascript/net/grpc/web/generator/grpc_generator.cc index 15e9c66b..498f3e09 100644 --- a/javascript/net/grpc/web/generator/grpc_generator.cc +++ b/javascript/net/grpc/web/generator/grpc_generator.cc @@ -825,11 +825,12 @@ void PrintProtoDtsMessage(Printer* printer, const Descriptor* desc, "set$js_field_name$(value?: $js_field_type$): " "$class_name$;\n"); } - if (field->type() == FieldDescriptor::TYPE_MESSAGE && - !field->is_repeated() && !field->is_map()) { + if (field->has_optional_keyword() || + (field->type() == FieldDescriptor::TYPE_MESSAGE && + !field->is_repeated() && !field->is_map())) { printer->Print(vars, "has$js_field_name$(): boolean;\n"); } - if (field->type() == FieldDescriptor::TYPE_MESSAGE || + if (field->type() == FieldDescriptor::TYPE_MESSAGE || field->has_optional_keyword() || field->is_repeated() || field->is_map()) { printer->Print(vars, "clear$js_field_name$(): $class_name$;\n"); } @@ -852,10 +853,12 @@ void PrintProtoDtsMessage(Printer* printer, const Descriptor* desc, for (int i = 0; i < desc->oneof_decl_count(); i++) { const OneofDescriptor* oneof = desc->oneof_decl(i); - vars["js_oneof_name"] = ToUpperCamel(ParseLowerUnderscore(oneof->name())); - printer->Print( - vars, "get$js_oneof_name$Case(): $class_name$.$js_oneof_name$Case;\n"); - printer->Print("\n"); + if (!oneof->is_synthetic()) { + vars["js_oneof_name"] = ToUpperCamel(ParseLowerUnderscore(oneof->name())); + printer->Print( + vars, "get$js_oneof_name$Case(): $class_name$.$js_oneof_name$Case;\n"); + printer->Print("\n"); + } } printer->Print( @@ -885,7 +888,7 @@ void PrintProtoDtsMessage(Printer* printer, const Descriptor* desc, } vars["js_field_name"] = js_field_name; vars["js_field_type"] = AsObjectFieldType(field, file); - if (field->type() != FieldDescriptor::TYPE_MESSAGE || + if ((field->type() != FieldDescriptor::TYPE_MESSAGE && !field->has_optional_keyword()) || field->is_repeated()) { printer->Print(vars, "$js_field_name$: $js_field_type$,\n"); } else {