Skip to content

Commit 710cc9d

Browse files
Dave Masselinkdibenede
authored andcommitted
Support protobuf extend keyword when in kImportEs6 mode (protocolbuffers#8)
Enable compilation of protos which use the `extend` keyword. A gRPC-web service broke es6 compilation due to importing [`longrunning/operations.proto`](https://github.com/googleapis/googleapis/blob/master/google/longrunning/operations.proto), which uses annotations, which use extensions. Testing of this is being done in `rules_ts_proto` repo: [PR#9](https://github.com/gonzojive/rules_ts_proto/pull/9/files)
1 parent b82b565 commit 710cc9d

1 file changed

Lines changed: 25 additions & 33 deletions

File tree

generator/js_generator.cc

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,9 @@ std::string RelativeTypeName(const FieldDescriptor* field) {
12491249
std::string JSExtensionsObjectName(const GeneratorOptions& options,
12501250
const FileDescriptor* from_file,
12511251
const Descriptor* desc) {
1252-
if (desc->full_name() == "google.protobuf.bridge.MessageSet") {
1252+
if (options.WantEs6()) {
1253+
return TypeNames::JsName(desc->name()) + ".extensions";
1254+
} else if (desc->full_name() == "google.protobuf.bridge.MessageSet") {
12531255
// TODO(haberman): fix this for the kImportCommonJs case.
12541256
return "jspb.Message.messageSetExtensions";
12551257
} else {
@@ -2077,7 +2079,7 @@ void Generator::GenerateClassEs6(const GeneratorOptions& options,
20772079

20782080
printer->Indent();
20792081

2080-
GenerateClassConstructor(options, printer, desc);
2082+
GenerateClassConstructorAndDeclareExtensionFieldInfo(options, printer, desc);
20812083

20822084
GenerateClassFieldInfo(options, printer, desc);
20832085

@@ -2187,12 +2189,6 @@ void Generator::GenerateClassConstructorAndDeclareExtensionFieldInfo(
21872189
GenerateClassExtensionFieldInfo(options, printer, desc);
21882190
}
21892191
}
2190-
for (int i = 0; i < desc->nested_type_count(); i++) {
2191-
if (!IgnoreMessage(desc->nested_type(i))) {
2192-
GenerateClassConstructorAndDeclareExtensionFieldInfo(
2193-
options, printer, desc->nested_type(i));
2194-
}
2195-
}
21962192
}
21972193

21982194
void Generator::GenerateClassFieldInfo(const GeneratorOptions& options,
@@ -3237,9 +3233,8 @@ void Generator::GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
32373233
" *\n"
32383234
" * @type {!Object<number, jspb.ExtensionFieldInfo>}\n"
32393235
" */\n"
3240-
"$class$.extensions = {};\n"
3241-
"\n",
3242-
"class", GetMessagePath(options, desc));
3236+
"static extensions = {};\n"
3237+
"\n");
32433238

32443239
printer->Print(
32453240
"\n"
@@ -3258,9 +3253,8 @@ void Generator::GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
32583253
" *\n"
32593254
" * @type {!Object<number, jspb.ExtensionFieldBinaryInfo>}\n"
32603255
" */\n"
3261-
"$class$.extensionsBinary = {};\n"
3262-
"\n",
3263-
"class", GetMessagePath(options, desc));
3256+
"static extensionsBinary = {};\n"
3257+
"\n");
32643258
}
32653259
}
32663260

@@ -3685,22 +3679,23 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
36853679
const TypeNames& type_names,
36863680
io::Printer* printer,
36873681
const FieldDescriptor* field) const {
3688-
std::string extension_scope =
3689-
(field->extension_scope()
3690-
? GetMessagePath(options, field->extension_scope())
3691-
: GetNamespace(options, field->file()));
3682+
std::string extension_scope_name =
3683+
(field->containing_type()
3684+
? TypeNames::JsName(field->containing_type()->name())
3685+
: GetNamespace(options, field->file()));
3686+
std::string extension_object_name =
3687+
JSExtensionsObjectName(options, field->file(), field->containing_type());
3688+
std::string extension_object_field_name = JSObjectFieldName(options, field);
36923689

3693-
const std::string extension_object_name = JSObjectFieldName(options, field);
36943690
printer->Print(
36953691
"\n"
36963692
"/**\n"
36973693
" * A tuple of {field number, class constructor} for the extension\n"
3698-
" * field named `$nameInComment$`.\n"
3694+
" * field named `$name$`.\n"
36993695
" * @type {!jspb.ExtensionFieldInfo<$extensionType$>}\n"
37003696
" */\n"
37013697
"$class$.$name$ = new jspb.ExtensionFieldInfo(\n",
3702-
"nameInComment", extension_object_name, "name", extension_object_name,
3703-
"class", extension_scope, "extensionType",
3698+
"class", extension_scope_name, "name", extension_object_field_name, "extensionType",
37043699
JSFieldTypeAnnotation(options, field,
37053700
/* is_setter_argument = */ false,
37063701
/* force_present = */ true,
@@ -3714,7 +3709,7 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
37143709
"!Object} */ (\n"
37153710
" $toObject$),\n"
37163711
" $repeated$);\n",
3717-
"index", absl::StrCat(field->number()), "name", extension_object_name, "ctor",
3712+
"index", absl::StrCat(field->number()), "name", extension_object_field_name, "ctor",
37183713
(field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE
37193714
? type_names.SubmessageTypeRef(field)
37203715
: std::string("null")),
@@ -3732,12 +3727,11 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
37323727
" $binaryWriterFn$,\n"
37333728
" $binaryMessageSerializeFn$,\n"
37343729
" $binaryMessageDeserializeFn$,\n",
3735-
"extendName",
3736-
JSExtensionsObjectName(options, field->file(), field->containing_type()),
3737-
"index", absl::StrCat(field->number()), "class", extension_scope, "name",
3738-
extension_object_name, "binaryReaderFn",
3739-
JSBinaryReaderMethodName(options, field), "binaryWriterFn",
3740-
JSBinaryWriterMethodName(options, field), "binaryMessageSerializeFn",
3730+
"extendName", extension_object_name, "index", absl::StrCat(field->number()),
3731+
"class", extension_scope_name, "name", extension_object_field_name,
3732+
"binaryReaderFn", JSBinaryReaderMethodName(options, field),
3733+
"binaryWriterFn", JSBinaryWriterMethodName(options, field),
3734+
"binaryMessageSerializeFn",
37413735
(field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE)
37423736
? (type_names.SubmessageTypeRef(field) + ".serializeBinaryToWriter")
37433737
: "undefined",
@@ -3754,10 +3748,8 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
37543748
"// toObject() will function correctly.\n"
37553749
"$extendName$[$index$] = $class$.$name$;\n"
37563750
"\n",
3757-
"extendName",
3758-
JSExtensionsObjectName(options, field->file(), field->containing_type()),
3759-
"index", absl::StrCat(field->number()), "class", extension_scope, "name",
3760-
extension_object_name);
3751+
"extendName", extension_object_name, "index", absl::StrCat(field->number()),
3752+
"class", extension_scope_name, "name", extension_object_field_name);
37613753
}
37623754

37633755
bool GeneratorOptions::ParseFromOptions(

0 commit comments

Comments
 (0)