Internal change

PiperOrigin-RevId: 970105512
diff --git a/src/google/protobuf/compiler/java/full/oneof_generator.cc b/src/google/protobuf/compiler/java/full/oneof_generator.cc
index e39b65a..55c6f3c 100644
--- a/src/google/protobuf/compiler/java/full/oneof_generator.cc
+++ b/src/google/protobuf/compiler/java/full/oneof_generator.cc
@@ -30,28 +30,40 @@
 namespace compiler {
 namespace java {
 
+namespace {
+
+void SetOneofVariables(
+    const OneofDescriptor* descriptor, Context* context,
+    absl::flat_hash_map<absl::string_view, std::string>* variables) {
+  (*variables)["oneof_name"] = context->GetOneofGeneratorInfo(descriptor)->name;
+  (*variables)["oneof_capitalized_name"] =
+      context->GetOneofGeneratorInfo(descriptor)->capitalized_name;
+  (*variables)["oneof_index"] = absl::StrCat(descriptor->index());
+  (*variables)["cap_oneof_name"] =
+      absl::AsciiStrToUpper((*variables)["oneof_name"]);
+  (*variables)["classname"] = context->GetNameResolver()->GetImmutableClassName(
+      descriptor->containing_type());
+  // These variables are placeholders to pick out the beginning and ends of
+  // identifiers for annotations (when doing so with existing variables
+  // would be ambiguous or impossible). They should never be set to anything
+  // but the empty string.
+  (*variables)["{"] = "";
+  (*variables)["}"] = "";
+}
+
+}  // namespace
+
 OneofGenerator::OneofGenerator(const OneofDescriptor* descriptor,
                                Context* context)
-    : descriptor_(descriptor), context_(context) {}
+    : descriptor_(descriptor) {
+  SetOneofVariables(descriptor, context, &variables_);
+}
 
 OneofGenerator::~OneofGenerator() = default;
 
 void OneofGenerator::GenerateCommonBuilderMethods(io::Printer* printer) const {
-  absl::flat_hash_map<absl::string_view, std::string> vars = {
-      // These variables are placeholders to pick out the beginning and ends of
-      // identifiers for annotations (when doing so with existing variables
-      // would be ambiguous or impossible). They should never be set to anything
-      // but the empty string.
-      {"{", ""},
-      {"}", ""},
-  };
-  vars["oneof_name"] = context_->GetOneofGeneratorInfo(descriptor_)->name;
-  vars["oneof_capitalized_name"] =
-      context_->GetOneofGeneratorInfo(descriptor_)->capitalized_name;
-  vars["oneof_index"] = absl::StrCat(descriptor_->index());
-
   // oneofCase_ and oneof_
-  printer->Print(vars,
+  printer->Print(variables_,
                  "private int $oneof_name$Case_ = 0;\n"
                  "private java.lang.Object $oneof_name$_;\n");
   GenerateBuilderGetOneofCase(printer);
@@ -59,15 +71,7 @@
 }
 
 void OneofGenerator::GenerateBuilderGetOneofCase(io::Printer* printer) const {
-  absl::flat_hash_map<absl::string_view, std::string> vars = {
-      {"{", ""},
-      {"}", ""},
-  };
-  vars["oneof_name"] = context_->GetOneofGeneratorInfo(descriptor_)->name;
-  vars["oneof_capitalized_name"] =
-      context_->GetOneofGeneratorInfo(descriptor_)->capitalized_name;
-
-  printer->Print(vars,
+  printer->Print(variables_,
                  "public $oneof_capitalized_name$Case\n"
                  "    ${$get$oneof_capitalized_name$Case$}$() {\n"
                  "  return $oneof_capitalized_name$Case.forNumber(\n"
@@ -77,15 +81,7 @@
 }
 
 void OneofGenerator::GenerateBuilderClearOneof(io::Printer* printer) const {
-  absl::flat_hash_map<absl::string_view, std::string> vars = {
-      {"{", ""},
-      {"}", ""},
-  };
-  vars["oneof_name"] = context_->GetOneofGeneratorInfo(descriptor_)->name;
-  vars["oneof_capitalized_name"] =
-      context_->GetOneofGeneratorInfo(descriptor_)->capitalized_name;
-
-  printer->Print(vars,
+  printer->Print(variables_,
                  "\n"
                  "public Builder ${$clear$oneof_capitalized_name$$}$() {\n"
                  "  $oneof_name$Case_ = 0;\n"
@@ -99,19 +95,16 @@
 }
 
 void OneofGenerator::GenerateBuilderClearMethod(io::Printer* printer) const {
-  printer->Print(
-      "$oneof_name$Case_ = 0;\n"
-      "$oneof_name$_ = null;\n",
-      "oneof_name", context_->GetOneofGeneratorInfo(descriptor_)->name);
+  printer->Print(variables_,
+                 "$oneof_name$Case_ = 0;\n"
+                 "$oneof_name$_ = null;\n");
 }
 
 void OneofGenerator::GenerateMergingCode(
     io::Printer* printer,
     const FieldGeneratorMap<ImmutableFieldGenerator>& field_generators) const {
-  printer->Print(
-      "switch (other.get$oneof_capitalized_name$Case()) {\n",
-      "oneof_capitalized_name",
-      context_->GetOneofGeneratorInfo(descriptor_)->capitalized_name);
+  printer->Print(variables_,
+                 "switch (other.get$oneof_capitalized_name$Case()) {\n");
   printer->Indent();
   for (int j = 0; j < descriptor_->field_count(); j++) {
     const FieldDescriptor* field = descriptor_->field(j);
@@ -119,28 +112,25 @@
                    absl::AsciiStrToUpper(field->name()));
     printer->Indent();
     field_generators.get(field).GenerateMergingCode(printer);
-    printer->Print("break;\n");
     printer->Outdent();
-    printer->Print("}\n");
+    printer->Print(
+        "  break;\n"
+        "}\n");
   }
-  printer->Print(
-      "case $cap_oneof_name$_NOT_SET: {\n"
-      "  break;\n"
-      "}\n",
-      "cap_oneof_name",
-      absl::AsciiStrToUpper(
-          context_->GetOneofGeneratorInfo(descriptor_)->name));
   printer->Outdent();
-  printer->Print("}\n");
+  printer->Print(variables_,
+                 "  case $cap_oneof_name$_NOT_SET: {\n"
+                 "    break;\n"
+                 "  }\n"
+                 "}\n");
 }
 
 void OneofGenerator::GenerateBuildingCode(
     io::Printer* printer,
     const FieldGeneratorMap<ImmutableFieldGenerator>& field_generators) const {
-  printer->Print(
-      "result.$oneof_name$Case_ = $oneof_name$Case_;\n"
-      "result.$oneof_name$_ = this.$oneof_name$_;\n",
-      "oneof_name", context_->GetOneofGeneratorInfo(descriptor_)->name);
+  printer->Print(variables_,
+                 "result.$oneof_name$Case_ = $oneof_name$Case_;\n"
+                 "result.$oneof_name$_ = this.$oneof_name$_;\n");
   for (int i = 0; i < descriptor_->field_count(); ++i) {
     if (descriptor_->field(i)->message_type() != nullptr) {
       const ImmutableFieldGenerator& field =
@@ -151,34 +141,22 @@
 }
 
 void OneofGenerator::GenerateInterfaceMembers(io::Printer* printer) const {
-  printer->Print(
-      "\n"
-      "$classname$.$oneof_capitalized_name$Case "
-      "get$oneof_capitalized_name$Case();\n",
-      "oneof_capitalized_name",
-      context_->GetOneofGeneratorInfo(descriptor_)->capitalized_name,
-      "classname",
-      context_->GetNameResolver()->GetImmutableClassName(
-          descriptor_->containing_type()));
+  printer->Print(variables_,
+                 "\n"
+                 "$classname$.$oneof_capitalized_name$Case "
+                 "get$oneof_capitalized_name$Case();\n");
 }
 
 void OneofGenerator::GenerateMembers(io::Printer* printer) const {
-  absl::flat_hash_map<absl::string_view, std::string> vars;
   const OneofDescriptor* oneof = descriptor_;
-  vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
-  vars["oneof_capitalized_name"] =
-      context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
-  vars["oneof_index"] = absl::StrCat((oneof)->index());
-  vars["{"] = "";
-  vars["}"] = "";
   // oneofCase_ and oneof_
-  printer->Print(vars,
+  printer->Print(variables_,
                  "private int $oneof_name$Case_ = 0;\n"
                  "@SuppressWarnings(\"serial\")\n"
                  "private java.lang.Object $oneof_name$_;\n");
   // OneofCase enum
   printer->Print(
-      vars,
+      variables_,
       "public enum ${$$oneof_capitalized_name$Case$}$\n"
       // TODO: Remove EnumLite when we want to break compatibility with
       // 3.x users
@@ -195,16 +173,15 @@
         absl::StrCat(field->number()));
     printer->Annotate("field_name", field);
   }
-  printer->Print("$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name",
-                 absl::AsciiStrToUpper(vars["oneof_name"]));
-  printer->Print(vars,
+  printer->Print(variables_, "$cap_oneof_name$_NOT_SET(0);\n");
+  printer->Print(variables_,
                  "private final int value;\n"
                  "private $oneof_capitalized_name$Case(int value) {\n"
                  "  this.value = value;\n"
                  "}\n");
   if (google::protobuf::internal::IsOss()) {
     printer->Print(
-        vars,
+        variables_,
         "/**\n"
         " * @param value The number of the enum to look for.\n"
         " * @return The enum associated with the given number.\n"
@@ -220,7 +197,7 @@
     printer->Print("@com.google.protobuf.Internal.ProtoMethodMayReturnNull\n");
   }
   printer->Print(
-      vars,
+      variables_,
       "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
       "  switch (value) {\n");
   for (int j = 0; j < (oneof)->field_count(); j++) {
@@ -229,19 +206,18 @@
                    "field_number", absl::StrCat(field->number()), "field_name",
                    absl::AsciiStrToUpper(field->name()));
   }
-  printer->Print(
-      "    case 0: return $cap_oneof_name$_NOT_SET;\n"
-      "    default: return null;\n"
-      "  }\n"
-      "}\n"
-      "public int getNumber() {\n"
-      "  return this.value;\n"
-      "}\n",
-      "cap_oneof_name", absl::AsciiStrToUpper(vars["oneof_name"]));
+  printer->Print(variables_,
+                 "    case 0: return $cap_oneof_name$_NOT_SET;\n"
+                 "    default: return null;\n"
+                 "  }\n"
+                 "}\n"
+                 "public int getNumber() {\n"
+                 "  return this.value;\n"
+                 "}\n");
   printer->Outdent();
   printer->Print("};\n\n");
   // oneofCase()
-  printer->Print(vars,
+  printer->Print(variables_,
                  "public $oneof_capitalized_name$Case\n"
                  "${$get$oneof_capitalized_name$Case$}$() {\n"
                  "  return $oneof_capitalized_name$Case.forNumber(\n"
@@ -255,13 +231,10 @@
     io::Printer* printer,
     const FieldGeneratorMap<ImmutableFieldGenerator>& field_generators) const {
   const OneofDescriptor* oneof = descriptor_;
-  printer->Print(
-      "if (!get$oneof_capitalized_name$Case().equals("
-      "other.get$oneof_capitalized_name$Case())) return false;\n",
-      "oneof_capitalized_name",
-      context_->GetOneofGeneratorInfo(oneof)->capitalized_name);
-  printer->Print("switch ($oneof_name$Case_) {\n", "oneof_name",
-                 context_->GetOneofGeneratorInfo(oneof)->name);
+  printer->Print(variables_,
+                 "if (!get$oneof_capitalized_name$Case().equals("
+                 "other.get$oneof_capitalized_name$Case())) return false;\n");
+  printer->Print(variables_, "switch ($oneof_name$Case_) {\n");
   printer->Indent();
   for (int j = 0; j < (oneof)->field_count(); j++) {
     const FieldDescriptor* field = (oneof)->field(j);
@@ -272,19 +245,18 @@
     printer->Print("break;\n");
     printer->Outdent();
   }
-  printer->Print(
-      "case 0:\n"
-      "default:\n");
   printer->Outdent();
-  printer->Print("}\n");
+  printer->Print(
+      "  case 0:\n"
+      "  default:\n"
+      "}\n");
 }
 
 void OneofGenerator::GenerateHashCode(
     io::Printer* printer,
     const FieldGeneratorMap<ImmutableFieldGenerator>& field_generators) const {
   const OneofDescriptor* oneof = descriptor_;
-  printer->Print("switch ($oneof_name$Case_) {\n", "oneof_name",
-                 context_->GetOneofGeneratorInfo(oneof)->name);
+  printer->Print(variables_, "switch ($oneof_name$Case_) {\n");
   printer->Indent();
   for (int j = 0; j < (oneof)->field_count(); j++) {
     const FieldDescriptor* field = (oneof)->field(j);
@@ -295,11 +267,11 @@
     printer->Print("break;\n");
     printer->Outdent();
   }
-  printer->Print(
-      "case 0:\n"
-      "default:\n");
   printer->Outdent();
-  printer->Print("}\n");
+  printer->Print(
+      "  case 0:\n"
+      "  default:\n"
+      "}\n");
 }
 }  // namespace java
 }  // namespace compiler
diff --git a/src/google/protobuf/compiler/java/full/oneof_generator.h b/src/google/protobuf/compiler/java/full/oneof_generator.h
index cee77e2..27511cb 100644
--- a/src/google/protobuf/compiler/java/full/oneof_generator.h
+++ b/src/google/protobuf/compiler/java/full/oneof_generator.h
@@ -12,6 +12,10 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_IMMUTABLE_ONEOF_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_IMMUTABLE_ONEOF_GENERATOR_H__
 
+#include <string>
+
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/string_view.h"
 #include "google/protobuf/compiler/java/full/field_generator.h"
 #include "google/protobuf/descriptor.h"
 
@@ -64,7 +68,7 @@
   void GenerateBuilderClearOneof(io::Printer* printer) const;
 
   const OneofDescriptor* descriptor_;
-  Context* context_;
+  absl::flat_hash_map<absl::string_view, std::string> variables_;
 };
 
 }  // namespace java