1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__
32#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__
33
34#include <string>
35#include <set>
36#include <vector>
37#include <google/protobuf/compiler/objectivec/objectivec_field.h>
38#include <google/protobuf/compiler/objectivec/objectivec_oneof.h>
39#include <google/protobuf/descriptor.h>
40#include <google/protobuf/io/printer.h>
41
42namespace google {
43namespace protobuf {
44namespace compiler {
45namespace objectivec {
46
47class ExtensionGenerator;
48class EnumGenerator;
49
50class MessageGenerator {
51 public:
52 MessageGenerator(const std::string& root_classname,
53 const Descriptor* descriptor);
54 ~MessageGenerator();
55
56 MessageGenerator(const MessageGenerator&) = delete;
57 MessageGenerator& operator=(const MessageGenerator&) = delete;
58
59 void GenerateStaticVariablesInitialization(io::Printer* printer);
60 void GenerateEnumHeader(io::Printer* printer);
61 void GenerateMessageHeader(io::Printer* printer);
62 void GenerateSource(io::Printer* printer);
63 void GenerateExtensionRegistrationSource(io::Printer* printer);
64 void DetermineObjectiveCClassDefinitions(std::set<std::string>* fwd_decls);
65 void DetermineForwardDeclarations(std::set<std::string>* fwd_decls,
66 bool include_external_types);
67
68 // Checks if the message or a nested message includes a oneof definition.
69 bool IncludesOneOfDefinition() const;
70
71 private:
72 void GenerateParseFromMethodsHeader(io::Printer* printer);
73
74 void GenerateSerializeOneFieldSource(io::Printer* printer,
75 const FieldDescriptor* field);
76 void GenerateSerializeOneExtensionRangeSource(
77 io::Printer* printer, const Descriptor::ExtensionRange* range);
78
79 void GenerateMessageDescriptionSource(io::Printer* printer);
80 void GenerateDescriptionOneFieldSource(io::Printer* printer,
81 const FieldDescriptor* field);
82
83 const std::string root_classname_;
84 const Descriptor* descriptor_;
85 FieldGeneratorMap field_generators_;
86 const std::string class_name_;
87 const std::string deprecated_attribute_;
88 std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
89 std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
90 std::vector<std::unique_ptr<MessageGenerator>> nested_message_generators_;
91 std::vector<std::unique_ptr<OneofGenerator>> oneof_generators_;
92};
93
94} // namespace objectivec
95} // namespace compiler
96} // namespace protobuf
97} // namespace google
98
99#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__
100