Skip to content

Commit dfa5a70

Browse files
committed
Fix TypeNames so that fields with types defined in same file work.
1 parent e5011de commit dfa5a70

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

generator/js_generator.cc

+35-2
Original file line numberDiff line numberDiff line change
@@ -3956,6 +3956,22 @@ void ReservedForLocalIdentifiers(const FileDescriptor* desc, std::set<std::strin
39563956
}
39573957
}
39583958

3959+
/**
3960+
* ReservedForLocalIdentifiers computes the set of symbols that should not be
3961+
* used for imports because they might conflict with definitions (class names,
3962+
* etc.).
3963+
void RegisterTypesDefinedInGeneratedFile(
3964+
const FileDescriptor* desc,
3965+
std::map<std::string, std::string>& full_name_to_alias) {
3966+
for (int j = 0; j < desc->message_type_count(); j++) {
3967+
ReservedForLocalIdentifiers(desc->message_type(j), reserved_identifiers);
3968+
}
3969+
for (int j = 0; j < desc->enum_type_count(); j++) {
3970+
ReservedForLocalIdentifiers(desc->enum_type(j), reserved_identifiers);
3971+
}
3972+
}
3973+
*/
3974+
39593975
TypeNames TypeNames::Es6TypeNames(
39603976
const GeneratorOptions& options,
39613977
const FileDescriptor* codegen_file) {
@@ -3965,6 +3981,7 @@ TypeNames TypeNames::Es6TypeNames(
39653981
// Local aliases that are already reserved
39663982
std::set<std::string> reserved_aliases;
39673983
ReservedForLocalIdentifiers(codegen_file, reserved_aliases);
3984+
//RegisterTypesDefinedInGeneratedFile(codegen_file, full_name_to_alias);
39683985

39693986
auto pick_name = [&](const std::string full_name, const std::string ideal_name) -> void {
39703987
std::string base_candidate = ideal_name;
@@ -3990,21 +4007,37 @@ TypeNames TypeNames::Es6TypeNames(
39904007
auto register_types = [&](const FileDescriptor* file) -> void {
39914008
for (int j = 0; j < file->message_type_count(); j++) {
39924009
auto message_type = file->message_type(j);
3993-
pick_name(message_type->full_name(), message_type->name());
4010+
if (file == codegen_file) {
4011+
// Ensure that messages and enums declared at top level in the .proto
4012+
// file corresponding to the currently generaed code get identifiers
4013+
// equal to their message identifiers.
4014+
// reserved_aliases was already updated.
4015+
full_name_to_alias.insert(std::make_pair(message_type->full_name(), message_type->name()));
4016+
} else {
4017+
pick_name(message_type->full_name(), message_type->name());
4018+
}
39944019
}
39954020

39964021
for (int j = 0; j < file->enum_type_count(); j++) {
39974022
auto enum_type = file->enum_type(j);
4023+
if (file == codegen_file) {
4024+
// Ensure that messages and enums declared at top level in the .proto
4025+
// file corresponding to the currently generaed code get identifiers
4026+
// equal to their message identifiers.
4027+
// reserved_aliases was already updated.
4028+
full_name_to_alias.insert(std::make_pair(enum_type->full_name(), enum_type->name()));
4029+
} else {
39984030
pick_name(enum_type->full_name(), enum_type->name());
4031+
}
39994032
}
40004033
};
40014034

4035+
register_types(codegen_file);
40024036
// Loop through all dependencies and add their types.
40034037
for (int i = 0; i < codegen_file->dependency_count(); i++) {
40044038
auto dep_file = codegen_file->dependency(i);
40054039
register_types(dep_file);
40064040
}
4007-
register_types(codegen_file);
40084041

40094042
// TODO(reddaly): Replace conflicting identifiers.
40104043
return TypeNames(options, codegen_file, full_name_to_alias);

0 commit comments

Comments
 (0)