Line data Source code
1 : // Protocol Buffers - Google's data interchange format
2 : // Copyright 2008 Google Inc. All rights reserved.
3 : // http://code.google.com/p/protobuf/
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 : // Author: kenton@google.com (Kenton Varda)
32 : // Based on original Protocol Buffers design by
33 : // Sanjay Ghemawat, Jeff Dean, and others.
34 :
35 : #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__
36 : #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__
37 :
38 : #include <string>
39 : #include <google/protobuf/compiler/javanano/javanano_params.h>
40 : #include <google/protobuf/descriptor.pb.h>
41 : #include <google/protobuf/descriptor.h>
42 : #include <google/protobuf/io/printer.h>
43 :
44 : namespace google {
45 : namespace protobuf {
46 : namespace compiler {
47 : namespace javanano {
48 :
49 : // Commonly-used separator comments. Thick is a line of '=', thin is a line
50 : // of '-'.
51 : extern const char kThickSeparator[];
52 : extern const char kThinSeparator[];
53 :
54 : // Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes
55 : // "fooBarBaz" or "FooBarBaz", respectively.
56 : string UnderscoresToCamelCase(const FieldDescriptor* field);
57 : string UnderscoresToCamelCase(const OneofDescriptor* oneof);
58 : string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field);
59 : string UnderscoresToCapitalizedCamelCase(const OneofDescriptor* oneof);
60 :
61 : // Appends an "_" to the end of a field where the name is a reserved java
62 : // keyword. For example int32 public = 1 will generate int public_.
63 : string RenameJavaKeywords(const string& input);
64 :
65 : // Similar, but for method names. (Typically, this merely has the effect
66 : // of lower-casing the first letter of the name.)
67 : string UnderscoresToCamelCase(const MethodDescriptor* method);
68 :
69 : // Strips ".proto" or ".protodevel" from the end of a filename.
70 : string StripProto(const string& filename);
71 :
72 : // Gets the unqualified class name for the file. Each .proto file becomes a
73 : // single Java class, with all its contents nested in that class.
74 : string FileClassName(const Params& params, const FileDescriptor* file);
75 :
76 : // Returns the file's Java package name.
77 : string FileJavaPackage(const Params& params, const FileDescriptor* file);
78 :
79 : // Returns whether the Java outer class is needed, i.e. whether the option
80 : // java_multiple_files is false, or the proto file contains any file-scope
81 : // enums/extensions.
82 : bool IsOuterClassNeeded(const Params& params, const FileDescriptor* file);
83 :
84 : // Converts the given simple name of a proto entity to its fully-qualified name
85 : // in the Java namespace, given that it is in the given file enclosed in the
86 : // given parent message (or NULL for file-scope entities). Whether the file's
87 : // outer class name should be included in the return value depends on factors
88 : // inferrable from the given arguments, including is_class which indicates
89 : // whether the entity translates to a Java class.
90 : string ToJavaName(const Params& params, const string& name, bool is_class,
91 : const Descriptor* parent, const FileDescriptor* file);
92 :
93 : // These return the fully-qualified class name corresponding to the given
94 : // descriptor.
95 0 : inline string ClassName(const Params& params, const Descriptor* descriptor) {
96 0 : return ToJavaName(params, descriptor->name(), true,
97 0 : descriptor->containing_type(), descriptor->file());
98 : }
99 : string ClassName(const Params& params, const EnumDescriptor* descriptor);
100 : inline string ClassName(const Params& params,
101 : const ServiceDescriptor* descriptor) {
102 : return ToJavaName(params, descriptor->name(), true, NULL, descriptor->file());
103 : }
104 : inline string ExtensionIdentifierName(const Params& params,
105 : const FieldDescriptor* descriptor) {
106 : return ToJavaName(params, descriptor->name(), false,
107 : descriptor->extension_scope(), descriptor->file());
108 : }
109 : string ClassName(const Params& params, const FileDescriptor* descriptor);
110 :
111 : // Get the unqualified name that should be used for a field's field
112 : // number constant.
113 : string FieldConstantName(const FieldDescriptor *field);
114 :
115 : string FieldDefaultConstantName(const FieldDescriptor *field);
116 :
117 : // Print the field's proto-syntax definition as a comment.
118 : void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field);
119 :
120 : enum JavaType {
121 : JAVATYPE_INT,
122 : JAVATYPE_LONG,
123 : JAVATYPE_FLOAT,
124 : JAVATYPE_DOUBLE,
125 : JAVATYPE_BOOLEAN,
126 : JAVATYPE_STRING,
127 : JAVATYPE_BYTES,
128 : JAVATYPE_ENUM,
129 : JAVATYPE_MESSAGE
130 : };
131 :
132 : JavaType GetJavaType(FieldDescriptor::Type field_type);
133 :
134 0 : inline JavaType GetJavaType(const FieldDescriptor* field) {
135 0 : return GetJavaType(field->type());
136 : }
137 :
138 : string PrimitiveTypeName(JavaType type);
139 :
140 : // Get the fully-qualified class name for a boxed primitive type, e.g.
141 : // "java.lang.Integer" for JAVATYPE_INT. Returns NULL for enum and message
142 : // types.
143 : string BoxedPrimitiveTypeName(JavaType type);
144 :
145 : string EmptyArrayName(const Params& params, const FieldDescriptor* field);
146 :
147 : string DefaultValue(const Params& params, const FieldDescriptor* field);
148 :
149 :
150 : // Methods for shared bitfields.
151 :
152 : // Gets the name of the shared bitfield for the given field index.
153 : string GetBitFieldName(int index);
154 :
155 : // Gets the name of the shared bitfield for the given bit index.
156 : // Effectively, GetBitFieldName(bit_index / 32)
157 : string GetBitFieldNameForBit(int bit_index);
158 :
159 : // Generates the java code for the expression that returns whether the bit at
160 : // the given bit index is set.
161 : // Example: "((bitField1_ & 0x04000000) != 0)"
162 : string GenerateGetBit(int bit_index);
163 :
164 : // Generates the java code for the expression that sets the bit at the given
165 : // bit index.
166 : // Example: "bitField1_ |= 0x04000000"
167 : string GenerateSetBit(int bit_index);
168 :
169 : // Generates the java code for the expression that clears the bit at the given
170 : // bit index.
171 : // Example: "bitField1_ = (bitField1_ & ~0x04000000)"
172 : string GenerateClearBit(int bit_index);
173 :
174 : // Generates the java code for the expression that returns whether the bit at
175 : // the given bit index contains different values in the current object and
176 : // another object accessible via the variable 'other'.
177 : // Example: "((bitField1_ & 0x04000000) != (other.bitField1_ & 0x04000000))"
178 : string GenerateDifferentBit(int bit_index);
179 :
180 : // Sets the 'get_*', 'set_*', 'clear_*' and 'different_*' variables, where * is
181 : // the given name of the bit, to the appropriate Java expressions for the given
182 : // bit index.
183 : void SetBitOperationVariables(const string name,
184 : int bitIndex, map<string, string>* variables);
185 :
186 0 : inline bool IsMapEntry(const Descriptor* descriptor) {
187 : // TODO(liujisi): Add an option to turn on maps for proto2 syntax as well.
188 0 : return descriptor->options().map_entry() &&
189 0 : descriptor->file()->syntax() == FileDescriptor::SYNTAX_PROTO3;
190 : }
191 :
192 : bool HasMapField(const Descriptor* descriptor);
193 :
194 : } // namespace javanano
195 : } // namespace compiler
196 : } // namespace protobuf
197 :
198 : } // namespace google
199 : #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__
|