@@ -3956,6 +3956,22 @@ void ReservedForLocalIdentifiers(const FileDescriptor* desc, std::set<std::strin
3956
3956
}
3957
3957
}
3958
3958
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
+
3959
3975
TypeNames TypeNames::Es6TypeNames (
3960
3976
const GeneratorOptions& options,
3961
3977
const FileDescriptor* codegen_file) {
@@ -3965,6 +3981,7 @@ TypeNames TypeNames::Es6TypeNames(
3965
3981
// Local aliases that are already reserved
3966
3982
std::set<std::string> reserved_aliases;
3967
3983
ReservedForLocalIdentifiers (codegen_file, reserved_aliases);
3984
+ // RegisterTypesDefinedInGeneratedFile(codegen_file, full_name_to_alias);
3968
3985
3969
3986
auto pick_name = [&](const std::string full_name, const std::string ideal_name) -> void {
3970
3987
std::string base_candidate = ideal_name;
@@ -3990,21 +4007,37 @@ TypeNames TypeNames::Es6TypeNames(
3990
4007
auto register_types = [&](const FileDescriptor* file) -> void {
3991
4008
for (int j = 0 ; j < file->message_type_count (); j++) {
3992
4009
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
+ }
3994
4019
}
3995
4020
3996
4021
for (int j = 0 ; j < file->enum_type_count (); j++) {
3997
4022
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 {
3998
4030
pick_name (enum_type->full_name (), enum_type->name ());
4031
+ }
3999
4032
}
4000
4033
};
4001
4034
4035
+ register_types (codegen_file);
4002
4036
// Loop through all dependencies and add their types.
4003
4037
for (int i = 0 ; i < codegen_file->dependency_count (); i++) {
4004
4038
auto dep_file = codegen_file->dependency (i);
4005
4039
register_types (dep_file);
4006
4040
}
4007
- register_types (codegen_file);
4008
4041
4009
4042
// TODO(reddaly): Replace conflicting identifiers.
4010
4043
return TypeNames (options, codegen_file, full_name_to_alias);
0 commit comments