|
|
|
@ -34,7 +34,7 @@ |
|
|
|
|
|
|
|
|
|
#include "google/protobuf/compiler/command_line_interface.h" |
|
|
|
|
|
|
|
|
|
#include "absl/container/btree_map.h" |
|
|
|
|
#include "absl/container/btree_set.h" |
|
|
|
|
#include "absl/container/flat_hash_map.h" |
|
|
|
|
|
|
|
|
|
#include "google/protobuf/stubs/platform_macros.h" |
|
|
|
@ -2212,7 +2212,7 @@ bool CommandLineInterface::GenerateDependencyManifestFile( |
|
|
|
|
DiskSourceTree* source_tree) { |
|
|
|
|
FileDescriptorSet file_set; |
|
|
|
|
|
|
|
|
|
std::set<const FileDescriptor*> already_seen; |
|
|
|
|
absl::flat_hash_set<const FileDescriptor*> already_seen; |
|
|
|
|
for (int i = 0; i < parsed_files.size(); i++) { |
|
|
|
|
GetTransitiveDependencies(parsed_files[i], false, false, &already_seen, |
|
|
|
|
file_set.mutable_file()); |
|
|
|
@ -2293,7 +2293,7 @@ bool CommandLineInterface::GeneratePluginOutput( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::set<const FileDescriptor*> already_seen; |
|
|
|
|
absl::flat_hash_set<const FileDescriptor*> already_seen; |
|
|
|
|
for (int i = 0; i < parsed_files.size(); i++) { |
|
|
|
|
request.add_file_to_generate(parsed_files[i]->name()); |
|
|
|
|
GetTransitiveDependencies(parsed_files[i], |
|
|
|
@ -2442,13 +2442,13 @@ bool CommandLineInterface::WriteDescriptorSet( |
|
|
|
|
const std::vector<const FileDescriptor*>& parsed_files) { |
|
|
|
|
FileDescriptorSet file_set; |
|
|
|
|
|
|
|
|
|
std::set<const FileDescriptor*> already_seen; |
|
|
|
|
absl::flat_hash_set<const FileDescriptor*> already_seen; |
|
|
|
|
if (!imports_in_descriptor_set_) { |
|
|
|
|
// Since we don't want to output transitive dependencies, but we do want
|
|
|
|
|
// things to be in dependency order, add all dependencies that aren't in
|
|
|
|
|
// parsed_files to already_seen. This will short circuit the recursion
|
|
|
|
|
// in GetTransitiveDependencies.
|
|
|
|
|
std::set<const FileDescriptor*> to_output; |
|
|
|
|
absl::flat_hash_set<const FileDescriptor*> to_output; |
|
|
|
|
to_output.insert(parsed_files.begin(), parsed_files.end()); |
|
|
|
|
for (int i = 0; i < parsed_files.size(); i++) { |
|
|
|
|
const FileDescriptor* file = parsed_files[i]; |
|
|
|
@ -2506,7 +2506,7 @@ bool CommandLineInterface::WriteDescriptorSet( |
|
|
|
|
void CommandLineInterface::GetTransitiveDependencies( |
|
|
|
|
const FileDescriptor* file, bool include_json_name, |
|
|
|
|
bool include_source_code_info, |
|
|
|
|
std::set<const FileDescriptor*>* already_seen, |
|
|
|
|
absl::flat_hash_set<const FileDescriptor*>* already_seen, |
|
|
|
|
RepeatedPtrField<FileDescriptorProto>* output) { |
|
|
|
|
if (!already_seen->insert(file).second) { |
|
|
|
|
// Already saw this file. Skip.
|
|
|
|
@ -2579,9 +2579,9 @@ namespace { |
|
|
|
|
// order of the nested messages is also preserved.
|
|
|
|
|
typedef std::pair<int, int> FieldRange; |
|
|
|
|
void GatherOccupiedFieldRanges( |
|
|
|
|
const Descriptor* descriptor, std::set<FieldRange>* ranges, |
|
|
|
|
const Descriptor* descriptor, absl::btree_set<FieldRange>* ranges, |
|
|
|
|
std::vector<const Descriptor*>* nested_messages) { |
|
|
|
|
std::set<const Descriptor*> groups; |
|
|
|
|
absl::flat_hash_set<const Descriptor*> groups; |
|
|
|
|
for (int i = 0; i < descriptor->field_count(); ++i) { |
|
|
|
|
const FieldDescriptor* fd = descriptor->field(i); |
|
|
|
|
ranges->insert(FieldRange(fd->number(), fd->number() + 1)); |
|
|
|
@ -2613,27 +2613,26 @@ void GatherOccupiedFieldRanges( |
|
|
|
|
// Actually prints the formatted free field numbers for given message name and
|
|
|
|
|
// occupied ranges.
|
|
|
|
|
void FormatFreeFieldNumbers(const std::string& name, |
|
|
|
|
const std::set<FieldRange>& ranges) { |
|
|
|
|
const absl::btree_set<FieldRange>& ranges) { |
|
|
|
|
std::string output; |
|
|
|
|
absl::StrAppendFormat(&output, "%-35s free:", name.c_str()); |
|
|
|
|
int next_free_number = 1; |
|
|
|
|
for (std::set<FieldRange>::const_iterator i = ranges.begin(); |
|
|
|
|
i != ranges.end(); ++i) { |
|
|
|
|
for (const auto& range : ranges) { |
|
|
|
|
// This happens when groups re-use parent field numbers, in which
|
|
|
|
|
// case we skip the FieldRange entirely.
|
|
|
|
|
if (next_free_number >= i->second) continue; |
|
|
|
|
if (next_free_number >= range.second) continue; |
|
|
|
|
|
|
|
|
|
if (next_free_number < i->first) { |
|
|
|
|
if (next_free_number + 1 == i->first) { |
|
|
|
|
if (next_free_number < range.first) { |
|
|
|
|
if (next_free_number + 1 == range.first) { |
|
|
|
|
// Singleton
|
|
|
|
|
absl::StrAppendFormat(&output, " %d", next_free_number); |
|
|
|
|
} else { |
|
|
|
|
// Range
|
|
|
|
|
absl::StrAppendFormat(&output, " %d-%d", next_free_number, |
|
|
|
|
i->first - 1); |
|
|
|
|
range.first - 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
next_free_number = i->second; |
|
|
|
|
next_free_number = range.second; |
|
|
|
|
} |
|
|
|
|
if (next_free_number <= FieldDescriptor::kMaxNumber) { |
|
|
|
|
absl::StrAppendFormat(&output, " %d-INF", next_free_number); |
|
|
|
@ -2644,7 +2643,7 @@ void FormatFreeFieldNumbers(const std::string& name, |
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void CommandLineInterface::PrintFreeFieldNumbers(const Descriptor* descriptor) { |
|
|
|
|
std::set<FieldRange> ranges; |
|
|
|
|
absl::btree_set<FieldRange> ranges; |
|
|
|
|
std::vector<const Descriptor*> nested_messages; |
|
|
|
|
GatherOccupiedFieldRanges(descriptor, &ranges, &nested_messages); |
|
|
|
|
|
|
|
|
|