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: bduff@google.com (Brian Duff)
32
33#include <google/protobuf/compiler/javanano/javanano_extension.h>
34#include <google/protobuf/compiler/javanano/javanano_helpers.h>
35#include <google/protobuf/io/printer.h>
36#include <google/protobuf/stubs/strutil.h>
37#include <google/protobuf/wire_format.h>
38
39namespace google {
40namespace protobuf {
41namespace compiler {
42namespace javanano {
43
44using internal::WireFormat;
45
46void SetVariables(const FieldDescriptor* descriptor, const Params params,
47                  map<string, string>* variables) {
48  (*variables)["name"] =
49    RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
50  (*variables)["number"] = SimpleItoa(descriptor->number());
51  (*variables)["extends"] = ClassName(params, descriptor->containing_type());
52
53  string type;
54  JavaType java_type = GetJavaType(descriptor->type());
55  switch (java_type) {
56    case JAVATYPE_ENUM:
57      type = "java.lang.Integer";
58      break;
59    case JAVATYPE_MESSAGE:
60      type = ClassName(params, descriptor->message_type());
61      break;
62    default:
63      type = BoxedPrimitiveTypeName(java_type);
64      break;
65  }
66  (*variables)["type"] = type;
67}
68
69ExtensionGenerator::
70ExtensionGenerator(const FieldDescriptor* descriptor, const Params& params)
71  : params_(params), descriptor_(descriptor) {
72  SetVariables(descriptor, params, &variables_);
73}
74
75ExtensionGenerator::~ExtensionGenerator() {}
76
77void ExtensionGenerator::Generate(io::Printer* printer) const {
78  if (descriptor_->is_repeated()) {
79    printer->Print(variables_,
80      "// Extends $extends$\n"
81      "public static final com.google.protobuf.nano.Extension<java.util.List<$type$>> $name$ = \n"
82      "    com.google.protobuf.nano.Extension.createRepeated($number$,\n"
83      "        new com.google.protobuf.nano.Extension.TypeLiteral<java.util.List<$type$>>(){});\n");
84  } else {
85    printer->Print(variables_,
86      "// Extends $extends$\n"
87      "public static final com.google.protobuf.nano.Extension<$type$> $name$ =\n"
88      "    com.google.protobuf.nano.Extension.create($number$,\n"
89      "        new com.google.protobuf.nano.Extension.TypeLiteral<$type$>(){});\n");
90  }
91}
92
93}  // namespace javanano
94}  // namespace compiler
95}  // namespace protobuf
96}  // namespace google
97
98