Split a few lightweight functions into code_generator_lite.h

This allows reusing some common string mapping functions in a lightweight library that does not depend on the rest of C++ protobuf.

PiperOrigin-RevId: 672079929
pull/18161/head
Joshua Haberman 5 months ago committed by Copybara-Service
parent 50c3191741
commit ed1a62cc58
  1. 14
      src/google/protobuf/compiler/BUILD.bazel
  2. 35
      src/google/protobuf/compiler/code_generator.cc
  3. 16
      src/google/protobuf/compiler/code_generator.h
  4. 60
      src/google/protobuf/compiler/code_generator_lite.cc
  5. 45
      src/google/protobuf/compiler/code_generator_lite.h

@ -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 = [

@ -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<std::pair<std::string, std::string> >* output) {
std::vector<absl::string_view> 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/");

@ -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<std::pair<std::string, std::string> >*);
// 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);

@ -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 <string>
#include <utility>
#include <vector>
#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<std::pair<std::string, std::string> >* output) {
std::vector<absl::string_view> 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

@ -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 <string>
#include <utility>
#include <vector>
#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<std::pair<std::string, std::string> >*);
// 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__
Loading…
Cancel
Save