• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
ClassName(const Params & params,const Descriptor * descriptor)95 inline string ClassName(const Params& params, const Descriptor* descriptor) {
96   return ToJavaName(params, descriptor->name(), true,
97                     descriptor->containing_type(), descriptor->file());
98 }
99 string ClassName(const Params& params, const EnumDescriptor* descriptor);
ClassName(const Params & params,const ServiceDescriptor * descriptor)100 inline string ClassName(const Params& params,
101     const ServiceDescriptor* descriptor) {
102   return ToJavaName(params, descriptor->name(), true, NULL, descriptor->file());
103 }
ExtensionIdentifierName(const Params & params,const FieldDescriptor * descriptor)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 
GetJavaType(const FieldDescriptor * field)134 inline JavaType GetJavaType(const FieldDescriptor* field) {
135   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, std::map<string, string>* variables);
185 
IsMapEntry(const Descriptor * descriptor)186 inline bool IsMapEntry(const Descriptor* descriptor) {
187   // TODO(liujisi): Add an option to turn on maps for proto2 syntax as well.
188   return descriptor->options().map_entry() &&
189       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__
200