1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7
8 // Author: kenton@google.com (Kenton Varda)
9 // Based on original Protocol Buffers design by
10 // Sanjay Ghemawat, Jeff Dean, and others.
11
12 #include "google/protobuf/compiler/java/lite/make_field_gens.h"
13
14 #include <memory>
15 #include <utility>
16
17 #include "google/protobuf/compiler/java/context.h"
18 #include "google/protobuf/compiler/java/generator_common.h"
19 #include "google/protobuf/compiler/java/helpers.h"
20 #include "google/protobuf/compiler/java/lite/enum_field.h"
21 #include "google/protobuf/compiler/java/lite/field_generator.h"
22 #include "google/protobuf/compiler/java/lite/map_field.h"
23 #include "google/protobuf/compiler/java/lite/message_field.h"
24 #include "google/protobuf/compiler/java/lite/primitive_field.h"
25 #include "google/protobuf/compiler/java/lite/string_field.h"
26
27 namespace google {
28 namespace protobuf {
29 namespace compiler {
30 namespace java {
31
32 namespace {
33
CreateImmutableLiteGenerator(const FieldDescriptor * field,int messageBitIndex,Context * context)34 std::unique_ptr<ImmutableFieldLiteGenerator> CreateImmutableLiteGenerator(
35 const FieldDescriptor* field, int messageBitIndex, Context* context) {
36 if (field->is_repeated()) {
37 switch (GetJavaType(field)) {
38 case JAVATYPE_MESSAGE:
39 if (IsMapEntry(field->message_type())) {
40 return std::make_unique<ImmutableMapFieldLiteGenerator>(
41 field, messageBitIndex, context);
42 } else {
43 return std::make_unique<RepeatedImmutableMessageFieldLiteGenerator>(
44 field, messageBitIndex, context);
45 }
46 case JAVATYPE_ENUM:
47 return std::make_unique<RepeatedImmutableEnumFieldLiteGenerator>(
48 field, messageBitIndex, context);
49 case JAVATYPE_STRING:
50 return std::make_unique<RepeatedImmutableStringFieldLiteGenerator>(
51 field, messageBitIndex, context);
52 default:
53 return std::make_unique<RepeatedImmutablePrimitiveFieldLiteGenerator>(
54 field, messageBitIndex, context);
55 }
56 } else {
57 if (IsRealOneof(field)) {
58 switch (GetJavaType(field)) {
59 case JAVATYPE_MESSAGE:
60 return std::make_unique<ImmutableMessageOneofFieldLiteGenerator>(
61 field, messageBitIndex, context);
62 case JAVATYPE_ENUM:
63 return std::make_unique<ImmutableEnumOneofFieldLiteGenerator>(
64 field, messageBitIndex, context);
65 case JAVATYPE_STRING:
66 return std::make_unique<ImmutableStringOneofFieldLiteGenerator>(
67 field, messageBitIndex, context);
68 default:
69 return std::make_unique<ImmutablePrimitiveOneofFieldLiteGenerator>(
70 field, messageBitIndex, context);
71 }
72 } else {
73 switch (GetJavaType(field)) {
74 case JAVATYPE_MESSAGE:
75 return std::make_unique<ImmutableMessageFieldLiteGenerator>(
76 field, messageBitIndex, context);
77 case JAVATYPE_ENUM:
78 return std::make_unique<ImmutableEnumFieldLiteGenerator>(
79 field, messageBitIndex, context);
80 case JAVATYPE_STRING:
81 return std::make_unique<ImmutableStringFieldLiteGenerator>(
82 field, messageBitIndex, context);
83 default:
84 return std::make_unique<ImmutablePrimitiveFieldLiteGenerator>(
85 field, messageBitIndex, context);
86 }
87 }
88 }
89 }
90
91 } // namespace
92
MakeImmutableFieldLiteGenerators(const Descriptor * descriptor,Context * context)93 FieldGeneratorMap<ImmutableFieldLiteGenerator> MakeImmutableFieldLiteGenerators(
94 const Descriptor* descriptor, Context* context) {
95 int messageBitIndex = 0;
96 FieldGeneratorMap<ImmutableFieldLiteGenerator> field_generators(descriptor);
97 for (int i = 0; i < descriptor->field_count(); i++) {
98 const FieldDescriptor* field = descriptor->field(i);
99 auto generator =
100 CreateImmutableLiteGenerator(field, messageBitIndex, context);
101 messageBitIndex += generator->GetNumBitsForMessage();
102 field_generators.Add(field, std::move(generator));
103 }
104 return field_generators;
105 }
106
107 } // namespace java
108 } // namespace compiler
109 } // namespace protobuf
110 } // namespace google
111