diff --git a/src/google/protobuf/compiler/BUILD.bazel b/src/google/protobuf/compiler/BUILD.bazel index ed0cf5a16a..5012ee7936 100644 --- a/src/google/protobuf/compiler/BUILD.bazel +++ b/src/google/protobuf/compiler/BUILD.bazel @@ -95,6 +95,7 @@ cc_library( strip_include_prefix = "/src", visibility = ["//visibility:public"], deps = [ + ":code_generator_lite", "//src/google/protobuf", "//src/google/protobuf:port", "//src/google/protobuf:protobuf_lite", @@ -111,6 +112,19 @@ cc_library( ], ) +cc_library( + name = "code_generator_lite", + srcs = ["code_generator_lite.cc"], + hdrs = ["code_generator_lite.h"], + copts = COPTS, + strip_include_prefix = "/src", + visibility = ["//visibility:public"], + deps = [ + "//src/google/protobuf:port", + "@com_google_absl//absl/strings", + ], +) + cc_library( name = "versions", srcs = [ diff --git a/src/google/protobuf/compiler/code_generator.cc b/src/google/protobuf/compiler/code_generator.cc index 66dd8a1679..c91af364a8 100644 --- a/src/google/protobuf/compiler/code_generator.cc +++ b/src/google/protobuf/compiler/code_generator.cc @@ -108,41 +108,6 @@ void GeneratorContext::GetCompilerVersion(Version* version) const { version->set_suffix(GOOGLE_PROTOBUF_VERSION_SUFFIX); } -// Parses a set of comma-delimited name/value pairs. -void ParseGeneratorParameter( - absl::string_view text, - std::vector >* output) { - std::vector parts = - absl::StrSplit(text, ',', absl::SkipEmpty()); - - for (absl::string_view part : parts) { - auto equals_pos = part.find_first_of('='); - if (equals_pos == absl::string_view::npos) { - output->emplace_back(part, ""); - } else { - output->emplace_back(part.substr(0, equals_pos), - part.substr(equals_pos + 1)); - } - } -} - -// Strips ".proto" or ".protodevel" from the end of a filename. -std::string StripProto(absl::string_view filename) { - if (absl::EndsWith(filename, ".protodevel")) { - return std::string(absl::StripSuffix(filename, ".protodevel")); - } else { - return std::string(absl::StripSuffix(filename, ".proto")); - } -} - -bool IsKnownFeatureProto(absl::string_view filename) { - if (filename == "google/protobuf/cpp_features.proto" || - filename == "google/protobuf/java_features.proto") { - return true; - } - return false; -} - bool CanSkipEditionCheck(absl::string_view filename) { return absl::StartsWith(filename, "google/protobuf/") || absl::StartsWith(filename, "upb/"); diff --git a/src/google/protobuf/compiler/code_generator.h b/src/google/protobuf/compiler/code_generator.h index cabad0c4d1..7d0eb3904f 100644 --- a/src/google/protobuf/compiler/code_generator.h +++ b/src/google/protobuf/compiler/code_generator.h @@ -22,6 +22,7 @@ #include "absl/status/statusor.h" #include "absl/strings/string_view.h" +#include "google/protobuf/compiler/code_generator_lite.h" // IWYU pragma: export #include "google/protobuf/descriptor.h" #include "google/protobuf/descriptor.pb.h" @@ -221,21 +222,6 @@ class PROTOC_EXPORT GeneratorContext { // provides backward compatibility. typedef GeneratorContext OutputDirectory; -// Several code generators treat the parameter argument as holding a -// list of options separated by commas. This helper function parses -// a set of comma-delimited name/value pairs: e.g., -// "foo=bar,baz,moo=corge" -// parses to the pairs: -// ("foo", "bar"), ("baz", ""), ("moo", "corge") -PROTOC_EXPORT void ParseGeneratorParameter( - absl::string_view, std::vector >*); - -// Strips ".proto" or ".protodevel" from the end of a filename. -PROTOC_EXPORT std::string StripProto(absl::string_view filename); - -// Returns true if the proto path corresponds to a known feature file. -PROTOC_EXPORT bool IsKnownFeatureProto(absl::string_view filename); - // Returns true if the proto path can skip edition check. PROTOC_EXPORT bool CanSkipEditionCheck(absl::string_view filename); diff --git a/src/google/protobuf/compiler/code_generator_lite.cc b/src/google/protobuf/compiler/code_generator_lite.cc new file mode 100644 index 0000000000..cecf79e8eb --- /dev/null +++ b/src/google/protobuf/compiler/code_generator_lite.cc @@ -0,0 +1,60 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008-2024 Google Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include "google/protobuf/compiler/code_generator_lite.h" + +#include +#include +#include + +#include "absl/strings/match.h" +#include "absl/strings/str_split.h" +#include "absl/strings/string_view.h" +#include "absl/strings/strip.h" + +namespace google { +namespace protobuf { +namespace compiler { + +// Parses a set of comma-delimited name/value pairs. +void ParseGeneratorParameter( + absl::string_view text, + std::vector >* output) { + std::vector parts = + absl::StrSplit(text, ',', absl::SkipEmpty()); + + for (absl::string_view part : parts) { + auto equals_pos = part.find_first_of('='); + if (equals_pos == absl::string_view::npos) { + output->emplace_back(part, ""); + } else { + output->emplace_back(part.substr(0, equals_pos), + part.substr(equals_pos + 1)); + } + } +} + +// Strips ".proto" or ".protodevel" from the end of a filename. +std::string StripProto(absl::string_view filename) { + if (absl::EndsWith(filename, ".protodevel")) { + return std::string(absl::StripSuffix(filename, ".protodevel")); + } else { + return std::string(absl::StripSuffix(filename, ".proto")); + } +} + +bool IsKnownFeatureProto(absl::string_view filename) { + if (filename == "google/protobuf/cpp_features.proto" || + filename == "google/protobuf/java_features.proto") { + return true; + } + return false; +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/src/google/protobuf/compiler/code_generator_lite.h b/src/google/protobuf/compiler/code_generator_lite.h new file mode 100644 index 0000000000..ca778163ba --- /dev/null +++ b/src/google/protobuf/compiler/code_generator_lite.h @@ -0,0 +1,45 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008-2024 Google Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#ifndef GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_LITE_H__ +#define GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_LITE_H__ + +#include +#include +#include + +#include "absl/strings/string_view.h" + +// Must be included last. +#include "google/protobuf/port_def.inc" + +namespace google { +namespace protobuf { +namespace compiler { + +// Several code generators treat the parameter argument as holding a +// list of options separated by commas. This helper function parses +// a set of comma-delimited name/value pairs: e.g., +// "foo=bar,baz,moo=corge" +// parses to the pairs: +// ("foo", "bar"), ("baz", ""), ("moo", "corge") +PROTOC_EXPORT void ParseGeneratorParameter( + absl::string_view, std::vector >*); + +// Strips ".proto" or ".protodevel" from the end of a filename. +PROTOC_EXPORT std::string StripProto(absl::string_view filename); + +// Returns true if the proto path corresponds to a known feature file. +PROTOC_EXPORT bool IsKnownFeatureProto(absl::string_view filename); + +} // namespace compiler +} // namespace protobuf +} // namespace google + +#include "google/protobuf/port_undef.inc" + +#endif // GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_LITE_H__