Skip to content

Commit 7f11c3e

Browse files
author
Dave Masselink
authored
Support protobuf extend keyword when in kImportEs6 mode (#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 978cfa4 commit 7f11c3e

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

generator/js_generator.cc

+25-33
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,9 @@ std::string RelativeTypeName(const FieldDescriptor* field) {
12401240
std::string JSExtensionsObjectName(const GeneratorOptions& options,
12411241
const FileDescriptor* from_file,
12421242
const Descriptor* desc) {
1243-
if (desc->full_name() == "google.protobuf.bridge.MessageSet") {
1243+
if (options.WantEs6()) {
1244+
return TypeNames::JsName(desc->name()) + ".extensions";
1245+
} else if (desc->full_name() == "google.protobuf.bridge.MessageSet") {
12441246
// TODO(haberman): fix this for the kImportCommonJs case.
12451247
return "jspb.Message.messageSetExtensions";
12461248
} else {
@@ -2071,7 +2073,7 @@ void Generator::GenerateClassEs6(const GeneratorOptions& options,
20712073

20722074
printer->Indent();
20732075

2074-
GenerateClassConstructor(options, printer, desc);
2076+
GenerateClassConstructorAndDeclareExtensionFieldInfo(options, printer, desc);
20752077

20762078
GenerateClassFieldInfo(options, printer, desc);
20772079

@@ -2181,12 +2183,6 @@ void Generator::GenerateClassConstructorAndDeclareExtensionFieldInfo(
21812183
GenerateClassExtensionFieldInfo(options, printer, desc);
21822184
}
21832185
}
2184-
for (int i = 0; i < desc->nested_type_count(); i++) {
2185-
if (!IgnoreMessage(desc->nested_type(i))) {
2186-
GenerateClassConstructorAndDeclareExtensionFieldInfo(
2187-
options, printer, desc->nested_type(i));
2188-
}
2189-
}
21902186
}
21912187

21922188
void Generator::GenerateClassFieldInfo(const GeneratorOptions& options,
@@ -3238,9 +3234,8 @@ void Generator::GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
32383234
" *\n"
32393235
" * @type {!Object<number, jspb.ExtensionFieldInfo>}\n"
32403236
" */\n"
3241-
"$class$.extensions = {};\n"
3242-
"\n",
3243-
"class", GetMessagePath(options, desc));
3237+
"static extensions = {};\n"
3238+
"\n");
32443239

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

@@ -3666,22 +3660,23 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
36663660
const TypeNames& type_names,
36673661
io::Printer* printer,
36683662
const FieldDescriptor* field) const {
3669-
std::string extension_scope =
3670-
(field->extension_scope()
3671-
? GetMessagePath(options, field->extension_scope())
3672-
: GetNamespace(options, field->file()));
3663+
std::string extension_scope_name =
3664+
(field->containing_type()
3665+
? TypeNames::JsName(field->containing_type()->name())
3666+
: GetNamespace(options, field->file()));
3667+
std::string extension_object_name =
3668+
JSExtensionsObjectName(options, field->file(), field->containing_type());
3669+
std::string extension_object_field_name = JSObjectFieldName(options, field);
36733670

3674-
const std::string extension_object_name = JSObjectFieldName(options, field);
36753671
printer->Print(
36763672
"\n"
36773673
"/**\n"
36783674
" * A tuple of {field number, class constructor} for the extension\n"
3679-
" * field named `$nameInComment$`.\n"
3675+
" * field named `$name$`.\n"
36803676
" * @type {!jspb.ExtensionFieldInfo<$extensionType$>}\n"
36813677
" */\n"
36823678
"$class$.$name$ = new jspb.ExtensionFieldInfo(\n",
3683-
"nameInComment", extension_object_name, "name", extension_object_name,
3684-
"class", extension_scope, "extensionType",
3679+
"class", extension_scope_name, "name", extension_object_field_name, "extensionType",
36853680
JSFieldTypeAnnotation(options, field,
36863681
/* is_setter_argument = */ false,
36873682
/* force_present = */ true,
@@ -3695,7 +3690,7 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
36953690
"!Object} */ (\n"
36963691
" $toObject$),\n"
36973692
" $repeated$);\n",
3698-
"index", StrCat(field->number()), "name", extension_object_name, "ctor",
3693+
"index", StrCat(field->number()), "name", extension_object_field_name, "ctor",
36993694
(field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE
37003695
? type_names.SubmessageTypeRef(field)
37013696
: std::string("null")),
@@ -3713,12 +3708,11 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
37133708
" $binaryWriterFn$,\n"
37143709
" $binaryMessageSerializeFn$,\n"
37153710
" $binaryMessageDeserializeFn$,\n",
3716-
"extendName",
3717-
JSExtensionsObjectName(options, field->file(), field->containing_type()),
3718-
"index", StrCat(field->number()), "class", extension_scope, "name",
3719-
extension_object_name, "binaryReaderFn",
3720-
JSBinaryReaderMethodName(options, field), "binaryWriterFn",
3721-
JSBinaryWriterMethodName(options, field), "binaryMessageSerializeFn",
3711+
"extendName", extension_object_name, "index", StrCat(field->number()),
3712+
"class", extension_scope_name, "name", extension_object_field_name,
3713+
"binaryReaderFn", JSBinaryReaderMethodName(options, field),
3714+
"binaryWriterFn", JSBinaryWriterMethodName(options, field),
3715+
"binaryMessageSerializeFn",
37223716
(field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE)
37233717
? (type_names.SubmessageTypeRef(field) + ".serializeBinaryToWriter")
37243718
: "undefined",
@@ -3735,10 +3729,8 @@ void Generator::GenerateExtension(const GeneratorOptions& options,
37353729
"// toObject() will function correctly.\n"
37363730
"$extendName$[$index$] = $class$.$name$;\n"
37373731
"\n",
3738-
"extendName",
3739-
JSExtensionsObjectName(options, field->file(), field->containing_type()),
3740-
"index", StrCat(field->number()), "class", extension_scope, "name",
3741-
extension_object_name);
3732+
"extendName", extension_object_name, "index", StrCat(field->number()),
3733+
"class", extension_scope_name, "name", extension_object_field_name);
37423734
}
37433735

37443736
bool GeneratorOptions::ParseFromOptions(

0 commit comments

Comments
 (0)