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_FILE_H__
32#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__
33
34#include <map>
35#include <set>
36#include <string>
37#include <vector>
38#include <google/protobuf/descriptor.h>
39#include <google/protobuf/io/printer.h>
40
41namespace google {
42namespace protobuf {
43namespace compiler {
44namespace objectivec {
45
46class EnumGenerator;
47class ExtensionGenerator;
48class MessageGenerator;
49
50class FileGenerator {
51 public:
52 struct GenerationOptions {
53 GenerationOptions()
54 // TODO(thomasvl): Eventually flip this default to false for better
55 // interop with Swift if proto usages span modules made from ObjC sources.
56 : headers_use_forward_declarations(true) {}
57 std::string generate_for_named_framework;
58 std::string named_framework_to_proto_path_mappings_path;
59 std::string runtime_import_prefix;
60 bool headers_use_forward_declarations;
61 };
62
63 // Wrapper for some common state that is shared between file generations to
64 // improve performance when more than one file is generated at a time.
65 struct CommonState {
66 CommonState();
67
68 const std::vector<const FileDescriptor*>
69 CollectMinimalFileDepsContainingExtensions(const FileDescriptor* file);
70
71 private:
72 struct MinDepsEntry {
73 bool has_extensions;
74 std::set<const FileDescriptor*> min_deps;
75 // `covered_deps` are the transtive deps of `min_deps_w_exts` that also
76 // have extensions.
77 std::set<const FileDescriptor*> covered_deps;
78 };
79 const MinDepsEntry& CollectMinimalFileDepsContainingExtensionsInternal(const FileDescriptor* file);
80 std::map<const FileDescriptor*, MinDepsEntry> deps_info_cache_;
81 };
82
83 FileGenerator(const FileDescriptor* file,
84 const GenerationOptions& generation_options,
85 CommonState& common_state);
86 ~FileGenerator();
87
88 FileGenerator(const FileGenerator&) = delete;
89 FileGenerator& operator=(const FileGenerator&) = delete;
90
91 void GenerateSource(io::Printer* printer);
92 void GenerateHeader(io::Printer* printer);
93
94 private:
95 const FileDescriptor* file_;
96 const GenerationOptions& generation_options_;
97 CommonState& common_state_;
98 std::string root_class_name_;
99 bool is_bundled_proto_;
100
101 std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
102 std::vector<std::unique_ptr<MessageGenerator>> message_generators_;
103 std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
104
105 void PrintFileRuntimePreamble(
106 io::Printer* printer,
107 const std::vector<std::string>& headers_to_import) const;
108};
109
110} // namespace objectivec
111} // namespace compiler
112} // namespace protobuf
113} // namespace google
114
115#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__
116