1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <sstream> 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/code_generator.h> 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/plugin.h> 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/descriptor.h> 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/descriptor.pb.h> 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/printer.h> 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/zero_copy_stream.h> 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format.h> 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/csharp/csharp_doc_comment.h> 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/csharp/csharp_helpers.h> 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/csharp/csharp_repeated_enum_field.h> 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google { 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace compiler { 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace csharp { 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerRepeatedEnumFieldGenerator::RepeatedEnumFieldGenerator( 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : FieldGeneratorBase(descriptor, fieldOrdinal, options) { 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerRepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() { 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateMembers(io::Printer* printer) { 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "private static readonly pb::FieldCodec<$type_name$> _repeated_$name$_codec\n" 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " = pb::FieldCodec.ForEnum($tag$, x => (int) x, x => ($type_name$) x);\n"); 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer WritePropertyDocComment(printer, descriptor_); 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer AddDeprecatedFlag(printer); 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " get { return $name$_; }\n" 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "}\n"); 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateMergingCode(io::Printer* printer) { 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$name$_.Add(other.$name$_);\n"); 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$name$_.AddEntriesFrom(input, _repeated_$name$_codec);\n"); 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$name$_.WriteTo(output, _repeated_$name$_codec);\n"); 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "size += $name$_.CalculateSize(_repeated_$name$_codec);\n"); 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::WriteHash(io::Printer* printer) { 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "hash ^= $name$_.GetHashCode();\n"); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::WriteEquals(io::Printer* printer) { 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print( 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer variables_, 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "if(!$name$_.Equals(other.$name$_)) return false;\n"); 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::WriteToString(io::Printer* printer) { 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "PrintField(\"$descriptor_name$\", $name$_, writer);\n"); 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateCloningCode(io::Printer* printer) { 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$name$_ = other.$name$_.Clone();\n"); 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedEnumFieldGenerator::GenerateFreezingCode(io::Printer* printer) { 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace csharp 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace compiler 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace google 128