• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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