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 | #include <map> |
32 | #include <string> |
33 | |
34 | #include <google/protobuf/compiler/objectivec/objectivec_message_field.h> |
35 | #include <google/protobuf/compiler/objectivec/objectivec_helpers.h> |
36 | #include <google/protobuf/io/printer.h> |
37 | |
38 | namespace google { |
39 | namespace protobuf { |
40 | namespace compiler { |
41 | namespace objectivec { |
42 | |
43 | namespace { |
44 | |
45 | void SetMessageVariables(const FieldDescriptor* descriptor, |
46 | std::map<std::string, std::string>* variables) { |
47 | const std::string& message_type = ClassName(descriptor: descriptor->message_type()); |
48 | const std::string& containing_class = |
49 | ClassName(descriptor: descriptor->containing_type()); |
50 | (*variables)["type" ] = message_type; |
51 | (*variables)["containing_class" ] = containing_class; |
52 | (*variables)["storage_type" ] = message_type; |
53 | (*variables)["group_or_message" ] = |
54 | (descriptor->type() == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message" ; |
55 | (*variables)["dataTypeSpecific_value" ] = ObjCClass(class_name: message_type); |
56 | } |
57 | |
58 | } // namespace |
59 | |
60 | MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor) |
61 | : ObjCObjFieldGenerator(descriptor) { |
62 | SetMessageVariables(descriptor, variables: &variables_); |
63 | } |
64 | |
65 | MessageFieldGenerator::~MessageFieldGenerator() {} |
66 | |
67 | void MessageFieldGenerator::DetermineForwardDeclarations( |
68 | std::set<std::string>* fwd_decls, |
69 | bool include_external_types) const { |
70 | ObjCObjFieldGenerator::DetermineForwardDeclarations( |
71 | fwd_decls, include_external_types); |
72 | // Within a file there is no requirement on the order of the messages, so |
73 | // local references need a forward declaration. External files (not WKTs), |
74 | // need one when requested. |
75 | if ((include_external_types && |
76 | !IsProtobufLibraryBundledProtoFile(file: descriptor_->message_type()->file())) || |
77 | descriptor_->file() == descriptor_->message_type()->file()) { |
78 | // Class name is already in "storage_type". |
79 | fwd_decls->insert(x: "@class " + variable(key: "storage_type" )); |
80 | } |
81 | } |
82 | |
83 | void MessageFieldGenerator::DetermineObjectiveCClassDefinitions( |
84 | std::set<std::string>* fwd_decls) const { |
85 | fwd_decls->insert(x: ObjCClassDeclaration(class_name: variable(key: "storage_type" ))); |
86 | } |
87 | |
88 | RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( |
89 | const FieldDescriptor* descriptor) |
90 | : RepeatedFieldGenerator(descriptor) { |
91 | SetMessageVariables(descriptor, variables: &variables_); |
92 | variables_["array_storage_type" ] = "NSMutableArray" ; |
93 | variables_["array_property_type" ] = |
94 | "NSMutableArray<" + variables_["storage_type" ] + "*>" ; |
95 | } |
96 | |
97 | RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} |
98 | |
99 | void RepeatedMessageFieldGenerator::DetermineForwardDeclarations( |
100 | std::set<std::string>* fwd_decls, |
101 | bool include_external_types) const { |
102 | RepeatedFieldGenerator::DetermineForwardDeclarations( |
103 | fwd_decls, include_external_types); |
104 | // Within a file there is no requirement on the order of the messages, so |
105 | // local references need a forward declaration. External files (not WKTs), |
106 | // need one when requested. |
107 | if ((include_external_types && |
108 | !IsProtobufLibraryBundledProtoFile(file: descriptor_->message_type()->file())) || |
109 | descriptor_->file() == descriptor_->message_type()->file()) { |
110 | // Class name is already in "storage_type". |
111 | fwd_decls->insert(x: "@class " + variable(key: "storage_type" )); |
112 | } |
113 | } |
114 | |
115 | void RepeatedMessageFieldGenerator::DetermineObjectiveCClassDefinitions( |
116 | std::set<std::string>* fwd_decls) const { |
117 | fwd_decls->insert(x: ObjCClassDeclaration(class_name: variable(key: "storage_type" ))); |
118 | } |
119 | |
120 | } // namespace objectivec |
121 | } // namespace compiler |
122 | } // namespace protobuf |
123 | } // namespace google |
124 | |