commit
a449f66bdb
163 changed files with 1193 additions and 20386 deletions
@ -1,140 +0,0 @@ |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSizeProtoFile"; |
||||
|
||||
package benchmarks; |
||||
|
||||
option java_outer_classname = "GoogleSize"; |
||||
option optimize_for = CODE_SIZE; |
||||
|
||||
message SizeMessage1 { |
||||
required string field1 = 1; |
||||
optional string field9 = 9; |
||||
optional string field18 = 18; |
||||
optional bool field80 = 80 [default=false]; |
||||
optional bool field81 = 81 [default=true]; |
||||
required int32 field2 = 2; |
||||
required int32 field3 = 3; |
||||
optional int32 field280 = 280; |
||||
optional int32 field6 = 6 [default=0]; |
||||
optional int64 field22 = 22; |
||||
optional string field4 = 4; |
||||
repeated fixed64 field5 = 5; |
||||
optional bool field59 = 59 [default=false]; |
||||
optional string field7 = 7; |
||||
optional int32 field16 = 16; |
||||
optional int32 field130 = 130 [default=0]; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional bool field17 = 17 [default=true]; |
||||
optional bool field13 = 13 [default=true]; |
||||
optional bool field14 = 14 [default=true]; |
||||
optional int32 field104 = 104 [default=0]; |
||||
optional int32 field100 = 100 [default=0]; |
||||
optional int32 field101 = 101 [default=0]; |
||||
optional string field102 = 102; |
||||
optional string field103 = 103; |
||||
optional int32 field29 = 29 [default=0]; |
||||
optional bool field30 = 30 [default=false]; |
||||
optional int32 field60 = 60 [default=-1]; |
||||
optional int32 field271 = 271 [default=-1]; |
||||
optional int32 field272 = 272 [default=-1]; |
||||
optional int32 field150 = 150; |
||||
optional int32 field23 = 23 [default=0]; |
||||
optional bool field24 = 24 [default=false]; |
||||
optional int32 field25 = 25 [default=0]; |
||||
optional SizeMessage1SubMessage field15 = 15; |
||||
optional bool field78 = 78; |
||||
optional int32 field67 = 67 [default=0]; |
||||
optional int32 field68 = 68; |
||||
optional int32 field128 = 128 [default=0]; |
||||
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||
optional int32 field131 = 131 [default=0]; |
||||
} |
||||
|
||||
message SizeMessage1SubMessage { |
||||
optional int32 field1 = 1 [default=0]; |
||||
optional int32 field2 = 2 [default=0]; |
||||
optional int32 field3 = 3 [default=0]; |
||||
optional string field15 = 15; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional int64 field13 = 13; |
||||
optional int64 field14 = 14; |
||||
optional int32 field16 = 16; |
||||
optional int32 field19 = 19 [default=2]; |
||||
optional bool field20 = 20 [default=true]; |
||||
optional bool field28 = 28 [default=true]; |
||||
optional fixed64 field21 = 21; |
||||
optional int32 field22 = 22; |
||||
optional bool field23 = 23 [ default=false ]; |
||||
optional bool field206 = 206 [default=false]; |
||||
optional fixed32 field203 = 203; |
||||
optional int32 field204 = 204; |
||||
optional string field205 = 205; |
||||
optional uint64 field207 = 207; |
||||
optional uint64 field300 = 300; |
||||
} |
||||
|
||||
message SizeMessage2 { |
||||
optional string field1 = 1; |
||||
optional int64 field3 = 3; |
||||
optional int64 field4 = 4; |
||||
optional int64 field30 = 30; |
||||
optional bool field75 = 75 [default=false]; |
||||
optional string field6 = 6; |
||||
optional bytes field2 = 2; |
||||
optional int32 field21 = 21 [default=0]; |
||||
optional int32 field71 = 71; |
||||
optional float field25 = 25; |
||||
optional int32 field109 = 109 [default=0]; |
||||
optional int32 field210 = 210 [default=0]; |
||||
optional int32 field211 = 211 [default=0]; |
||||
optional int32 field212 = 212 [default=0]; |
||||
optional int32 field213 = 213 [default=0]; |
||||
optional int32 field216 = 216 [default=0]; |
||||
optional int32 field217 = 217 [default=0]; |
||||
optional int32 field218 = 218 [default=0]; |
||||
optional int32 field220 = 220 [default=0]; |
||||
optional int32 field221 = 221 [default=0]; |
||||
optional float field222 = 222 [default=0.0]; |
||||
optional int32 field63 = 63; |
||||
|
||||
repeated group Group1 = 10 { |
||||
required float field11 = 11; |
||||
optional float field26 = 26; |
||||
optional string field12 = 12; |
||||
optional string field13 = 13; |
||||
repeated string field14 = 14; |
||||
required uint64 field15 = 15; |
||||
optional int32 field5 = 5; |
||||
optional string field27 = 27; |
||||
optional int32 field28 = 28; |
||||
optional string field29 = 29; |
||||
optional string field16 = 16; |
||||
repeated string field22 = 22; |
||||
repeated int32 field73 = 73; |
||||
optional int32 field20 = 20 [default=0]; |
||||
optional string field24 = 24; |
||||
optional SizeMessage2GroupedMessage field31 = 31; |
||||
} |
||||
repeated string field128 = 128; |
||||
optional int64 field131 = 131; |
||||
repeated string field127 = 127; |
||||
optional int32 field129 = 129; |
||||
repeated int64 field130 = 130; |
||||
optional bool field205 = 205 [default=false]; |
||||
optional bool field206 = 206 [default=false]; |
||||
} |
||||
|
||||
message SizeMessage2GroupedMessage { |
||||
optional float field1 = 1; |
||||
optional float field2 = 2; |
||||
optional float field3 = 3 [default=0.0]; |
||||
optional bool field4 = 4; |
||||
optional bool field5 = 5; |
||||
optional bool field6 = 6 [default=true]; |
||||
optional bool field7 = 7 [default=false]; |
||||
optional float field8 = 8; |
||||
optional bool field9 = 9; |
||||
optional float field10 = 10; |
||||
optional int64 field11 = 11; |
||||
} |
@ -1,140 +0,0 @@ |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSpeedProtoFile"; |
||||
|
||||
package benchmarks; |
||||
|
||||
option java_outer_classname = "GoogleSpeed"; |
||||
option optimize_for = SPEED; |
||||
|
||||
message SpeedMessage1 { |
||||
required string field1 = 1; |
||||
optional string field9 = 9; |
||||
optional string field18 = 18; |
||||
optional bool field80 = 80 [default=false]; |
||||
optional bool field81 = 81 [default=true]; |
||||
required int32 field2 = 2; |
||||
required int32 field3 = 3; |
||||
optional int32 field280 = 280; |
||||
optional int32 field6 = 6 [default=0]; |
||||
optional int64 field22 = 22; |
||||
optional string field4 = 4; |
||||
repeated fixed64 field5 = 5; |
||||
optional bool field59 = 59 [default=false]; |
||||
optional string field7 = 7; |
||||
optional int32 field16 = 16; |
||||
optional int32 field130 = 130 [default=0]; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional bool field17 = 17 [default=true]; |
||||
optional bool field13 = 13 [default=true]; |
||||
optional bool field14 = 14 [default=true]; |
||||
optional int32 field104 = 104 [default=0]; |
||||
optional int32 field100 = 100 [default=0]; |
||||
optional int32 field101 = 101 [default=0]; |
||||
optional string field102 = 102; |
||||
optional string field103 = 103; |
||||
optional int32 field29 = 29 [default=0]; |
||||
optional bool field30 = 30 [default=false]; |
||||
optional int32 field60 = 60 [default=-1]; |
||||
optional int32 field271 = 271 [default=-1]; |
||||
optional int32 field272 = 272 [default=-1]; |
||||
optional int32 field150 = 150; |
||||
optional int32 field23 = 23 [default=0]; |
||||
optional bool field24 = 24 [default=false]; |
||||
optional int32 field25 = 25 [default=0]; |
||||
optional SpeedMessage1SubMessage field15 = 15; |
||||
optional bool field78 = 78; |
||||
optional int32 field67 = 67 [default=0]; |
||||
optional int32 field68 = 68; |
||||
optional int32 field128 = 128 [default=0]; |
||||
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||
optional int32 field131 = 131 [default=0]; |
||||
} |
||||
|
||||
message SpeedMessage1SubMessage { |
||||
optional int32 field1 = 1 [default=0]; |
||||
optional int32 field2 = 2 [default=0]; |
||||
optional int32 field3 = 3 [default=0]; |
||||
optional string field15 = 15; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional int64 field13 = 13; |
||||
optional int64 field14 = 14; |
||||
optional int32 field16 = 16; |
||||
optional int32 field19 = 19 [default=2]; |
||||
optional bool field20 = 20 [default=true]; |
||||
optional bool field28 = 28 [default=true]; |
||||
optional fixed64 field21 = 21; |
||||
optional int32 field22 = 22; |
||||
optional bool field23 = 23 [ default=false ]; |
||||
optional bool field206 = 206 [default=false]; |
||||
optional fixed32 field203 = 203; |
||||
optional int32 field204 = 204; |
||||
optional string field205 = 205; |
||||
optional uint64 field207 = 207; |
||||
optional uint64 field300 = 300; |
||||
} |
||||
|
||||
message SpeedMessage2 { |
||||
optional string field1 = 1; |
||||
optional int64 field3 = 3; |
||||
optional int64 field4 = 4; |
||||
optional int64 field30 = 30; |
||||
optional bool field75 = 75 [default=false]; |
||||
optional string field6 = 6; |
||||
optional bytes field2 = 2; |
||||
optional int32 field21 = 21 [default=0]; |
||||
optional int32 field71 = 71; |
||||
optional float field25 = 25; |
||||
optional int32 field109 = 109 [default=0]; |
||||
optional int32 field210 = 210 [default=0]; |
||||
optional int32 field211 = 211 [default=0]; |
||||
optional int32 field212 = 212 [default=0]; |
||||
optional int32 field213 = 213 [default=0]; |
||||
optional int32 field216 = 216 [default=0]; |
||||
optional int32 field217 = 217 [default=0]; |
||||
optional int32 field218 = 218 [default=0]; |
||||
optional int32 field220 = 220 [default=0]; |
||||
optional int32 field221 = 221 [default=0]; |
||||
optional float field222 = 222 [default=0.0]; |
||||
optional int32 field63 = 63; |
||||
|
||||
repeated group Group1 = 10 { |
||||
required float field11 = 11; |
||||
optional float field26 = 26; |
||||
optional string field12 = 12; |
||||
optional string field13 = 13; |
||||
repeated string field14 = 14; |
||||
required uint64 field15 = 15; |
||||
optional int32 field5 = 5; |
||||
optional string field27 = 27; |
||||
optional int32 field28 = 28; |
||||
optional string field29 = 29; |
||||
optional string field16 = 16; |
||||
repeated string field22 = 22; |
||||
repeated int32 field73 = 73; |
||||
optional int32 field20 = 20 [default=0]; |
||||
optional string field24 = 24; |
||||
optional SpeedMessage2GroupedMessage field31 = 31; |
||||
} |
||||
repeated string field128 = 128; |
||||
optional int64 field131 = 131; |
||||
repeated string field127 = 127; |
||||
optional int32 field129 = 129; |
||||
repeated int64 field130 = 130; |
||||
optional bool field205 = 205 [default=false]; |
||||
optional bool field206 = 206 [default=false]; |
||||
} |
||||
|
||||
message SpeedMessage2GroupedMessage { |
||||
optional float field1 = 1; |
||||
optional float field2 = 2; |
||||
optional float field3 = 3 [default=0.0]; |
||||
optional bool field4 = 4; |
||||
optional bool field5 = 5; |
||||
optional bool field6 = 6 [default=true]; |
||||
optional bool field7 = 7 [default=false]; |
||||
optional float field8 = 8; |
||||
optional bool field9 = 9; |
||||
optional float field10 = 10; |
||||
optional int64 field11 = 11; |
||||
} |
@ -1,30 +0,0 @@ |
||||
syntax = "proto2"; |
||||
|
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/unittest.proto"; |
||||
import "google/protobuf/unittest_custom_options.proto"; |
||||
|
||||
option csharp_namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
|
||||
// option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure |
||||
// that the generated code doesn't depend on being in the proto2 namespace. |
||||
package protobuf_unittest; |
||||
|
||||
option optimize_for = SPEED; |
||||
|
||||
service TestGenericService { |
||||
rpc Foo(FooRequest) returns (FooResponse); |
||||
rpc Bar(BarRequest) returns (BarResponse); |
||||
} |
||||
|
||||
service TestGenericServiceWithCustomOptions { |
||||
option (service_opt1) = -9876543210; |
||||
|
||||
rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) { |
||||
option (method_opt1) = METHODOPT1_VAL2; |
||||
} |
||||
} |
||||
|
@ -1,41 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInterop"; |
||||
|
||||
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; |
||||
|
||||
option optimize_for = SPEED; |
||||
|
||||
message SearchRequest { |
||||
repeated string Criteria = 1; |
||||
} |
||||
|
||||
message SearchResponse { |
||||
message ResultItem { |
||||
required string url = 1; |
||||
optional string name = 2; |
||||
} |
||||
|
||||
repeated ResultItem results = 1; |
||||
} |
||||
|
||||
message RefineSearchRequest { |
||||
repeated string Criteria = 1; |
||||
required SearchResponse previous_results = 2; |
||||
} |
||||
|
||||
service SearchService { |
||||
/* |
||||
Add this option to specify the GuidAttribute on the service interface |
||||
option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}"; |
||||
*/ |
||||
rpc Search (SearchRequest) returns (SearchResponse) |
||||
/* |
||||
Add this option to specify the DispIdAttribute on the service interface |
||||
{ option (google.protobuf.csharp_method_options).dispatch_id = 5; } |
||||
*/ ; |
||||
|
||||
rpc RefineSearch (RefineSearchRequest) returns (SearchResponse); |
||||
} |
@ -1,42 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInteropLite"; |
||||
|
||||
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; |
||||
|
||||
option optimize_for = LITE_RUNTIME; |
||||
package unittest_rpc_interop_lite; |
||||
|
||||
message SearchRequest { |
||||
repeated string Criteria = 1; |
||||
} |
||||
|
||||
message SearchResponse { |
||||
message ResultItem { |
||||
required string url = 1; |
||||
optional string name = 2; |
||||
} |
||||
|
||||
repeated ResultItem results = 1; |
||||
} |
||||
|
||||
message RefineSearchRequest { |
||||
repeated string Criteria = 1; |
||||
required SearchResponse previous_results = 2; |
||||
} |
||||
|
||||
service SearchService { |
||||
/* |
||||
Add this option to specify the GuidAttribute on the service interface |
||||
option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}"; |
||||
*/ |
||||
rpc Search (SearchRequest) returns (SearchResponse) |
||||
/* |
||||
Add this option to specify the DispIdAttribute on the service interface |
||||
{ option (google.protobuf.csharp_method_options).dispatch_id = 5; } |
||||
*/ ; |
||||
|
||||
rpc RefineSearch (RefineSearchRequest) returns (SearchResponse); |
||||
} |
@ -1,147 +0,0 @@ |
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// |
||||
// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to |
||||
// change. |
||||
// |
||||
// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is |
||||
// just a program that reads a CodeGeneratorRequest from stdin and writes a |
||||
// CodeGeneratorResponse to stdout. |
||||
// |
||||
// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead |
||||
// of dealing with the raw protocol defined here. |
||||
// |
||||
// A plugin executable needs only to be placed somewhere in the path. The |
||||
// plugin should be named "protoc-gen-$NAME", and will then be used when the |
||||
// flag "--${NAME}_out" is passed to protoc. |
||||
|
||||
package google.protobuf.compiler; |
||||
option java_package = "com.google.protobuf.compiler"; |
||||
option java_outer_classname = "PluginProtos"; |
||||
|
||||
import "google/protobuf/descriptor.proto"; |
||||
|
||||
// An encoded CodeGeneratorRequest is written to the plugin's stdin. |
||||
message CodeGeneratorRequest { |
||||
// The .proto files that were explicitly listed on the command-line. The |
||||
// code generator should generate code only for these files. Each file's |
||||
// descriptor will be included in proto_file, below. |
||||
repeated string file_to_generate = 1; |
||||
|
||||
// The generator parameter passed on the command-line. |
||||
optional string parameter = 2; |
||||
|
||||
// FileDescriptorProtos for all files in files_to_generate and everything |
||||
// they import. The files will appear in topological order, so each file |
||||
// appears before any file that imports it. |
||||
// |
||||
// protoc guarantees that all proto_files will be written after |
||||
// the fields above, even though this is not technically guaranteed by the |
||||
// protobuf wire format. This theoretically could allow a plugin to stream |
||||
// in the FileDescriptorProtos and handle them one by one rather than read |
||||
// the entire set into memory at once. However, as of this writing, this |
||||
// is not similarly optimized on protoc's end -- it will store all fields in |
||||
// memory at once before sending them to the plugin. |
||||
repeated FileDescriptorProto proto_file = 15; |
||||
} |
||||
|
||||
// The plugin writes an encoded CodeGeneratorResponse to stdout. |
||||
message CodeGeneratorResponse { |
||||
// Error message. If non-empty, code generation failed. The plugin process |
||||
// should exit with status code zero even if it reports an error in this way. |
||||
// |
||||
// This should be used to indicate errors in .proto files which prevent the |
||||
// code generator from generating correct code. Errors which indicate a |
||||
// problem in protoc itself -- such as the input CodeGeneratorRequest being |
||||
// unparseable -- should be reported by writing a message to stderr and |
||||
// exiting with a non-zero status code. |
||||
optional string error = 1; |
||||
|
||||
// Represents a single generated file. |
||||
message File { |
||||
// The file name, relative to the output directory. The name must not |
||||
// contain "." or ".." components and must be relative, not be absolute (so, |
||||
// the file cannot lie outside the output directory). "/" must be used as |
||||
// the path separator, not "\". |
||||
// |
||||
// If the name is omitted, the content will be appended to the previous |
||||
// file. This allows the generator to break large files into small chunks, |
||||
// and allows the generated text to be streamed back to protoc so that large |
||||
// files need not reside completely in memory at one time. Note that as of |
||||
// this writing protoc does not optimize for this -- it will read the entire |
||||
// CodeGeneratorResponse before writing files to disk. |
||||
optional string name = 1; |
||||
|
||||
// If non-empty, indicates that the named file should already exist, and the |
||||
// content here is to be inserted into that file at a defined insertion |
||||
// point. This feature allows a code generator to extend the output |
||||
// produced by another code generator. The original generator may provide |
||||
// insertion points by placing special annotations in the file that look |
||||
// like: |
||||
// @@protoc_insertion_point(NAME) |
||||
// The annotation can have arbitrary text before and after it on the line, |
||||
// which allows it to be placed in a comment. NAME should be replaced with |
||||
// an identifier naming the point -- this is what other generators will use |
||||
// as the insertion_point. Code inserted at this point will be placed |
||||
// immediately above the line containing the insertion point (thus multiple |
||||
// insertions to the same point will come out in the order they were added). |
||||
// The double-@ is intended to make it unlikely that the generated code |
||||
// could contain things that look like insertion points by accident. |
||||
// |
||||
// For example, the C++ code generator places the following line in the |
||||
// .pb.h files that it generates: |
||||
// // @@protoc_insertion_point(namespace_scope) |
||||
// This line appears within the scope of the file's package namespace, but |
||||
// outside of any particular class. Another plugin can then specify the |
||||
// insertion_point "namespace_scope" to generate additional classes or |
||||
// other declarations that should be placed in this scope. |
||||
// |
||||
// Note that if the line containing the insertion point begins with |
||||
// whitespace, the same whitespace will be added to every line of the |
||||
// inserted text. This is useful for languages like Python, where |
||||
// indentation matters. In these languages, the insertion point comment |
||||
// should be indented the same amount as any inserted code will need to be |
||||
// in order to work correctly in that context. |
||||
// |
||||
// The code generator that generates the initial file and the one which |
||||
// inserts into it must both run as part of a single invocation of protoc. |
||||
// Code generators are executed in the order in which they appear on the |
||||
// command line. |
||||
// |
||||
// If |insertion_point| is present, |name| must also be present. |
||||
optional string insertion_point = 2; |
||||
|
||||
// The file contents. |
||||
optional string content = 15; |
||||
} |
||||
repeated File file = 15; |
||||
} |
@ -1,115 +0,0 @@ |
||||
// Extra options for C# generator |
||||
|
||||
import "google/protobuf/descriptor.proto"; |
||||
|
||||
package google.protobuf; |
||||
|
||||
message CSharpFileOptions { |
||||
|
||||
// Namespace for generated classes; defaults to the package. |
||||
optional string namespace = 1; |
||||
|
||||
// Name of the "umbrella" class used for metadata about all |
||||
// the messages within this file. Default is based on the name |
||||
// of the file. |
||||
optional string umbrella_classname = 2; |
||||
|
||||
// Whether classes should be public (true) or internal (false) |
||||
optional bool public_classes = 3 [default = true]; |
||||
|
||||
// Whether to generate a single file for everything within the |
||||
// .proto file (false), or one file per message (true). |
||||
// This option is not currently honored; please log a feature |
||||
// request if you really want it. |
||||
optional bool multiple_files = 4; |
||||
|
||||
// Whether to nest messages within a single umbrella class (true) |
||||
// or create the umbrella class as a peer, with messages as |
||||
// top-level classes in the namespace (false) |
||||
optional bool nest_classes = 5; |
||||
|
||||
// Generate appropriate support for Code Contracts |
||||
// (Ongoing; support should improve over time) |
||||
optional bool code_contracts = 6; |
||||
|
||||
// Create subdirectories for namespaces, e.g. namespace "Foo.Bar" |
||||
// would generate files within [output directory]/Foo/Bar |
||||
optional bool expand_namespace_directories = 7; |
||||
|
||||
// Generate attributes indicating non-CLS-compliance |
||||
optional bool cls_compliance = 8 [default = true]; |
||||
|
||||
// Generate messages/builders with the [Serializable] attribute |
||||
optional bool add_serializable = 9 [default = false]; |
||||
|
||||
// Generates a private ctor for Message types |
||||
optional bool generate_private_ctor = 10 [default = true]; |
||||
|
||||
// The extension that should be appended to the umbrella_classname when creating files. |
||||
optional string file_extension = 221 [default = ".cs"]; |
||||
|
||||
// A nested namespace for the umbrella class. Helpful for name collisions caused by |
||||
// umbrella_classname conflicting with an existing type. This will be automatically |
||||
// set to 'Proto' if a collision is detected with types being generated. This value |
||||
// is ignored when nest_classes == true |
||||
optional string umbrella_namespace = 222; |
||||
|
||||
// The output path for the source file(s) generated |
||||
optional string output_directory = 223 [default = "."]; |
||||
|
||||
// Will ignore the type generations and remove dependencies for the descriptor proto |
||||
// files that declare their package to be "google.protobuf" |
||||
optional bool ignore_google_protobuf = 224 [default = false]; |
||||
|
||||
// Controls how services are generated, GENERIC is the deprecated original implementation |
||||
// INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and |
||||
// implementations using the included Windows RPC interop libarary. |
||||
optional CSharpServiceType service_generator_type = 225 [default = NONE]; |
||||
|
||||
// Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and |
||||
// System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. |
||||
optional bool generated_code_attributes = 226 [default = false]; |
||||
} |
||||
|
||||
enum CSharpServiceType { |
||||
// Services are ignored by the generator |
||||
NONE = 0; |
||||
// Generates the original Java generic service implementations |
||||
GENERIC = 1; |
||||
// Generates an interface for the service and nothing else |
||||
INTERFACE = 2; |
||||
// Generates an interface for the service and client/server wrappers for the interface |
||||
IRPCDISPATCH = 3; |
||||
} |
||||
|
||||
extend FileOptions { |
||||
optional CSharpFileOptions csharp_file_options = 1000; |
||||
} |
||||
|
||||
extend FieldOptions { |
||||
optional CSharpFieldOptions csharp_field_options = 1000; |
||||
} |
||||
|
||||
message CSharpFieldOptions { |
||||
// Provides the ability to override the name of the property |
||||
// generated for this field. This is applied to all properties |
||||
// and methods to do with this field, including HasFoo, FooCount, |
||||
// FooList etc. |
||||
optional string property_name = 1; |
||||
} |
||||
|
||||
message CSharpServiceOptions { |
||||
optional string interface_id = 1; |
||||
} |
||||
|
||||
extend ServiceOptions { |
||||
optional CSharpServiceOptions csharp_service_options = 1000; |
||||
} |
||||
|
||||
message CSharpMethodOptions { |
||||
optional int32 dispatch_id = 1; |
||||
} |
||||
|
||||
extend MethodOptions { |
||||
optional CSharpMethodOptions csharp_method_options = 1000; |
||||
} |
@ -1,533 +0,0 @@ |
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// The messages in this file describe the definitions found in .proto files. |
||||
// A valid .proto file can be translated directly to a FileDescriptorProto |
||||
// without any other information (e.g. without reading its imports). |
||||
|
||||
|
||||
|
||||
package google.protobuf; |
||||
option java_package = "com.google.protobuf"; |
||||
option java_outer_classname = "DescriptorProtos"; |
||||
|
||||
// descriptor.proto must be optimized for speed because reflection-based |
||||
// algorithms don't work during bootstrapping. |
||||
option optimize_for = SPEED; |
||||
|
||||
// The protocol compiler can output a FileDescriptorSet containing the .proto |
||||
// files it parses. |
||||
message FileDescriptorSet { |
||||
repeated FileDescriptorProto file = 1; |
||||
} |
||||
|
||||
// Describes a complete .proto file. |
||||
message FileDescriptorProto { |
||||
optional string name = 1; // file name, relative to root of source tree |
||||
optional string package = 2; // e.g. "foo", "foo.bar", etc. |
||||
|
||||
// Names of files imported by this file. |
||||
repeated string dependency = 3; |
||||
|
||||
// All top-level definitions in this file. |
||||
repeated DescriptorProto message_type = 4; |
||||
repeated EnumDescriptorProto enum_type = 5; |
||||
repeated ServiceDescriptorProto service = 6; |
||||
repeated FieldDescriptorProto extension = 7; |
||||
|
||||
optional FileOptions options = 8; |
||||
|
||||
// This field contains optional information about the original source code. |
||||
// You may safely remove this entire field whithout harming runtime |
||||
// functionality of the descriptors -- the information is needed only by |
||||
// development tools. |
||||
optional SourceCodeInfo source_code_info = 9; |
||||
} |
||||
|
||||
// Describes a message type. |
||||
message DescriptorProto { |
||||
optional string name = 1; |
||||
|
||||
repeated FieldDescriptorProto field = 2; |
||||
repeated FieldDescriptorProto extension = 6; |
||||
|
||||
repeated DescriptorProto nested_type = 3; |
||||
repeated EnumDescriptorProto enum_type = 4; |
||||
|
||||
message ExtensionRange { |
||||
optional int32 start = 1; |
||||
optional int32 end = 2; |
||||
} |
||||
repeated ExtensionRange extension_range = 5; |
||||
|
||||
optional MessageOptions options = 7; |
||||
} |
||||
|
||||
// Describes a field within a message. |
||||
message FieldDescriptorProto { |
||||
enum Type { |
||||
// 0 is reserved for errors. |
||||
// Order is weird for historical reasons. |
||||
TYPE_DOUBLE = 1; |
||||
TYPE_FLOAT = 2; |
||||
TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers |
||||
// take 10 bytes. Use TYPE_SINT64 if negative |
||||
// values are likely. |
||||
TYPE_UINT64 = 4; |
||||
TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers |
||||
// take 10 bytes. Use TYPE_SINT32 if negative |
||||
// values are likely. |
||||
TYPE_FIXED64 = 6; |
||||
TYPE_FIXED32 = 7; |
||||
TYPE_BOOL = 8; |
||||
TYPE_STRING = 9; |
||||
TYPE_GROUP = 10; // Tag-delimited aggregate. |
||||
TYPE_MESSAGE = 11; // Length-delimited aggregate. |
||||
|
||||
// New in version 2. |
||||
TYPE_BYTES = 12; |
||||
TYPE_UINT32 = 13; |
||||
TYPE_ENUM = 14; |
||||
TYPE_SFIXED32 = 15; |
||||
TYPE_SFIXED64 = 16; |
||||
TYPE_SINT32 = 17; // Uses ZigZag encoding. |
||||
TYPE_SINT64 = 18; // Uses ZigZag encoding. |
||||
}; |
||||
|
||||
enum Label { |
||||
// 0 is reserved for errors |
||||
LABEL_OPTIONAL = 1; |
||||
LABEL_REQUIRED = 2; |
||||
LABEL_REPEATED = 3; |
||||
// TODO(sanjay): Should we add LABEL_MAP? |
||||
}; |
||||
|
||||
optional string name = 1; |
||||
optional int32 number = 3; |
||||
optional Label label = 4; |
||||
|
||||
// If type_name is set, this need not be set. If both this and type_name |
||||
// are set, this must be either TYPE_ENUM or TYPE_MESSAGE. |
||||
optional Type type = 5; |
||||
|
||||
// For message and enum types, this is the name of the type. If the name |
||||
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping |
||||
// rules are used to find the type (i.e. first the nested types within this |
||||
// message are searched, then within the parent, on up to the root |
||||
// namespace). |
||||
optional string type_name = 6; |
||||
|
||||
// For extensions, this is the name of the type being extended. It is |
||||
// resolved in the same manner as type_name. |
||||
optional string extendee = 2; |
||||
|
||||
// For numeric types, contains the original text representation of the value. |
||||
// For booleans, "true" or "false". |
||||
// For strings, contains the default text contents (not escaped in any way). |
||||
// For bytes, contains the C escaped value. All bytes >= 128 are escaped. |
||||
// TODO(kenton): Base-64 encode? |
||||
optional string default_value = 7; |
||||
|
||||
optional FieldOptions options = 8; |
||||
} |
||||
|
||||
// Describes an enum type. |
||||
message EnumDescriptorProto { |
||||
optional string name = 1; |
||||
|
||||
repeated EnumValueDescriptorProto value = 2; |
||||
|
||||
optional EnumOptions options = 3; |
||||
} |
||||
|
||||
// Describes a value within an enum. |
||||
message EnumValueDescriptorProto { |
||||
optional string name = 1; |
||||
optional int32 number = 2; |
||||
|
||||
optional EnumValueOptions options = 3; |
||||
} |
||||
|
||||
// Describes a service. |
||||
message ServiceDescriptorProto { |
||||
optional string name = 1; |
||||
repeated MethodDescriptorProto method = 2; |
||||
|
||||
optional ServiceOptions options = 3; |
||||
} |
||||
|
||||
// Describes a method of a service. |
||||
message MethodDescriptorProto { |
||||
optional string name = 1; |
||||
|
||||
// Input and output type names. These are resolved in the same way as |
||||
// FieldDescriptorProto.type_name, but must refer to a message type. |
||||
optional string input_type = 2; |
||||
optional string output_type = 3; |
||||
|
||||
optional MethodOptions options = 4; |
||||
} |
||||
|
||||
// =================================================================== |
||||
// Options |
||||
|
||||
// Each of the definitions above may have "options" attached. These are |
||||
// just annotations which may cause code to be generated slightly differently |
||||
// or may contain hints for code that manipulates protocol messages. |
||||
// |
||||
// Clients may define custom options as extensions of the *Options messages. |
||||
// These extensions may not yet be known at parsing time, so the parser cannot |
||||
// store the values in them. Instead it stores them in a field in the *Options |
||||
// message called uninterpreted_option. This field must have the same name |
||||
// across all *Options messages. We then use this field to populate the |
||||
// extensions when we build a descriptor, at which point all protos have been |
||||
// parsed and so all extensions are known. |
||||
// |
||||
// Extension numbers for custom options may be chosen as follows: |
||||
// * For options which will only be used within a single application or |
||||
// organization, or for experimental options, use field numbers 50000 |
||||
// through 99999. It is up to you to ensure that you do not use the |
||||
// same number for multiple options. |
||||
// * For options which will be published and used publicly by multiple |
||||
// independent entities, e-mail kenton@google.com to reserve extension |
||||
// numbers. Simply tell me how many you need and I'll send you back a |
||||
// set of numbers to use -- there's no need to explain how you intend to |
||||
// use them. If this turns out to be popular, a web service will be set up |
||||
// to automatically assign option numbers. |
||||
|
||||
|
||||
message FileOptions { |
||||
|
||||
// Sets the Java package where classes generated from this .proto will be |
||||
// placed. By default, the proto package is used, but this is often |
||||
// inappropriate because proto packages do not normally start with backwards |
||||
// domain names. |
||||
optional string java_package = 1; |
||||
|
||||
|
||||
// If set, all the classes from the .proto file are wrapped in a single |
||||
// outer class with the given name. This applies to both Proto1 |
||||
// (equivalent to the old "--one_java_file" option) and Proto2 (where |
||||
// a .proto always translates to a single class, but you may want to |
||||
// explicitly choose the class name). |
||||
optional string java_outer_classname = 8; |
||||
|
||||
// If set true, then the Java code generator will generate a separate .java |
||||
// file for each top-level message, enum, and service defined in the .proto |
||||
// file. Thus, these types will *not* be nested inside the outer class |
||||
// named by java_outer_classname. However, the outer class will still be |
||||
// generated to contain the file's getDescriptor() method as well as any |
||||
// top-level extensions defined in the file. |
||||
optional bool java_multiple_files = 10 [default=false]; |
||||
|
||||
// If set true, then the Java code generator will generate equals() and |
||||
// hashCode() methods for all messages defined in the .proto file. This is |
||||
// purely a speed optimization, as the AbstractMessage base class includes |
||||
// reflection-based implementations of these methods. |
||||
optional bool java_generate_equals_and_hash = 20 [default=false]; |
||||
|
||||
// Generated classes can be optimized for speed or code size. |
||||
enum OptimizeMode { |
||||
SPEED = 1; // Generate complete code for parsing, serialization, |
||||
// etc. |
||||
CODE_SIZE = 2; // Use ReflectionOps to implement these methods. |
||||
LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. |
||||
} |
||||
optional OptimizeMode optimize_for = 9 [default=SPEED]; |
||||
|
||||
|
||||
|
||||
|
||||
// Should generic services be generated in each language? "Generic" services |
||||
// are not specific to any particular RPC system. They are generated by the |
||||
// main code generators in each language (without additional plugins). |
||||
// Generic services were the only kind of service generation supported by |
||||
// early versions of proto2. |
||||
// |
||||
// Generic services are now considered deprecated in favor of using plugins |
||||
// that generate code specific to your particular RPC system. Therefore, |
||||
// these default to false. Old code which depends on generic services should |
||||
// explicitly set them to true. |
||||
optional bool cc_generic_services = 16 [default=false]; |
||||
optional bool java_generic_services = 17 [default=false]; |
||||
optional bool py_generic_services = 18 [default=false]; |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message MessageOptions { |
||||
// Set true to use the old proto1 MessageSet wire format for extensions. |
||||
// This is provided for backwards-compatibility with the MessageSet wire |
||||
// format. You should not use this for any other reason: It's less |
||||
// efficient, has fewer features, and is more complicated. |
||||
// |
||||
// The message must be defined exactly as follows: |
||||
// message Foo { |
||||
// option message_set_wire_format = true; |
||||
// extensions 4 to max; |
||||
// } |
||||
// Note that the message cannot have any defined fields; MessageSets only |
||||
// have extensions. |
||||
// |
||||
// All extensions of your type must be singular messages; e.g. they cannot |
||||
// be int32s, enums, or repeated messages. |
||||
// |
||||
// Because this is an option, the above two restrictions are not enforced by |
||||
// the protocol compiler. |
||||
optional bool message_set_wire_format = 1 [default=false]; |
||||
|
||||
// Disables the generation of the standard "descriptor()" accessor, which can |
||||
// conflict with a field of the same name. This is meant to make migration |
||||
// from proto1 easier; new code should avoid fields named "descriptor". |
||||
optional bool no_standard_descriptor_accessor = 2 [default=false]; |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message FieldOptions { |
||||
// The ctype option instructs the C++ code generator to use a different |
||||
// representation of the field than it normally would. See the specific |
||||
// options below. This option is not yet implemented in the open source |
||||
// release -- sorry, we'll try to include it in a future version! |
||||
optional CType ctype = 1 [default = STRING]; |
||||
enum CType { |
||||
// Default mode. |
||||
STRING = 0; |
||||
|
||||
CORD = 1; |
||||
|
||||
STRING_PIECE = 2; |
||||
} |
||||
// The packed option can be enabled for repeated primitive fields to enable |
||||
// a more efficient representation on the wire. Rather than repeatedly |
||||
// writing the tag and type for each element, the entire array is encoded as |
||||
// a single length-delimited blob. |
||||
optional bool packed = 2; |
||||
|
||||
|
||||
// Is this field deprecated? |
||||
// Depending on the target platform, this can emit Deprecated annotations |
||||
// for accessors, or it will be completely ignored; in the very least, this |
||||
// is a formalization for deprecating fields. |
||||
optional bool deprecated = 3 [default=false]; |
||||
|
||||
// EXPERIMENTAL. DO NOT USE. |
||||
// For "map" fields, the name of the field in the enclosed type that |
||||
// is the key for this map. For example, suppose we have: |
||||
// message Item { |
||||
// required string name = 1; |
||||
// required string value = 2; |
||||
// } |
||||
// message Config { |
||||
// repeated Item items = 1 [experimental_map_key="name"]; |
||||
// } |
||||
// In this situation, the map key for Item will be set to "name". |
||||
// TODO: Fully-implement this, then remove the "experimental_" prefix. |
||||
optional string experimental_map_key = 9; |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message EnumOptions { |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message EnumValueOptions { |
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message ServiceOptions { |
||||
|
||||
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||
// framework. We apologize for hoarding these numbers to ourselves, but |
||||
// we were already using them long before we decided to release Protocol |
||||
// Buffers. |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
message MethodOptions { |
||||
|
||||
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||
// framework. We apologize for hoarding these numbers to ourselves, but |
||||
// we were already using them long before we decided to release Protocol |
||||
// Buffers. |
||||
|
||||
// The parser stores options it doesn't recognize here. See above. |
||||
repeated UninterpretedOption uninterpreted_option = 999; |
||||
|
||||
// Clients can define custom options in extensions of this message. See above. |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
// A message representing a option the parser does not recognize. This only |
||||
// appears in options protos created by the compiler::Parser class. |
||||
// DescriptorPool resolves these when building Descriptor objects. Therefore, |
||||
// options protos in descriptor objects (e.g. returned by Descriptor::options(), |
||||
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions |
||||
// in them. |
||||
message UninterpretedOption { |
||||
// The name of the uninterpreted option. Each string represents a segment in |
||||
// a dot-separated name. is_extension is true iff a segment represents an |
||||
// extension (denoted with parentheses in options specs in .proto files). |
||||
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents |
||||
// "foo.(bar.baz).qux". |
||||
message NamePart { |
||||
required string name_part = 1; |
||||
required bool is_extension = 2; |
||||
} |
||||
repeated NamePart name = 2; |
||||
|
||||
// The value of the uninterpreted option, in whatever type the tokenizer |
||||
// identified it as during parsing. Exactly one of these should be set. |
||||
optional string identifier_value = 3; |
||||
optional uint64 positive_int_value = 4; |
||||
optional int64 negative_int_value = 5; |
||||
optional double double_value = 6; |
||||
optional bytes string_value = 7; |
||||
optional string aggregate_value = 8; |
||||
} |
||||
|
||||
// =================================================================== |
||||
// Optional source code info |
||||
|
||||
// Encapsulates information about the original source file from which a |
||||
// FileDescriptorProto was generated. |
||||
message SourceCodeInfo { |
||||
// A Location identifies a piece of source code in a .proto file which |
||||
// corresponds to a particular definition. This information is intended |
||||
// to be useful to IDEs, code indexers, documentation generators, and similar |
||||
// tools. |
||||
// |
||||
// For example, say we have a file like: |
||||
// message Foo { |
||||
// optional string foo = 1; |
||||
// } |
||||
// Let's look at just the field definition: |
||||
// optional string foo = 1; |
||||
// ^ ^^ ^^ ^ ^^^ |
||||
// a bc de f ghi |
||||
// We have the following locations: |
||||
// span path represents |
||||
// [a,i) [ 4, 0, 2, 0 ] The whole field definition. |
||||
// [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). |
||||
// [c,d) [ 4, 0, 2, 0, 5 ] The type (string). |
||||
// [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). |
||||
// [g,h) [ 4, 0, 2, 0, 3 ] The number (1). |
||||
// |
||||
// Notes: |
||||
// - A location may refer to a repeated field itself (i.e. not to any |
||||
// particular index within it). This is used whenever a set of elements are |
||||
// logically enclosed in a single code segment. For example, an entire |
||||
// extend block (possibly containing multiple extension definitions) will |
||||
// have an outer location whose path refers to the "extensions" repeated |
||||
// field without an index. |
||||
// - Multiple locations may have the same path. This happens when a single |
||||
// logical declaration is spread out across multiple places. The most |
||||
// obvious example is the "extend" block again -- there may be multiple |
||||
// extend blocks in the same scope, each of which will have the same path. |
||||
// - A location's span is not always a subset of its parent's span. For |
||||
// example, the "extendee" of an extension declaration appears at the |
||||
// beginning of the "extend" block and is shared by all extensions within |
||||
// the block. |
||||
// - Just because a location's span is a subset of some other location's span |
||||
// does not mean that it is a descendent. For example, a "group" defines |
||||
// both a type and a field in a single declaration. Thus, the locations |
||||
// corresponding to the type and field and their components will overlap. |
||||
// - Code which tries to interpret locations should probably be designed to |
||||
// ignore those that it doesn't understand, as more types of locations could |
||||
// be recorded in the future. |
||||
repeated Location location = 1; |
||||
message Location { |
||||
// Identifies which part of the FileDescriptorProto was defined at this |
||||
// location. |
||||
// |
||||
// Each element is a field number or an index. They form a path from |
||||
// the root FileDescriptorProto to the place where the definition. For |
||||
// example, this path: |
||||
// [ 4, 3, 2, 7, 1 ] |
||||
// refers to: |
||||
// file.message_type(3) // 4, 3 |
||||
// .field(7) // 2, 7 |
||||
// .name() // 1 |
||||
// This is because FileDescriptorProto.message_type has field number 4: |
||||
// repeated DescriptorProto message_type = 4; |
||||
// and DescriptorProto.field has field number 2: |
||||
// repeated FieldDescriptorProto field = 2; |
||||
// and FieldDescriptorProto.name has field number 1: |
||||
// optional string name = 1; |
||||
// |
||||
// Thus, the above path gives the location of a field name. If we removed |
||||
// the last element: |
||||
// [ 4, 3, 2, 7 ] |
||||
// this path refers to the whole field declaration (from the beginning |
||||
// of the label to the terminating semicolon). |
||||
repeated int32 path = 1 [packed=true]; |
||||
|
||||
// Always has exactly three or four elements: start line, start column, |
||||
// end line (optional, otherwise assumed same as start line), end column. |
||||
// These are packed into a single field for efficiency. Note that line |
||||
// and column numbers are zero-based -- typically you will want to add |
||||
// 1 to each before displaying to a user. |
||||
repeated int32 span = 2 [packed=true]; |
||||
|
||||
// TODO(kenton): Record comments appearing before and after the |
||||
// declaration. |
||||
} |
||||
} |
@ -1,636 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// A proto file we will use for unit testing. |
||||
|
||||
|
||||
// Some generic_services option(s) added automatically. |
||||
// See: http://go/proto2-generic-services-default |
||||
option cc_generic_services = true; // auto-added |
||||
option java_generic_services = true; // auto-added |
||||
option py_generic_services = true; // auto-added |
||||
|
||||
import "google/protobuf/unittest_import.proto"; |
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure |
||||
// that the generated code doesn't depend on being in the proto2 namespace. |
||||
// In test_util.h we do "using namespace unittest = protobuf_unittest". |
||||
package protobuf_unittest; |
||||
|
||||
// Protos optimized for SPEED use a strict superset of the generated code |
||||
// of equivalent ones optimized for CODE_SIZE, so we should optimize all our |
||||
// tests for speed unless explicitly testing code size optimization. |
||||
option optimize_for = SPEED; |
||||
|
||||
option java_outer_classname = "UnittestProto"; |
||||
|
||||
// This proto includes every type of field in both singular and repeated |
||||
// forms. |
||||
message TestAllTypes { |
||||
message NestedMessage { |
||||
// The field name "b" fails to compile in proto1 because it conflicts with |
||||
// a local variable named "b" in one of the generated methods. Doh. |
||||
// This file needs to compile in proto1 to test backwards-compatibility. |
||||
optional int32 bb = 1; |
||||
} |
||||
|
||||
enum NestedEnum { |
||||
FOO = 1; |
||||
BAR = 2; |
||||
BAZ = 3; |
||||
} |
||||
|
||||
// Singular |
||||
optional int32 optional_int32 = 1; |
||||
optional int64 optional_int64 = 2; |
||||
optional uint32 optional_uint32 = 3; |
||||
optional uint64 optional_uint64 = 4; |
||||
optional sint32 optional_sint32 = 5; |
||||
optional sint64 optional_sint64 = 6; |
||||
optional fixed32 optional_fixed32 = 7; |
||||
optional fixed64 optional_fixed64 = 8; |
||||
optional sfixed32 optional_sfixed32 = 9; |
||||
optional sfixed64 optional_sfixed64 = 10; |
||||
optional float optional_float = 11; |
||||
optional double optional_double = 12; |
||||
optional bool optional_bool = 13; |
||||
optional string optional_string = 14; |
||||
optional bytes optional_bytes = 15; |
||||
|
||||
optional group OptionalGroup = 16 { |
||||
optional int32 a = 17; |
||||
} |
||||
|
||||
optional NestedMessage optional_nested_message = 18; |
||||
optional ForeignMessage optional_foreign_message = 19; |
||||
optional protobuf_unittest_import.ImportMessage optional_import_message = 20; |
||||
|
||||
optional NestedEnum optional_nested_enum = 21; |
||||
optional ForeignEnum optional_foreign_enum = 22; |
||||
optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; |
||||
|
||||
optional string optional_string_piece = 24 [ctype=STRING_PIECE]; |
||||
optional string optional_cord = 25 [ctype=CORD]; |
||||
|
||||
// Repeated |
||||
repeated int32 repeated_int32 = 31; |
||||
repeated int64 repeated_int64 = 32; |
||||
repeated uint32 repeated_uint32 = 33; |
||||
repeated uint64 repeated_uint64 = 34; |
||||
repeated sint32 repeated_sint32 = 35; |
||||
repeated sint64 repeated_sint64 = 36; |
||||
repeated fixed32 repeated_fixed32 = 37; |
||||
repeated fixed64 repeated_fixed64 = 38; |
||||
repeated sfixed32 repeated_sfixed32 = 39; |
||||
repeated sfixed64 repeated_sfixed64 = 40; |
||||
repeated float repeated_float = 41; |
||||
repeated double repeated_double = 42; |
||||
repeated bool repeated_bool = 43; |
||||
repeated string repeated_string = 44; |
||||
repeated bytes repeated_bytes = 45; |
||||
|
||||
repeated group RepeatedGroup = 46 { |
||||
optional int32 a = 47; |
||||
} |
||||
|
||||
repeated NestedMessage repeated_nested_message = 48; |
||||
repeated ForeignMessage repeated_foreign_message = 49; |
||||
repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; |
||||
|
||||
repeated NestedEnum repeated_nested_enum = 51; |
||||
repeated ForeignEnum repeated_foreign_enum = 52; |
||||
repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; |
||||
|
||||
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; |
||||
repeated string repeated_cord = 55 [ctype=CORD]; |
||||
|
||||
// Singular with defaults |
||||
optional int32 default_int32 = 61 [default = 41 ]; |
||||
optional int64 default_int64 = 62 [default = 42 ]; |
||||
optional uint32 default_uint32 = 63 [default = 43 ]; |
||||
optional uint64 default_uint64 = 64 [default = 44 ]; |
||||
optional sint32 default_sint32 = 65 [default = -45 ]; |
||||
optional sint64 default_sint64 = 66 [default = 46 ]; |
||||
optional fixed32 default_fixed32 = 67 [default = 47 ]; |
||||
optional fixed64 default_fixed64 = 68 [default = 48 ]; |
||||
optional sfixed32 default_sfixed32 = 69 [default = 49 ]; |
||||
optional sfixed64 default_sfixed64 = 70 [default = -50 ]; |
||||
optional float default_float = 71 [default = 51.5 ]; |
||||
optional double default_double = 72 [default = 52e3 ]; |
||||
optional bool default_bool = 73 [default = true ]; |
||||
optional string default_string = 74 [default = "hello"]; |
||||
optional bytes default_bytes = 75 [default = "world"]; |
||||
|
||||
optional NestedEnum default_nested_enum = 81 [default = BAR ]; |
||||
optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; |
||||
optional protobuf_unittest_import.ImportEnum |
||||
default_import_enum = 83 [default = IMPORT_BAR]; |
||||
|
||||
optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; |
||||
optional string default_cord = 85 [ctype=CORD,default="123"]; |
||||
} |
||||
|
||||
message TestDeprecatedFields { |
||||
optional int32 deprecated_int32 = 1 [deprecated=true]; |
||||
} |
||||
|
||||
// Define these after TestAllTypes to make sure the compiler can handle |
||||
// that. |
||||
message ForeignMessage { |
||||
optional int32 c = 1; |
||||
} |
||||
|
||||
enum ForeignEnum { |
||||
FOREIGN_FOO = 4; |
||||
FOREIGN_BAR = 5; |
||||
FOREIGN_BAZ = 6; |
||||
} |
||||
|
||||
message TestAllExtensions { |
||||
extensions 1 to max; |
||||
} |
||||
|
||||
extend TestAllExtensions { |
||||
// Singular |
||||
optional int32 optional_int32_extension = 1; |
||||
optional int64 optional_int64_extension = 2; |
||||
optional uint32 optional_uint32_extension = 3; |
||||
optional uint64 optional_uint64_extension = 4; |
||||
optional sint32 optional_sint32_extension = 5; |
||||
optional sint64 optional_sint64_extension = 6; |
||||
optional fixed32 optional_fixed32_extension = 7; |
||||
optional fixed64 optional_fixed64_extension = 8; |
||||
optional sfixed32 optional_sfixed32_extension = 9; |
||||
optional sfixed64 optional_sfixed64_extension = 10; |
||||
optional float optional_float_extension = 11; |
||||
optional double optional_double_extension = 12; |
||||
optional bool optional_bool_extension = 13; |
||||
optional string optional_string_extension = 14; |
||||
optional bytes optional_bytes_extension = 15; |
||||
|
||||
optional group OptionalGroup_extension = 16 { |
||||
optional int32 a = 17; |
||||
} |
||||
|
||||
optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; |
||||
optional ForeignMessage optional_foreign_message_extension = 19; |
||||
optional protobuf_unittest_import.ImportMessage |
||||
optional_import_message_extension = 20; |
||||
|
||||
optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; |
||||
optional ForeignEnum optional_foreign_enum_extension = 22; |
||||
optional protobuf_unittest_import.ImportEnum |
||||
optional_import_enum_extension = 23; |
||||
|
||||
optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; |
||||
optional string optional_cord_extension = 25 [ctype=CORD]; |
||||
|
||||
// Repeated |
||||
repeated int32 repeated_int32_extension = 31; |
||||
repeated int64 repeated_int64_extension = 32; |
||||
repeated uint32 repeated_uint32_extension = 33; |
||||
repeated uint64 repeated_uint64_extension = 34; |
||||
repeated sint32 repeated_sint32_extension = 35; |
||||
repeated sint64 repeated_sint64_extension = 36; |
||||
repeated fixed32 repeated_fixed32_extension = 37; |
||||
repeated fixed64 repeated_fixed64_extension = 38; |
||||
repeated sfixed32 repeated_sfixed32_extension = 39; |
||||
repeated sfixed64 repeated_sfixed64_extension = 40; |
||||
repeated float repeated_float_extension = 41; |
||||
repeated double repeated_double_extension = 42; |
||||
repeated bool repeated_bool_extension = 43; |
||||
repeated string repeated_string_extension = 44; |
||||
repeated bytes repeated_bytes_extension = 45; |
||||
|
||||
repeated group RepeatedGroup_extension = 46 { |
||||
optional int32 a = 47; |
||||
} |
||||
|
||||
repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; |
||||
repeated ForeignMessage repeated_foreign_message_extension = 49; |
||||
repeated protobuf_unittest_import.ImportMessage |
||||
repeated_import_message_extension = 50; |
||||
|
||||
repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; |
||||
repeated ForeignEnum repeated_foreign_enum_extension = 52; |
||||
repeated protobuf_unittest_import.ImportEnum |
||||
repeated_import_enum_extension = 53; |
||||
|
||||
repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; |
||||
repeated string repeated_cord_extension = 55 [ctype=CORD]; |
||||
|
||||
// Singular with defaults |
||||
optional int32 default_int32_extension = 61 [default = 41 ]; |
||||
optional int64 default_int64_extension = 62 [default = 42 ]; |
||||
optional uint32 default_uint32_extension = 63 [default = 43 ]; |
||||
optional uint64 default_uint64_extension = 64 [default = 44 ]; |
||||
optional sint32 default_sint32_extension = 65 [default = -45 ]; |
||||
optional sint64 default_sint64_extension = 66 [default = 46 ]; |
||||
optional fixed32 default_fixed32_extension = 67 [default = 47 ]; |
||||
optional fixed64 default_fixed64_extension = 68 [default = 48 ]; |
||||
optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; |
||||
optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; |
||||
optional float default_float_extension = 71 [default = 51.5 ]; |
||||
optional double default_double_extension = 72 [default = 52e3 ]; |
||||
optional bool default_bool_extension = 73 [default = true ]; |
||||
optional string default_string_extension = 74 [default = "hello"]; |
||||
optional bytes default_bytes_extension = 75 [default = "world"]; |
||||
|
||||
optional TestAllTypes.NestedEnum |
||||
default_nested_enum_extension = 81 [default = BAR]; |
||||
optional ForeignEnum |
||||
default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; |
||||
optional protobuf_unittest_import.ImportEnum |
||||
default_import_enum_extension = 83 [default = IMPORT_BAR]; |
||||
|
||||
optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, |
||||
default="abc"]; |
||||
optional string default_cord_extension = 85 [ctype=CORD, default="123"]; |
||||
} |
||||
|
||||
message TestNestedExtension { |
||||
extend TestAllExtensions { |
||||
// Check for bug where string extensions declared in tested scope did not |
||||
// compile. |
||||
optional string test = 1002 [default="test"]; |
||||
} |
||||
} |
||||
|
||||
// We have separate messages for testing required fields because it's |
||||
// annoying to have to fill in required fields in TestProto in order to |
||||
// do anything with it. Note that we don't need to test every type of |
||||
// required filed because the code output is basically identical to |
||||
// optional fields for all types. |
||||
message TestRequired { |
||||
required int32 a = 1; |
||||
optional int32 dummy2 = 2; |
||||
required int32 b = 3; |
||||
|
||||
extend TestAllExtensions { |
||||
optional TestRequired single = 1000; |
||||
repeated TestRequired multi = 1001; |
||||
} |
||||
|
||||
// Pad the field count to 32 so that we can test that IsInitialized() |
||||
// properly checks multiple elements of has_bits_. |
||||
optional int32 dummy4 = 4; |
||||
optional int32 dummy5 = 5; |
||||
optional int32 dummy6 = 6; |
||||
optional int32 dummy7 = 7; |
||||
optional int32 dummy8 = 8; |
||||
optional int32 dummy9 = 9; |
||||
optional int32 dummy10 = 10; |
||||
optional int32 dummy11 = 11; |
||||
optional int32 dummy12 = 12; |
||||
optional int32 dummy13 = 13; |
||||
optional int32 dummy14 = 14; |
||||
optional int32 dummy15 = 15; |
||||
optional int32 dummy16 = 16; |
||||
optional int32 dummy17 = 17; |
||||
optional int32 dummy18 = 18; |
||||
optional int32 dummy19 = 19; |
||||
optional int32 dummy20 = 20; |
||||
optional int32 dummy21 = 21; |
||||
optional int32 dummy22 = 22; |
||||
optional int32 dummy23 = 23; |
||||
optional int32 dummy24 = 24; |
||||
optional int32 dummy25 = 25; |
||||
optional int32 dummy26 = 26; |
||||
optional int32 dummy27 = 27; |
||||
optional int32 dummy28 = 28; |
||||
optional int32 dummy29 = 29; |
||||
optional int32 dummy30 = 30; |
||||
optional int32 dummy31 = 31; |
||||
optional int32 dummy32 = 32; |
||||
|
||||
required int32 c = 33; |
||||
} |
||||
|
||||
message TestRequiredForeign { |
||||
optional TestRequired optional_message = 1; |
||||
repeated TestRequired repeated_message = 2; |
||||
optional int32 dummy = 3; |
||||
} |
||||
|
||||
// Test that we can use NestedMessage from outside TestAllTypes. |
||||
message TestForeignNested { |
||||
optional TestAllTypes.NestedMessage foreign_nested = 1; |
||||
} |
||||
|
||||
// TestEmptyMessage is used to test unknown field support. |
||||
message TestEmptyMessage { |
||||
} |
||||
|
||||
// Like above, but declare all field numbers as potential extensions. No |
||||
// actual extensions should ever be defined for this type. |
||||
message TestEmptyMessageWithExtensions { |
||||
extensions 1 to max; |
||||
} |
||||
|
||||
message TestMultipleExtensionRanges { |
||||
extensions 42; |
||||
extensions 4143 to 4243; |
||||
extensions 65536 to max; |
||||
} |
||||
|
||||
// Test that really large tag numbers don't break anything. |
||||
message TestReallyLargeTagNumber { |
||||
// The largest possible tag number is 2^28 - 1, since the wire format uses |
||||
// three bits to communicate wire type. |
||||
optional int32 a = 1; |
||||
optional int32 bb = 268435455; |
||||
} |
||||
|
||||
message TestRecursiveMessage { |
||||
optional TestRecursiveMessage a = 1; |
||||
optional int32 i = 2; |
||||
} |
||||
|
||||
// Test that mutual recursion works. |
||||
message TestMutualRecursionA { |
||||
optional TestMutualRecursionB bb = 1; |
||||
} |
||||
|
||||
message TestMutualRecursionB { |
||||
optional TestMutualRecursionA a = 1; |
||||
optional int32 optional_int32 = 2; |
||||
} |
||||
|
||||
// Test that groups have disjoint field numbers from their siblings and |
||||
// parents. This is NOT possible in proto1; only proto2. When attempting |
||||
// to compile with proto1, this will emit an error; so we only include it |
||||
// in protobuf_unittest_proto. |
||||
message TestDupFieldNumber { // NO_PROTO1 |
||||
optional int32 a = 1; // NO_PROTO1 |
||||
optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1 |
||||
optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1 |
||||
} // NO_PROTO1 |
||||
|
||||
|
||||
// Needed for a Python test. |
||||
message TestNestedMessageHasBits { |
||||
message NestedMessage { |
||||
repeated int32 nestedmessage_repeated_int32 = 1; |
||||
repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; |
||||
} |
||||
optional NestedMessage optional_nested_message = 1; |
||||
} |
||||
|
||||
|
||||
// Test an enum that has multiple values with the same number. |
||||
enum TestEnumWithDupValue { |
||||
FOO1 = 1; |
||||
BAR1 = 2; |
||||
BAZ = 3; |
||||
FOO2 = 1; |
||||
BAR2 = 2; |
||||
} |
||||
|
||||
// Test an enum with large, unordered values. |
||||
enum TestSparseEnum { |
||||
SPARSE_A = 123; |
||||
SPARSE_B = 62374; |
||||
SPARSE_C = 12589234; |
||||
SPARSE_D = -15; |
||||
SPARSE_E = -53452; |
||||
SPARSE_F = 0; |
||||
SPARSE_G = 2; |
||||
} |
||||
|
||||
// Test message with CamelCase field names. This violates Protocol Buffer |
||||
// standard style. |
||||
message TestCamelCaseFieldNames { |
||||
optional int32 PrimitiveField = 1; |
||||
optional string StringField = 2; |
||||
optional ForeignEnum EnumField = 3; |
||||
optional ForeignMessage MessageField = 4; |
||||
optional string StringPieceField = 5 [ctype=STRING_PIECE]; |
||||
optional string CordField = 6 [ctype=CORD]; |
||||
|
||||
repeated int32 RepeatedPrimitiveField = 7; |
||||
repeated string RepeatedStringField = 8; |
||||
repeated ForeignEnum RepeatedEnumField = 9; |
||||
repeated ForeignMessage RepeatedMessageField = 10; |
||||
repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; |
||||
repeated string RepeatedCordField = 12 [ctype=CORD]; |
||||
} |
||||
|
||||
|
||||
// We list fields out of order, to ensure that we're using field number and not |
||||
// field index to determine serialization order. |
||||
message TestFieldOrderings { |
||||
optional string my_string = 11; |
||||
extensions 2 to 10; |
||||
optional int64 my_int = 1; |
||||
extensions 12 to 100; |
||||
optional float my_float = 101; |
||||
} |
||||
|
||||
|
||||
extend TestFieldOrderings { |
||||
optional string my_extension_string = 50; |
||||
optional int32 my_extension_int = 5; |
||||
} |
||||
|
||||
|
||||
message TestExtremeDefaultValues { |
||||
optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; |
||||
optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; |
||||
optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; |
||||
optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; |
||||
optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; |
||||
|
||||
// The default value here is UTF-8 for "\u1234". (We could also just type |
||||
// the UTF-8 text directly into this text file rather than escape it, but |
||||
// lots of people use editors that would be confused by this.) |
||||
optional string utf8_string = 6 [default = "\341\210\264"]; |
||||
|
||||
// Tests for single-precision floating-point values. |
||||
optional float zero_float = 7 [default = 0]; |
||||
optional float one_float = 8 [default = 1]; |
||||
optional float small_float = 9 [default = 1.5]; |
||||
optional float negative_one_float = 10 [default = -1]; |
||||
optional float negative_float = 11 [default = -1.5]; |
||||
// Using exponents |
||||
optional float large_float = 12 [default = 2E8]; |
||||
optional float small_negative_float = 13 [default = -8e-28]; |
||||
|
||||
// Text for nonfinite floating-point values. |
||||
optional double inf_double = 14 [default = inf]; |
||||
optional double neg_inf_double = 15 [default = -inf]; |
||||
optional double nan_double = 16 [default = nan]; |
||||
optional float inf_float = 17 [default = inf]; |
||||
optional float neg_inf_float = 18 [default = -inf]; |
||||
optional float nan_float = 19 [default = nan]; |
||||
|
||||
// Tests for C++ trigraphs. |
||||
// Trigraphs should be escaped in C++ generated files, but they should not be |
||||
// escaped for other languages. |
||||
// Note that in .proto file, "\?" is a valid way to escape ? in string |
||||
// literals. |
||||
optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"]; |
||||
} |
||||
|
||||
message SparseEnumMessage { |
||||
optional TestSparseEnum sparse_enum = 1; |
||||
} |
||||
|
||||
// Test String and Bytes: string is for valid UTF-8 strings |
||||
message OneString { |
||||
optional string data = 1; |
||||
} |
||||
|
||||
message OneBytes { |
||||
optional bytes data = 1; |
||||
} |
||||
|
||||
// Test messages for packed fields |
||||
|
||||
message TestPackedTypes { |
||||
repeated int32 packed_int32 = 90 [packed = true]; |
||||
repeated int64 packed_int64 = 91 [packed = true]; |
||||
repeated uint32 packed_uint32 = 92 [packed = true]; |
||||
repeated uint64 packed_uint64 = 93 [packed = true]; |
||||
repeated sint32 packed_sint32 = 94 [packed = true]; |
||||
repeated sint64 packed_sint64 = 95 [packed = true]; |
||||
repeated fixed32 packed_fixed32 = 96 [packed = true]; |
||||
repeated fixed64 packed_fixed64 = 97 [packed = true]; |
||||
repeated sfixed32 packed_sfixed32 = 98 [packed = true]; |
||||
repeated sfixed64 packed_sfixed64 = 99 [packed = true]; |
||||
repeated float packed_float = 100 [packed = true]; |
||||
repeated double packed_double = 101 [packed = true]; |
||||
repeated bool packed_bool = 102 [packed = true]; |
||||
repeated ForeignEnum packed_enum = 103 [packed = true]; |
||||
} |
||||
|
||||
// A message with the same fields as TestPackedTypes, but without packing. Used |
||||
// to test packed <-> unpacked wire compatibility. |
||||
message TestUnpackedTypes { |
||||
repeated int32 unpacked_int32 = 90 [packed = false]; |
||||
repeated int64 unpacked_int64 = 91 [packed = false]; |
||||
repeated uint32 unpacked_uint32 = 92 [packed = false]; |
||||
repeated uint64 unpacked_uint64 = 93 [packed = false]; |
||||
repeated sint32 unpacked_sint32 = 94 [packed = false]; |
||||
repeated sint64 unpacked_sint64 = 95 [packed = false]; |
||||
repeated fixed32 unpacked_fixed32 = 96 [packed = false]; |
||||
repeated fixed64 unpacked_fixed64 = 97 [packed = false]; |
||||
repeated sfixed32 unpacked_sfixed32 = 98 [packed = false]; |
||||
repeated sfixed64 unpacked_sfixed64 = 99 [packed = false]; |
||||
repeated float unpacked_float = 100 [packed = false]; |
||||
repeated double unpacked_double = 101 [packed = false]; |
||||
repeated bool unpacked_bool = 102 [packed = false]; |
||||
repeated ForeignEnum unpacked_enum = 103 [packed = false]; |
||||
} |
||||
|
||||
message TestPackedExtensions { |
||||
extensions 1 to max; |
||||
} |
||||
|
||||
extend TestPackedExtensions { |
||||
repeated int32 packed_int32_extension = 90 [packed = true]; |
||||
repeated int64 packed_int64_extension = 91 [packed = true]; |
||||
repeated uint32 packed_uint32_extension = 92 [packed = true]; |
||||
repeated uint64 packed_uint64_extension = 93 [packed = true]; |
||||
repeated sint32 packed_sint32_extension = 94 [packed = true]; |
||||
repeated sint64 packed_sint64_extension = 95 [packed = true]; |
||||
repeated fixed32 packed_fixed32_extension = 96 [packed = true]; |
||||
repeated fixed64 packed_fixed64_extension = 97 [packed = true]; |
||||
repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; |
||||
repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; |
||||
repeated float packed_float_extension = 100 [packed = true]; |
||||
repeated double packed_double_extension = 101 [packed = true]; |
||||
repeated bool packed_bool_extension = 102 [packed = true]; |
||||
repeated ForeignEnum packed_enum_extension = 103 [packed = true]; |
||||
} |
||||
|
||||
// Used by ExtensionSetTest/DynamicExtensions. The test actually builds |
||||
// a set of extensions to TestAllExtensions dynamically, based on the fields |
||||
// of this message type. |
||||
message TestDynamicExtensions { |
||||
enum DynamicEnumType { |
||||
DYNAMIC_FOO = 2200; |
||||
DYNAMIC_BAR = 2201; |
||||
DYNAMIC_BAZ = 2202; |
||||
} |
||||
message DynamicMessageType { |
||||
optional int32 dynamic_field = 2100; |
||||
} |
||||
|
||||
optional fixed32 scalar_extension = 2000; |
||||
optional ForeignEnum enum_extension = 2001; |
||||
optional DynamicEnumType dynamic_enum_extension = 2002; |
||||
|
||||
optional ForeignMessage message_extension = 2003; |
||||
optional DynamicMessageType dynamic_message_extension = 2004; |
||||
|
||||
repeated string repeated_extension = 2005; |
||||
repeated sint32 packed_extension = 2006 [packed = true]; |
||||
} |
||||
|
||||
message TestRepeatedScalarDifferentTagSizes { |
||||
// Parsing repeated fixed size values used to fail. This message needs to be |
||||
// used in order to get a tag of the right size; all of the repeated fields |
||||
// in TestAllTypes didn't trigger the check. |
||||
repeated fixed32 repeated_fixed32 = 12; |
||||
// Check for a varint type, just for good measure. |
||||
repeated int32 repeated_int32 = 13; |
||||
|
||||
// These have two-byte tags. |
||||
repeated fixed64 repeated_fixed64 = 2046; |
||||
repeated int64 repeated_int64 = 2047; |
||||
|
||||
// Three byte tags. |
||||
repeated float repeated_float = 262142; |
||||
repeated uint64 repeated_uint64 = 262143; |
||||
} |
||||
|
||||
|
||||
// Test that RPC services work. |
||||
message FooRequest {} |
||||
message FooResponse {} |
||||
|
||||
service TestService { |
||||
rpc Foo(FooRequest) returns (FooResponse); |
||||
rpc Bar(BarRequest) returns (BarResponse); |
||||
} |
||||
|
||||
|
||||
message BarRequest {} |
||||
message BarResponse {} |
@ -1,52 +0,0 @@ |
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: jonskeet@google.com (Jon Skeet) |
||||
// |
||||
// A proto file for unit testing the custom C# options |
||||
|
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCSharpOptionsProtoFile"; |
||||
//option (google.protobuf.csharp_file_options).nest_classes = true; |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
message OptionsMessage { |
||||
|
||||
// Will be left as Normal |
||||
optional string normal = 1; |
||||
|
||||
// Will be converted to OptionsMessage_ |
||||
optional string options_message = 2; |
||||
|
||||
// Will be converted to CustomName |
||||
optional string customized = 3 [(google.protobuf.csharp_field_options).property_name = "CustomName"]; |
||||
} |
@ -1,372 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCustomOptionsProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: benjy@google.com (Benjy Weinberger) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// A proto file used to test the "custom options" feature of proto2. |
||||
|
||||
|
||||
// Some generic_services option(s) added automatically. |
||||
// See: http://go/proto2-generic-services-default |
||||
option cc_generic_services = true; // auto-added |
||||
option java_generic_services = true; // auto-added |
||||
option py_generic_services = true; |
||||
|
||||
// A custom file option (defined below). |
||||
option (file_opt1) = 9876543210; |
||||
|
||||
import "google/protobuf/descriptor.proto"; |
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure |
||||
// that the generated code doesn't depend on being in the proto2 namespace. |
||||
package protobuf_unittest; |
||||
|
||||
|
||||
// Some simple test custom options of various types. |
||||
|
||||
extend google.protobuf.FileOptions { |
||||
optional uint64 file_opt1 = 7736974; |
||||
} |
||||
|
||||
extend google.protobuf.MessageOptions { |
||||
optional int32 message_opt1 = 7739036; |
||||
} |
||||
|
||||
extend google.protobuf.FieldOptions { |
||||
optional fixed64 field_opt1 = 7740936; |
||||
// This is useful for testing that we correctly register default values for |
||||
// extension options. |
||||
optional int32 field_opt2 = 7753913 [default=42]; |
||||
} |
||||
|
||||
extend google.protobuf.EnumOptions { |
||||
optional sfixed32 enum_opt1 = 7753576; |
||||
} |
||||
|
||||
extend google.protobuf.EnumValueOptions { |
||||
optional int32 enum_value_opt1 = 1560678; |
||||
} |
||||
|
||||
extend google.protobuf.ServiceOptions { |
||||
optional sint64 service_opt1 = 7887650; |
||||
} |
||||
|
||||
enum MethodOpt1 { |
||||
METHODOPT1_VAL1 = 1; |
||||
METHODOPT1_VAL2 = 2; |
||||
} |
||||
|
||||
extend google.protobuf.MethodOptions { |
||||
optional MethodOpt1 method_opt1 = 7890860; |
||||
} |
||||
|
||||
// A test message with custom options at all possible locations (and also some |
||||
// regular options, to make sure they interact nicely). |
||||
message TestMessageWithCustomOptions { |
||||
option message_set_wire_format = false; |
||||
|
||||
option (message_opt1) = -56; |
||||
|
||||
optional string field1 = 1 [ctype=CORD, |
||||
(field_opt1)=8765432109]; |
||||
|
||||
enum AnEnum { |
||||
option (enum_opt1) = -789; |
||||
|
||||
ANENUM_VAL1 = 1; |
||||
ANENUM_VAL2 = 2 [(enum_value_opt1) = 123]; |
||||
} |
||||
} |
||||
|
||||
|
||||
// A test RPC service with custom options at all possible locations (and also |
||||
// some regular options, to make sure they interact nicely). |
||||
message CustomOptionFooRequest { |
||||
} |
||||
|
||||
message CustomOptionFooResponse { |
||||
} |
||||
|
||||
service TestServiceWithCustomOptions { |
||||
option (service_opt1) = -9876543210; |
||||
|
||||
rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) { |
||||
option (method_opt1) = METHODOPT1_VAL2; |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
// Options of every possible field type, so we can test them all exhaustively. |
||||
|
||||
message DummyMessageContainingEnum { |
||||
enum TestEnumType { |
||||
TEST_OPTION_ENUM_TYPE1 = 22; |
||||
TEST_OPTION_ENUM_TYPE2 = -23; |
||||
} |
||||
} |
||||
|
||||
message DummyMessageInvalidAsOptionType { |
||||
} |
||||
|
||||
extend google.protobuf.MessageOptions { |
||||
optional bool bool_opt = 7706090; |
||||
optional int32 int32_opt = 7705709; |
||||
optional int64 int64_opt = 7705542; |
||||
optional uint32 uint32_opt = 7704880; |
||||
optional uint64 uint64_opt = 7702367; |
||||
optional sint32 sint32_opt = 7701568; |
||||
optional sint64 sint64_opt = 7700863; |
||||
optional fixed32 fixed32_opt = 7700307; |
||||
optional fixed64 fixed64_opt = 7700194; |
||||
optional sfixed32 sfixed32_opt = 7698645; |
||||
optional sfixed64 sfixed64_opt = 7685475; |
||||
optional float float_opt = 7675390; |
||||
optional double double_opt = 7673293; |
||||
optional string string_opt = 7673285; |
||||
optional bytes bytes_opt = 7673238; |
||||
optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233; |
||||
optional DummyMessageInvalidAsOptionType message_type_opt = 7665967; |
||||
} |
||||
|
||||
message CustomOptionMinIntegerValues { |
||||
option (bool_opt) = false; |
||||
option (int32_opt) = -0x80000000; |
||||
option (int64_opt) = -0x8000000000000000; |
||||
option (uint32_opt) = 0; |
||||
option (uint64_opt) = 0; |
||||
option (sint32_opt) = -0x80000000; |
||||
option (sint64_opt) = -0x8000000000000000; |
||||
option (fixed32_opt) = 0; |
||||
option (fixed64_opt) = 0; |
||||
option (sfixed32_opt) = -0x80000000; |
||||
option (sfixed64_opt) = -0x8000000000000000; |
||||
} |
||||
|
||||
message CustomOptionMaxIntegerValues { |
||||
option (bool_opt) = true; |
||||
option (int32_opt) = 0x7FFFFFFF; |
||||
option (int64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||
option (uint32_opt) = 0xFFFFFFFF; |
||||
option (uint64_opt) = 0xFFFFFFFFFFFFFFFF; |
||||
option (sint32_opt) = 0x7FFFFFFF; |
||||
option (sint64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||
option (fixed32_opt) = 0xFFFFFFFF; |
||||
option (fixed64_opt) = 0xFFFFFFFFFFFFFFFF; |
||||
option (sfixed32_opt) = 0x7FFFFFFF; |
||||
option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||
} |
||||
|
||||
message CustomOptionOtherValues { |
||||
option (int32_opt) = -100; // To test sign-extension. |
||||
option (float_opt) = 12.3456789; |
||||
option (double_opt) = 1.234567890123456789; |
||||
option (string_opt) = "Hello, \"World\""; |
||||
option (bytes_opt) = "Hello\0World"; |
||||
option (enum_opt) = TEST_OPTION_ENUM_TYPE2; |
||||
} |
||||
|
||||
message SettingRealsFromPositiveInts { |
||||
option (float_opt) = 12; |
||||
option (double_opt) = 154; |
||||
} |
||||
|
||||
message SettingRealsFromNegativeInts { |
||||
option (float_opt) = -12; |
||||
option (double_opt) = -154; |
||||
} |
||||
|
||||
// Options of complex message types, themselves combined and extended in |
||||
// various ways. |
||||
|
||||
message ComplexOptionType1 { |
||||
optional int32 foo = 1; |
||||
optional int32 foo2 = 2; |
||||
optional int32 foo3 = 3; |
||||
|
||||
extensions 100 to max; |
||||
} |
||||
|
||||
message ComplexOptionType2 { |
||||
optional ComplexOptionType1 bar = 1; |
||||
optional int32 baz = 2; |
||||
|
||||
message ComplexOptionType4 { |
||||
optional int32 waldo = 1; |
||||
|
||||
extend google.protobuf.MessageOptions { |
||||
optional ComplexOptionType4 complex_opt4 = 7633546; |
||||
} |
||||
} |
||||
|
||||
optional ComplexOptionType4 fred = 3; |
||||
|
||||
extensions 100 to max; |
||||
} |
||||
|
||||
message ComplexOptionType3 { |
||||
optional int32 qux = 1; |
||||
|
||||
optional group ComplexOptionType5 = 2 { |
||||
optional int32 plugh = 3; |
||||
} |
||||
} |
||||
|
||||
extend ComplexOptionType1 { |
||||
optional int32 quux = 7663707; |
||||
optional ComplexOptionType3 corge = 7663442; |
||||
} |
||||
|
||||
extend ComplexOptionType2 { |
||||
optional int32 grault = 7650927; |
||||
optional ComplexOptionType1 garply = 7649992; |
||||
} |
||||
|
||||
extend google.protobuf.MessageOptions { |
||||
optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756; |
||||
optional ComplexOptionType2 complex_opt2 = 7636949; |
||||
optional ComplexOptionType3 complex_opt3 = 7636463; |
||||
optional group ComplexOpt6 = 7595468 { |
||||
optional int32 xyzzy = 7593951; |
||||
} |
||||
} |
||||
|
||||
// Note that we try various different ways of naming the same extension. |
||||
message VariousComplexOptions { |
||||
option (.protobuf_unittest.complex_opt1).foo = 42; |
||||
option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324; |
||||
option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876; |
||||
option (complex_opt2).baz = 987; |
||||
option (complex_opt2).(grault) = 654; |
||||
option (complex_opt2).bar.foo = 743; |
||||
option (complex_opt2).bar.(quux) = 1999; |
||||
option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008; |
||||
option (complex_opt2).(garply).foo = 741; |
||||
option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998; |
||||
option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121; |
||||
option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971; |
||||
option (complex_opt2).fred.waldo = 321; |
||||
option (protobuf_unittest.complex_opt3).qux = 9; |
||||
option (complex_opt3).complexoptiontype5.plugh = 22; |
||||
option (complexopt6).xyzzy = 24; |
||||
} |
||||
|
||||
// ------------------------------------------------------ |
||||
// Definitions for testing aggregate option parsing. |
||||
// See descriptor_unittest.cc. |
||||
|
||||
message AggregateMessageSet { |
||||
option message_set_wire_format = true; |
||||
extensions 4 to max; |
||||
} |
||||
|
||||
message AggregateMessageSetElement { |
||||
extend AggregateMessageSet { |
||||
optional AggregateMessageSetElement message_set_extension = 15447542; |
||||
} |
||||
optional string s = 1; |
||||
} |
||||
|
||||
// A helper type used to test aggregate option parsing |
||||
message Aggregate { |
||||
optional int32 i = 1; |
||||
optional string s = 2; |
||||
|
||||
// A nested object |
||||
optional Aggregate sub = 3; |
||||
|
||||
// To test the parsing of extensions inside aggregate values |
||||
optional google.protobuf.FileOptions file = 4; |
||||
extend google.protobuf.FileOptions { |
||||
optional Aggregate nested = 15476903; |
||||
} |
||||
|
||||
// An embedded message set |
||||
optional AggregateMessageSet mset = 5; |
||||
} |
||||
|
||||
// Allow Aggregate to be used as an option at all possible locations |
||||
// in the .proto grammer. |
||||
extend google.protobuf.FileOptions { optional Aggregate fileopt = 15478479; } |
||||
extend google.protobuf.MessageOptions { optional Aggregate msgopt = 15480088; } |
||||
extend google.protobuf.FieldOptions { optional Aggregate fieldopt = 15481374; } |
||||
extend google.protobuf.EnumOptions { optional Aggregate enumopt_renamed = 15483218; } |
||||
extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; } |
||||
extend google.protobuf.ServiceOptions { optional Aggregate serviceopt = 15497145; } |
||||
extend google.protobuf.MethodOptions { optional Aggregate methodopt = 15512713; } |
||||
|
||||
// Try using AggregateOption at different points in the proto grammar |
||||
option (fileopt) = { |
||||
s: 'FileAnnotation' |
||||
// Also test the handling of comments |
||||
/* of both types */ i: 100 |
||||
|
||||
sub { s: 'NestedFileAnnotation' } |
||||
|
||||
// Include a google.protobuf.FileOptions and recursively extend it with |
||||
// another fileopt. |
||||
file { |
||||
[protobuf_unittest.fileopt] { |
||||
s:'FileExtensionAnnotation' |
||||
} |
||||
} |
||||
|
||||
// A message set inside an option value |
||||
mset { |
||||
[protobuf_unittest.AggregateMessageSetElement.message_set_extension] { |
||||
s: 'EmbeddedMessageSetElement' |
||||
} |
||||
} |
||||
}; |
||||
|
||||
message AggregateMessage { |
||||
option (msgopt) = { i:101 s:'MessageAnnotation' }; |
||||
optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }]; |
||||
} |
||||
|
||||
service AggregateService { |
||||
option (serviceopt) = { s:'ServiceAnnotation' }; |
||||
rpc Method (AggregateMessage) returns (AggregateMessage) { |
||||
option (methodopt) = { s:'MethodAnnotation' }; |
||||
} |
||||
} |
||||
|
||||
enum AggregateEnum { |
||||
option (enumopt_renamed) = { s:'EnumAnnotation' }; |
||||
VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }]; |
||||
} |
@ -1,56 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmbedOptimizeForProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// A proto file which imports a proto file that uses optimize_for = CODE_SIZE. |
||||
|
||||
import "google/protobuf/unittest_optimize_for.proto"; |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
// We optimize for speed here, but we are importing a proto that is optimized |
||||
// for code size. |
||||
option optimize_for = SPEED; |
||||
|
||||
message TestEmbedOptimizedForSize { |
||||
// Test that embedding a message which has optimize_for = CODE_SIZE into |
||||
// one optimized for speed works. |
||||
optional TestOptimizedForSize optional_message = 1; |
||||
repeated TestOptimizedForSize repeated_message = 2; |
||||
} |
@ -1,43 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmptyProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// This file intentionally left blank. (At one point this wouldn't compile |
||||
// correctly.) |
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,67 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// A proto file which is imported by unittest.proto to test importing. |
||||
|
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure |
||||
// that the generated code doesn't depend on being in the proto2 namespace. |
||||
// In test_util.h we do |
||||
// "using namespace unittest_import = protobuf_unittest_import". |
||||
package protobuf_unittest_import; |
||||
|
||||
option optimize_for = SPEED; |
||||
|
||||
// Excercise the java_package option. |
||||
option java_package = "com.google.protobuf.test"; |
||||
|
||||
// Do not set a java_outer_classname here to verify that Proto2 works without |
||||
// one. |
||||
|
||||
message ImportMessage { |
||||
optional int32 d = 1; |
||||
} |
||||
|
||||
enum ImportEnum { |
||||
IMPORT_FOO = 7; |
||||
IMPORT_BAR = 8; |
||||
IMPORT_BAZ = 9; |
||||
} |
||||
|
@ -1,55 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportLiteProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// |
||||
// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME. |
||||
|
||||
package protobuf_unittest_import; |
||||
|
||||
option optimize_for = LITE_RUNTIME; |
||||
|
||||
option java_package = "com.google.protobuf"; |
||||
|
||||
message ImportMessageLite { |
||||
optional int32 d = 1; |
||||
} |
||||
|
||||
enum ImportEnumLite { |
||||
IMPORT_LITE_FOO = 7; |
||||
IMPORT_LITE_BAR = 8; |
||||
IMPORT_LITE_BAZ = 9; |
||||
} |
@ -1,318 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// |
||||
// This is like unittest.proto but with optimize_for = LITE_RUNTIME. |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
import "google/protobuf/unittest_import_lite.proto"; |
||||
|
||||
option optimize_for = LITE_RUNTIME; |
||||
|
||||
option java_package = "com.google.protobuf"; |
||||
|
||||
// Same as TestAllTypes but with the lite runtime. |
||||
message TestAllTypesLite { |
||||
message NestedMessage { |
||||
optional int32 bb = 1; |
||||
} |
||||
|
||||
enum NestedEnum { |
||||
FOO = 1; |
||||
BAR = 2; |
||||
BAZ = 3; |
||||
} |
||||
|
||||
// Singular |
||||
optional int32 optional_int32 = 1; |
||||
optional int64 optional_int64 = 2; |
||||
optional uint32 optional_uint32 = 3; |
||||
optional uint64 optional_uint64 = 4; |
||||
optional sint32 optional_sint32 = 5; |
||||
optional sint64 optional_sint64 = 6; |
||||
optional fixed32 optional_fixed32 = 7; |
||||
optional fixed64 optional_fixed64 = 8; |
||||
optional sfixed32 optional_sfixed32 = 9; |
||||
optional sfixed64 optional_sfixed64 = 10; |
||||
optional float optional_float = 11; |
||||
optional double optional_double = 12; |
||||
optional bool optional_bool = 13; |
||||
optional string optional_string = 14; |
||||
optional bytes optional_bytes = 15; |
||||
|
||||
optional group OptionalGroup = 16 { |
||||
optional int32 a = 17; |
||||
} |
||||
|
||||
optional NestedMessage optional_nested_message = 18; |
||||
optional ForeignMessageLite optional_foreign_message = 19; |
||||
optional protobuf_unittest_import.ImportMessageLite |
||||
optional_import_message = 20; |
||||
|
||||
optional NestedEnum optional_nested_enum = 21; |
||||
optional ForeignEnumLite optional_foreign_enum = 22; |
||||
optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23; |
||||
|
||||
optional string optional_string_piece = 24 [ctype=STRING_PIECE]; |
||||
optional string optional_cord = 25 [ctype=CORD]; |
||||
|
||||
// Repeated |
||||
repeated int32 repeated_int32 = 31; |
||||
repeated int64 repeated_int64 = 32; |
||||
repeated uint32 repeated_uint32 = 33; |
||||
repeated uint64 repeated_uint64 = 34; |
||||
repeated sint32 repeated_sint32 = 35; |
||||
repeated sint64 repeated_sint64 = 36; |
||||
repeated fixed32 repeated_fixed32 = 37; |
||||
repeated fixed64 repeated_fixed64 = 38; |
||||
repeated sfixed32 repeated_sfixed32 = 39; |
||||
repeated sfixed64 repeated_sfixed64 = 40; |
||||
repeated float repeated_float = 41; |
||||
repeated double repeated_double = 42; |
||||
repeated bool repeated_bool = 43; |
||||
repeated string repeated_string = 44; |
||||
repeated bytes repeated_bytes = 45; |
||||
|
||||
repeated group RepeatedGroup = 46 { |
||||
optional int32 a = 47; |
||||
} |
||||
|
||||
repeated NestedMessage repeated_nested_message = 48; |
||||
repeated ForeignMessageLite repeated_foreign_message = 49; |
||||
repeated protobuf_unittest_import.ImportMessageLite |
||||
repeated_import_message = 50; |
||||
|
||||
repeated NestedEnum repeated_nested_enum = 51; |
||||
repeated ForeignEnumLite repeated_foreign_enum = 52; |
||||
repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53; |
||||
|
||||
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; |
||||
repeated string repeated_cord = 55 [ctype=CORD]; |
||||
|
||||
// Singular with defaults |
||||
optional int32 default_int32 = 61 [default = 41 ]; |
||||
optional int64 default_int64 = 62 [default = 42 ]; |
||||
optional uint32 default_uint32 = 63 [default = 43 ]; |
||||
optional uint64 default_uint64 = 64 [default = 44 ]; |
||||
optional sint32 default_sint32 = 65 [default = -45 ]; |
||||
optional sint64 default_sint64 = 66 [default = 46 ]; |
||||
optional fixed32 default_fixed32 = 67 [default = 47 ]; |
||||
optional fixed64 default_fixed64 = 68 [default = 48 ]; |
||||
optional sfixed32 default_sfixed32 = 69 [default = 49 ]; |
||||
optional sfixed64 default_sfixed64 = 70 [default = -50 ]; |
||||
optional float default_float = 71 [default = 51.5 ]; |
||||
optional double default_double = 72 [default = 52e3 ]; |
||||
optional bool default_bool = 73 [default = true ]; |
||||
optional string default_string = 74 [default = "hello"]; |
||||
optional bytes default_bytes = 75 [default = "world"]; |
||||
|
||||
optional NestedEnum default_nested_enum = 81 [default = BAR]; |
||||
optional ForeignEnumLite default_foreign_enum = 82 |
||||
[default = FOREIGN_LITE_BAR]; |
||||
optional protobuf_unittest_import.ImportEnumLite |
||||
default_import_enum = 83 [default = IMPORT_LITE_BAR]; |
||||
|
||||
optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; |
||||
optional string default_cord = 85 [ctype=CORD,default="123"]; |
||||
} |
||||
|
||||
message ForeignMessageLite { |
||||
optional int32 c = 1; |
||||
} |
||||
|
||||
enum ForeignEnumLite { |
||||
FOREIGN_LITE_FOO = 4; |
||||
FOREIGN_LITE_BAR = 5; |
||||
FOREIGN_LITE_BAZ = 6; |
||||
} |
||||
|
||||
message TestPackedTypesLite { |
||||
repeated int32 packed_int32 = 90 [packed = true]; |
||||
repeated int64 packed_int64 = 91 [packed = true]; |
||||
repeated uint32 packed_uint32 = 92 [packed = true]; |
||||
repeated uint64 packed_uint64 = 93 [packed = true]; |
||||
repeated sint32 packed_sint32 = 94 [packed = true]; |
||||
repeated sint64 packed_sint64 = 95 [packed = true]; |
||||
repeated fixed32 packed_fixed32 = 96 [packed = true]; |
||||
repeated fixed64 packed_fixed64 = 97 [packed = true]; |
||||
repeated sfixed32 packed_sfixed32 = 98 [packed = true]; |
||||
repeated sfixed64 packed_sfixed64 = 99 [packed = true]; |
||||
repeated float packed_float = 100 [packed = true]; |
||||
repeated double packed_double = 101 [packed = true]; |
||||
repeated bool packed_bool = 102 [packed = true]; |
||||
repeated ForeignEnumLite packed_enum = 103 [packed = true]; |
||||
} |
||||
|
||||
message TestAllExtensionsLite { |
||||
extensions 1 to max; |
||||
} |
||||
|
||||
extend TestAllExtensionsLite { |
||||
// Singular |
||||
optional int32 optional_int32_extension_lite = 1; |
||||
optional int64 optional_int64_extension_lite = 2; |
||||
optional uint32 optional_uint32_extension_lite = 3; |
||||
optional uint64 optional_uint64_extension_lite = 4; |
||||
optional sint32 optional_sint32_extension_lite = 5; |
||||
optional sint64 optional_sint64_extension_lite = 6; |
||||
optional fixed32 optional_fixed32_extension_lite = 7; |
||||
optional fixed64 optional_fixed64_extension_lite = 8; |
||||
optional sfixed32 optional_sfixed32_extension_lite = 9; |
||||
optional sfixed64 optional_sfixed64_extension_lite = 10; |
||||
optional float optional_float_extension_lite = 11; |
||||
optional double optional_double_extension_lite = 12; |
||||
optional bool optional_bool_extension_lite = 13; |
||||
optional string optional_string_extension_lite = 14; |
||||
optional bytes optional_bytes_extension_lite = 15; |
||||
|
||||
optional group OptionalGroup_extension_lite = 16 { |
||||
optional int32 a = 17; |
||||
} |
||||
|
||||
optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite |
||||
= 18; |
||||
optional ForeignMessageLite optional_foreign_message_extension_lite = 19; |
||||
optional protobuf_unittest_import.ImportMessageLite |
||||
optional_import_message_extension_lite = 20; |
||||
|
||||
optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21; |
||||
optional ForeignEnumLite optional_foreign_enum_extension_lite = 22; |
||||
optional protobuf_unittest_import.ImportEnumLite |
||||
optional_import_enum_extension_lite = 23; |
||||
|
||||
optional string optional_string_piece_extension_lite = 24 |
||||
[ctype=STRING_PIECE]; |
||||
optional string optional_cord_extension_lite = 25 [ctype=CORD]; |
||||
|
||||
// Repeated |
||||
repeated int32 repeated_int32_extension_lite = 31; |
||||
repeated int64 repeated_int64_extension_lite = 32; |
||||
repeated uint32 repeated_uint32_extension_lite = 33; |
||||
repeated uint64 repeated_uint64_extension_lite = 34; |
||||
repeated sint32 repeated_sint32_extension_lite = 35; |
||||
repeated sint64 repeated_sint64_extension_lite = 36; |
||||
repeated fixed32 repeated_fixed32_extension_lite = 37; |
||||
repeated fixed64 repeated_fixed64_extension_lite = 38; |
||||
repeated sfixed32 repeated_sfixed32_extension_lite = 39; |
||||
repeated sfixed64 repeated_sfixed64_extension_lite = 40; |
||||
repeated float repeated_float_extension_lite = 41; |
||||
repeated double repeated_double_extension_lite = 42; |
||||
repeated bool repeated_bool_extension_lite = 43; |
||||
repeated string repeated_string_extension_lite = 44; |
||||
repeated bytes repeated_bytes_extension_lite = 45; |
||||
|
||||
repeated group RepeatedGroup_extension_lite = 46 { |
||||
optional int32 a = 47; |
||||
} |
||||
|
||||
repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite |
||||
= 48; |
||||
repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49; |
||||
repeated protobuf_unittest_import.ImportMessageLite |
||||
repeated_import_message_extension_lite = 50; |
||||
|
||||
repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51; |
||||
repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52; |
||||
repeated protobuf_unittest_import.ImportEnumLite |
||||
repeated_import_enum_extension_lite = 53; |
||||
|
||||
repeated string repeated_string_piece_extension_lite = 54 |
||||
[ctype=STRING_PIECE]; |
||||
repeated string repeated_cord_extension_lite = 55 [ctype=CORD]; |
||||
|
||||
// Singular with defaults |
||||
optional int32 default_int32_extension_lite = 61 [default = 41 ]; |
||||
optional int64 default_int64_extension_lite = 62 [default = 42 ]; |
||||
optional uint32 default_uint32_extension_lite = 63 [default = 43 ]; |
||||
optional uint64 default_uint64_extension_lite = 64 [default = 44 ]; |
||||
optional sint32 default_sint32_extension_lite = 65 [default = -45 ]; |
||||
optional sint64 default_sint64_extension_lite = 66 [default = 46 ]; |
||||
optional fixed32 default_fixed32_extension_lite = 67 [default = 47 ]; |
||||
optional fixed64 default_fixed64_extension_lite = 68 [default = 48 ]; |
||||
optional sfixed32 default_sfixed32_extension_lite = 69 [default = 49 ]; |
||||
optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50 ]; |
||||
optional float default_float_extension_lite = 71 [default = 51.5 ]; |
||||
optional double default_double_extension_lite = 72 [default = 52e3 ]; |
||||
optional bool default_bool_extension_lite = 73 [default = true ]; |
||||
optional string default_string_extension_lite = 74 [default = "hello"]; |
||||
optional bytes default_bytes_extension_lite = 75 [default = "world"]; |
||||
|
||||
optional TestAllTypesLite.NestedEnum |
||||
default_nested_enum_extension_lite = 81 [default = BAR]; |
||||
optional ForeignEnumLite |
||||
default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR]; |
||||
optional protobuf_unittest_import.ImportEnumLite |
||||
default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR]; |
||||
|
||||
optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE, |
||||
default="abc"]; |
||||
optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"]; |
||||
} |
||||
|
||||
message TestPackedExtensionsLite { |
||||
extensions 1 to max; |
||||
} |
||||
|
||||
extend TestPackedExtensionsLite { |
||||
repeated int32 packed_int32_extension_lite = 90 [packed = true]; |
||||
repeated int64 packed_int64_extension_lite = 91 [packed = true]; |
||||
repeated uint32 packed_uint32_extension_lite = 92 [packed = true]; |
||||
repeated uint64 packed_uint64_extension_lite = 93 [packed = true]; |
||||
repeated sint32 packed_sint32_extension_lite = 94 [packed = true]; |
||||
repeated sint64 packed_sint64_extension_lite = 95 [packed = true]; |
||||
repeated fixed32 packed_fixed32_extension_lite = 96 [packed = true]; |
||||
repeated fixed64 packed_fixed64_extension_lite = 97 [packed = true]; |
||||
repeated sfixed32 packed_sfixed32_extension_lite = 98 [packed = true]; |
||||
repeated sfixed64 packed_sfixed64_extension_lite = 99 [packed = true]; |
||||
repeated float packed_float_extension_lite = 100 [packed = true]; |
||||
repeated double packed_double_extension_lite = 101 [packed = true]; |
||||
repeated bool packed_bool_extension_lite = 102 [packed = true]; |
||||
repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true]; |
||||
} |
||||
|
||||
message TestNestedExtensionLite { |
||||
extend TestAllExtensionsLite { |
||||
optional int32 nested_extension = 12345; |
||||
} |
||||
} |
||||
|
||||
// Test that deprecated fields work. We only verify that they compile (at one |
||||
// point this failed). |
||||
message TestDeprecatedLite { |
||||
optional int32 deprecated_field = 1 [deprecated = true]; |
||||
} |
@ -1,49 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteImportNonLiteProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// |
||||
// Tests that a "lite" message can import a regular message. |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
import "google/protobuf/unittest.proto"; |
||||
|
||||
option optimize_for = LITE_RUNTIME; |
||||
|
||||
message TestLiteImportsNonlite { |
||||
optional TestAllTypes message = 1; |
||||
} |
@ -1,78 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestMessageSetProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// This file contains messages for testing message_set_wire_format. |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
option optimize_for = SPEED; |
||||
|
||||
// A message with message_set_wire_format. |
||||
message TestMessageSet { |
||||
option message_set_wire_format = true; |
||||
extensions 4 to max; |
||||
} |
||||
|
||||
message TestMessageSetContainer { |
||||
optional TestMessageSet message_set = 1; |
||||
} |
||||
|
||||
message TestMessageSetExtension1 { |
||||
extend TestMessageSet { |
||||
optional TestMessageSetExtension1 message_set_extension = 1545008; |
||||
} |
||||
optional int32 i = 15; |
||||
} |
||||
|
||||
message TestMessageSetExtension2 { |
||||
extend TestMessageSet { |
||||
optional TestMessageSetExtension2 message_set_extension = 1547769; |
||||
} |
||||
optional string str = 25; |
||||
} |
||||
|
||||
// MessageSet wire format is equivalent to this. |
||||
message RawMessageSet { |
||||
repeated group Item = 1 { |
||||
required int32 type_id = 2; |
||||
required bytes message = 3; |
||||
} |
||||
} |
||||
|
@ -1,58 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos.NoGenericService"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestNoGenericServicesProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
|
||||
package google.protobuf.no_generic_services_test; |
||||
|
||||
// *_generic_services are false by default. |
||||
|
||||
message TestMessage { |
||||
optional int32 a = 1; |
||||
extensions 1000 to max; |
||||
} |
||||
|
||||
enum TestEnum { |
||||
FOO = 1; |
||||
} |
||||
|
||||
extend TestMessage { |
||||
optional int32 test_extension = 1000; |
||||
} |
||||
|
||||
service TestService { |
||||
rpc Foo(TestMessage) returns(TestMessage); |
||||
} |
@ -1,67 +0,0 @@ |
||||
// Additional options required for C# generation. File from copyright |
||||
// line onwards is as per original distribution. |
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestOptimizeForProtoFile"; |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
// Author: kenton@google.com (Kenton Varda) |
||||
// Based on original Protocol Buffers design by |
||||
// Sanjay Ghemawat, Jeff Dean, and others. |
||||
// |
||||
// A proto file which uses optimize_for = CODE_SIZE. |
||||
|
||||
import "google/protobuf/unittest.proto"; |
||||
|
||||
package protobuf_unittest; |
||||
|
||||
option optimize_for = CODE_SIZE; |
||||
|
||||
message TestOptimizedForSize { |
||||
optional int32 i = 1; |
||||
optional ForeignMessage msg = 19; |
||||
|
||||
extensions 1000 to max; |
||||
|
||||
extend TestOptimizedForSize { |
||||
optional int32 test_extension = 1234; |
||||
optional TestRequiredOptimizedForSize test_extension2 = 1235; |
||||
} |
||||
} |
||||
|
||||
message TestRequiredOptimizedForSize { |
||||
required int32 x = 1; |
||||
} |
||||
|
||||
message TestOptionalOptimizedForSize { |
||||
optional TestRequiredOptimizedForSize o = 1; |
||||
} |
@ -1,140 +0,0 @@ |
||||
package unittest_google_size; |
||||
|
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSizeProtoFile"; |
||||
|
||||
option java_outer_classname = "GoogleSize"; |
||||
option optimize_for = CODE_SIZE; |
||||
|
||||
message SizeMessage1 { |
||||
required string field1 = 1; |
||||
optional string field9 = 9; |
||||
optional string field18 = 18; |
||||
optional bool field80 = 80 [default=false]; |
||||
optional bool field81 = 81 [default=true]; |
||||
required int32 field2 = 2; |
||||
required int32 field3 = 3; |
||||
optional int32 field280 = 280; |
||||
optional int32 field6 = 6 [default=0]; |
||||
optional int64 field22 = 22; |
||||
optional string field4 = 4; |
||||
repeated fixed64 field5 = 5; |
||||
optional bool field59 = 59 [default=false]; |
||||
optional string field7 = 7; |
||||
optional int32 field16 = 16; |
||||
optional int32 field130 = 130 [default=0]; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional bool field17 = 17 [default=true]; |
||||
optional bool field13 = 13 [default=true]; |
||||
optional bool field14 = 14 [default=true]; |
||||
optional int32 field104 = 104 [default=0]; |
||||
optional int32 field100 = 100 [default=0]; |
||||
optional int32 field101 = 101 [default=0]; |
||||
optional string field102 = 102; |
||||
optional string field103 = 103; |
||||
optional int32 field29 = 29 [default=0]; |
||||
optional bool field30 = 30 [default=false]; |
||||
optional int32 field60 = 60 [default=-1]; |
||||
optional int32 field271 = 271 [default=-1]; |
||||
optional int32 field272 = 272 [default=-1]; |
||||
optional int32 field150 = 150; |
||||
optional int32 field23 = 23 [default=0]; |
||||
optional bool field24 = 24 [default=false]; |
||||
optional int32 field25 = 25 [default=0]; |
||||
optional SizeMessage1SubMessage field15 = 15; |
||||
optional bool field78 = 78; |
||||
optional int32 field67 = 67 [default=0]; |
||||
optional int32 field68 = 68; |
||||
optional int32 field128 = 128 [default=0]; |
||||
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||
optional int32 field131 = 131 [default=0]; |
||||
} |
||||
|
||||
message SizeMessage1SubMessage { |
||||
optional int32 field1 = 1 [default=0]; |
||||
optional int32 field2 = 2 [default=0]; |
||||
optional int32 field3 = 3 [default=0]; |
||||
optional string field15 = 15; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional int64 field13 = 13; |
||||
optional int64 field14 = 14; |
||||
optional int32 field16 = 16; |
||||
optional int32 field19 = 19 [default=2]; |
||||
optional bool field20 = 20 [default=true]; |
||||
optional bool field28 = 28 [default=true]; |
||||
optional fixed64 field21 = 21; |
||||
optional int32 field22 = 22; |
||||
optional bool field23 = 23 [ default=false ]; |
||||
optional bool field206 = 206 [default=false]; |
||||
optional fixed32 field203 = 203; |
||||
optional int32 field204 = 204; |
||||
optional string field205 = 205; |
||||
optional uint64 field207 = 207; |
||||
optional uint64 field300 = 300; |
||||
} |
||||
|
||||
message SizeMessage2 { |
||||
optional string field1 = 1; |
||||
optional int64 field3 = 3; |
||||
optional int64 field4 = 4; |
||||
optional int64 field30 = 30; |
||||
optional bool field75 = 75 [default=false]; |
||||
optional string field6 = 6; |
||||
optional bytes field2 = 2; |
||||
optional int32 field21 = 21 [default=0]; |
||||
optional int32 field71 = 71; |
||||
optional float field25 = 25; |
||||
optional int32 field109 = 109 [default=0]; |
||||
optional int32 field210 = 210 [default=0]; |
||||
optional int32 field211 = 211 [default=0]; |
||||
optional int32 field212 = 212 [default=0]; |
||||
optional int32 field213 = 213 [default=0]; |
||||
optional int32 field216 = 216 [default=0]; |
||||
optional int32 field217 = 217 [default=0]; |
||||
optional int32 field218 = 218 [default=0]; |
||||
optional int32 field220 = 220 [default=0]; |
||||
optional int32 field221 = 221 [default=0]; |
||||
optional float field222 = 222 [default=0.0]; |
||||
optional int32 field63 = 63; |
||||
|
||||
repeated group Group1 = 10 { |
||||
required float field11 = 11; |
||||
optional float field26 = 26; |
||||
optional string field12 = 12; |
||||
optional string field13 = 13; |
||||
repeated string field14 = 14; |
||||
required uint64 field15 = 15; |
||||
optional int32 field5 = 5; |
||||
optional string field27 = 27; |
||||
optional int32 field28 = 28; |
||||
optional string field29 = 29; |
||||
optional string field16 = 16; |
||||
repeated string field22 = 22; |
||||
repeated int32 field73 = 73; |
||||
optional int32 field20 = 20 [default=0]; |
||||
optional string field24 = 24; |
||||
optional SizeMessage2GroupedMessage field31 = 31; |
||||
} |
||||
repeated string field128 = 128; |
||||
optional int64 field131 = 131; |
||||
repeated string field127 = 127; |
||||
optional int32 field129 = 129; |
||||
repeated int64 field130 = 130; |
||||
optional bool field205 = 205 [default=false]; |
||||
optional bool field206 = 206 [default=false]; |
||||
} |
||||
|
||||
message SizeMessage2GroupedMessage { |
||||
optional float field1 = 1; |
||||
optional float field2 = 2; |
||||
optional float field3 = 3 [default=0.0]; |
||||
optional bool field4 = 4; |
||||
optional bool field5 = 5; |
||||
optional bool field6 = 6 [default=true]; |
||||
optional bool field7 = 7 [default=false]; |
||||
optional float field8 = 8; |
||||
optional bool field9 = 9; |
||||
optional float field10 = 10; |
||||
optional int64 field11 = 11; |
||||
} |
@ -1,140 +0,0 @@ |
||||
package unittest_google_speed; |
||||
|
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSpeedProtoFile"; |
||||
|
||||
option java_outer_classname = "GoogleSpeed"; |
||||
option optimize_for = SPEED; |
||||
|
||||
message SpeedMessage1 { |
||||
required string field1 = 1; |
||||
optional string field9 = 9; |
||||
optional string field18 = 18; |
||||
optional bool field80 = 80 [default=false]; |
||||
optional bool field81 = 81 [default=true]; |
||||
required int32 field2 = 2; |
||||
required int32 field3 = 3; |
||||
optional int32 field280 = 280; |
||||
optional int32 field6 = 6 [default=0]; |
||||
optional int64 field22 = 22; |
||||
optional string field4 = 4; |
||||
repeated fixed64 field5 = 5; |
||||
optional bool field59 = 59 [default=false]; |
||||
optional string field7 = 7; |
||||
optional int32 field16 = 16; |
||||
optional int32 field130 = 130 [default=0]; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional bool field17 = 17 [default=true]; |
||||
optional bool field13 = 13 [default=true]; |
||||
optional bool field14 = 14 [default=true]; |
||||
optional int32 field104 = 104 [default=0]; |
||||
optional int32 field100 = 100 [default=0]; |
||||
optional int32 field101 = 101 [default=0]; |
||||
optional string field102 = 102; |
||||
optional string field103 = 103; |
||||
optional int32 field29 = 29 [default=0]; |
||||
optional bool field30 = 30 [default=false]; |
||||
optional int32 field60 = 60 [default=-1]; |
||||
optional int32 field271 = 271 [default=-1]; |
||||
optional int32 field272 = 272 [default=-1]; |
||||
optional int32 field150 = 150; |
||||
optional int32 field23 = 23 [default=0]; |
||||
optional bool field24 = 24 [default=false]; |
||||
optional int32 field25 = 25 [default=0]; |
||||
optional SpeedMessage1SubMessage field15 = 15; |
||||
optional bool field78 = 78; |
||||
optional int32 field67 = 67 [default=0]; |
||||
optional int32 field68 = 68; |
||||
optional int32 field128 = 128 [default=0]; |
||||
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||
optional int32 field131 = 131 [default=0]; |
||||
} |
||||
|
||||
message SpeedMessage1SubMessage { |
||||
optional int32 field1 = 1 [default=0]; |
||||
optional int32 field2 = 2 [default=0]; |
||||
optional int32 field3 = 3 [default=0]; |
||||
optional string field15 = 15; |
||||
optional bool field12 = 12 [default=true]; |
||||
optional int64 field13 = 13; |
||||
optional int64 field14 = 14; |
||||
optional int32 field16 = 16; |
||||
optional int32 field19 = 19 [default=2]; |
||||
optional bool field20 = 20 [default=true]; |
||||
optional bool field28 = 28 [default=true]; |
||||
optional fixed64 field21 = 21; |
||||
optional int32 field22 = 22; |
||||
optional bool field23 = 23 [ default=false ]; |
||||
optional bool field206 = 206 [default=false]; |
||||
optional fixed32 field203 = 203; |
||||
optional int32 field204 = 204; |
||||
optional string field205 = 205; |
||||
optional uint64 field207 = 207; |
||||
optional uint64 field300 = 300; |
||||
} |
||||
|
||||
message SpeedMessage2 { |
||||
optional string field1 = 1; |
||||
optional int64 field3 = 3; |
||||
optional int64 field4 = 4; |
||||
optional int64 field30 = 30; |
||||
optional bool field75 = 75 [default=false]; |
||||
optional string field6 = 6; |
||||
optional bytes field2 = 2; |
||||
optional int32 field21 = 21 [default=0]; |
||||
optional int32 field71 = 71; |
||||
optional float field25 = 25; |
||||
optional int32 field109 = 109 [default=0]; |
||||
optional int32 field210 = 210 [default=0]; |
||||
optional int32 field211 = 211 [default=0]; |
||||
optional int32 field212 = 212 [default=0]; |
||||
optional int32 field213 = 213 [default=0]; |
||||
optional int32 field216 = 216 [default=0]; |
||||
optional int32 field217 = 217 [default=0]; |
||||
optional int32 field218 = 218 [default=0]; |
||||
optional int32 field220 = 220 [default=0]; |
||||
optional int32 field221 = 221 [default=0]; |
||||
optional float field222 = 222 [default=0.0]; |
||||
optional int32 field63 = 63; |
||||
|
||||
repeated group Group1 = 10 { |
||||
required float field11 = 11; |
||||
optional float field26 = 26; |
||||
optional string field12 = 12; |
||||
optional string field13 = 13; |
||||
repeated string field14 = 14; |
||||
required uint64 field15 = 15; |
||||
optional int32 field5 = 5; |
||||
optional string field27 = 27; |
||||
optional int32 field28 = 28; |
||||
optional string field29 = 29; |
||||
optional string field16 = 16; |
||||
repeated string field22 = 22; |
||||
repeated int32 field73 = 73; |
||||
optional int32 field20 = 20 [default=0]; |
||||
optional string field24 = 24; |
||||
optional SpeedMessage2GroupedMessage field31 = 31; |
||||
} |
||||
repeated string field128 = 128; |
||||
optional int64 field131 = 131; |
||||
repeated string field127 = 127; |
||||
optional int32 field129 = 129; |
||||
repeated int64 field130 = 130; |
||||
optional bool field205 = 205 [default=false]; |
||||
optional bool field206 = 206 [default=false]; |
||||
} |
||||
|
||||
message SpeedMessage2GroupedMessage { |
||||
optional float field1 = 1; |
||||
optional float field2 = 2; |
||||
optional float field3 = 3 [default=0.0]; |
||||
optional bool field4 = 4; |
||||
optional bool field5 = 5; |
||||
optional bool field6 = 6 [default=true]; |
||||
optional bool field7 = 7 [default=false]; |
||||
optional float field8 = 8; |
||||
optional bool field9 = 9; |
||||
optional float field10 = 10; |
||||
optional int64 field11 = 11; |
||||
} |
@ -1,44 +0,0 @@ |
||||
<NotepadPlus> |
||||
<!-- |
||||
Defines syntax highlighting for Notepad++. |
||||
1. Install Notepad++ from http://notepad-plus-plus.org |
||||
2. Open Notepad++, from the View menu, select "User-Defined Dialog..." |
||||
3. Click the "Import..." button and select this file |
||||
4. Restart Notepad++ |
||||
5. Open and edit any *.proto file |
||||
--> |
||||
<UserLang name="Proto Buffer" ext="proto"> |
||||
<Settings> |
||||
<Global caseIgnored="no" /> |
||||
<TreatAsSymbol comment="no" commentLine="yes" /> |
||||
<Prefix words1="no" words2="no" words3="no" words4="yes" /> |
||||
</Settings> |
||||
<KeywordLists> |
||||
<Keywords name="Delimiters">[00]00</Keywords> |
||||
<Keywords name="Folder+">{</Keywords> |
||||
<Keywords name="Folder-">}</Keywords> |
||||
<Keywords name="Operators">=</Keywords> |
||||
<Keywords name="Comment"> 1option 1package 1import 2; 0//</Keywords> |
||||
<Keywords name="Words1">message enum service extend</Keywords> |
||||
<Keywords name="Words2">required optional repeated extensions to rpc returns</Keywords> |
||||
<Keywords name="Words3">double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes</Keywords> |
||||
<Keywords name="Words4"></Keywords> |
||||
</KeywordLists> |
||||
<Styles> |
||||
<WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="FOLDEROPEN" styleID="12" fgColor="000000" bgColor="FFFFFF" fontStyle="1" /> |
||||
<WordsStyle name="FOLDERCLOSE" styleID="13" fgColor="000000" bgColor="FFFFFF" fontStyle="1" /> |
||||
<WordsStyle name="KEYWORD1" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="KEYWORD2" styleID="6" fgColor="0080C0" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="KEYWORD3" styleID="7" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="KEYWORD4" styleID="8" fgColor="008040" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="COMMENT LINE" styleID="2" fgColor="949494" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="NUMBER" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="OPERATOR" styleID="10" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="DELIMINER1" styleID="14" fgColor="800080" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="DELIMINER2" styleID="15" fgColor="808080" bgColor="FFFFFF" fontStyle="0" /> |
||||
<WordsStyle name="DELIMINER3" styleID="16" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||
</Styles> |
||||
</UserLang> |
||||
</NotepadPlus> |
@ -1,31 +0,0 @@ |
||||
package tutorial; |
||||
|
||||
import "google/protobuf/csharp_options.proto"; |
||||
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; |
||||
option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; |
||||
|
||||
option optimize_for = SPEED; |
||||
|
||||
message Person { |
||||
required string name = 1; |
||||
required int32 id = 2; // Unique ID number for this person. |
||||
optional string email = 3; |
||||
|
||||
enum PhoneType { |
||||
MOBILE = 0; |
||||
HOME = 1; |
||||
WORK = 2; |
||||
} |
||||
|
||||
message PhoneNumber { |
||||
required string number = 1; |
||||
optional PhoneType type = 2 [default = HOME]; |
||||
} |
||||
|
||||
repeated PhoneNumber phone = 4; |
||||
} |
||||
|
||||
// Our address book file is just one of these. |
||||
message AddressBook { |
||||
repeated Person person = 1; |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,150 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
using NUnit.Framework; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Tests for the dependency resolution in Generator. |
||||
/// </summary> |
||||
[TestFixture] |
||||
public class DependencyResolutionTest |
||||
{ |
||||
[Test] |
||||
public void TwoDistinctFiles() |
||||
{ |
||||
FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build(); |
||||
FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build(); |
||||
var set = new List<FileDescriptorProto> { first, second }; |
||||
|
||||
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.AreEqual(2, converted.Count); |
||||
Assert.AreEqual("First", converted[0].Name); |
||||
Assert.AreEqual(0, converted[0].Dependencies.Count); |
||||
Assert.AreEqual("Second", converted[1].Name); |
||||
Assert.AreEqual(0, converted[1].Dependencies.Count); |
||||
} |
||||
|
||||
[Test] |
||||
public void FirstDependsOnSecond() |
||||
{ |
||||
FileDescriptorProto first = |
||||
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||
FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build(); |
||||
var set = new List<FileDescriptorProto> { first, second }; |
||||
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.AreEqual(2, converted.Count); |
||||
Assert.AreEqual("First", converted[0].Name); |
||||
Assert.AreEqual(1, converted[0].Dependencies.Count); |
||||
Assert.AreEqual(converted[1], converted[0].Dependencies[0]); |
||||
Assert.AreEqual("Second", converted[1].Name); |
||||
Assert.AreEqual(0, converted[1].Dependencies.Count); |
||||
} |
||||
|
||||
[Test] |
||||
public void SecondDependsOnFirst() |
||||
{ |
||||
FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build(); |
||||
FileDescriptorProto second = |
||||
new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build(); |
||||
var set = new List<FileDescriptorProto> { first, second }; |
||||
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.AreEqual(2, converted.Count); |
||||
Assert.AreEqual("First", converted[0].Name); |
||||
Assert.AreEqual(0, converted[0].Dependencies.Count); |
||||
Assert.AreEqual("Second", converted[1].Name); |
||||
Assert.AreEqual(1, converted[1].Dependencies.Count); |
||||
Assert.AreEqual(converted[0], converted[1].Dependencies[0]); |
||||
} |
||||
|
||||
[Test] |
||||
public void CircularDependency() |
||||
{ |
||||
FileDescriptorProto first = |
||||
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||
FileDescriptorProto second = |
||||
new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build(); |
||||
var set = new List<FileDescriptorProto> { first, second }; |
||||
try |
||||
{ |
||||
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.Fail("Expected exception"); |
||||
} |
||||
catch (DependencyResolutionException) |
||||
{ |
||||
// Expected |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void MissingDependency() |
||||
{ |
||||
FileDescriptorProto first = |
||||
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||
var set = new List<FileDescriptorProto> { first }; |
||||
try |
||||
{ |
||||
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.Fail("Expected exception"); |
||||
} |
||||
catch (DependencyResolutionException) |
||||
{ |
||||
// Expected |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void SelfDependency() |
||||
{ |
||||
FileDescriptorProto first = |
||||
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"First"}}.Build(); |
||||
var set = new List<FileDescriptorProto> { first }; |
||||
try |
||||
{ |
||||
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||
Assert.Fail("Expected exception"); |
||||
} |
||||
catch (DependencyResolutionException) |
||||
{ |
||||
// Expected |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,30 +0,0 @@ |
||||
using System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
// General Information about an assembly is controlled through the following |
||||
// set of attributes. Change these attribute values to modify the information |
||||
// associated with an assembly. |
||||
|
||||
[assembly: AssemblyTitle("ProtoGen.Test")] |
||||
[assembly: AssemblyDescription("")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("")] |
||||
[assembly: AssemblyProduct("ProtoGen.Test")] |
||||
[assembly: AssemblyCopyright("Copyright © 2008")] |
||||
[assembly: AssemblyTrademark("")] |
||||
[assembly: AssemblyCulture("")] |
||||
|
||||
// Version information for an assembly consists of the following four values: |
||||
// |
||||
// Major Version |
||||
// Minor Version |
||||
// Build Number |
||||
// Revision |
||||
// |
||||
// You can specify all the values or you can default the Build and Revision Numbers |
||||
// by using the '*' as shown below: |
||||
// [assembly: AssemblyVersion("2.4.1.555")] |
||||
|
||||
[assembly: AssemblyVersion("2.4.1.555")] |
||||
[assembly: AssemblyFileVersion("2.4.1.555")] |
@ -1,683 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using NUnit.Framework; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Reflection; |
||||
using System.Text; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Tests protoc-gen-cs plugin. |
||||
/// </summary> |
||||
[TestFixture] |
||||
[Category("Preprocessor")] |
||||
public partial class ProtocGenCsUnittests |
||||
{ |
||||
private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "protoc-gen-cs.Test"); |
||||
|
||||
private const string DefaultProto = |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}";
|
||||
|
||||
#region TestFixture SetUp/TearDown |
||||
|
||||
private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory; |
||||
|
||||
private StringBuilder buffer = new StringBuilder(); |
||||
|
||||
[TestFixtureSetUp] |
||||
public virtual void Setup() |
||||
{ |
||||
Teardown(); |
||||
Directory.CreateDirectory(TempPath); |
||||
Environment.CurrentDirectory = TempPath; |
||||
this.buffer.Length = 0; |
||||
} |
||||
|
||||
[TestFixtureTearDown] |
||||
public virtual void Teardown() |
||||
{ |
||||
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||
if (Directory.Exists(TempPath)) |
||||
{ |
||||
Directory.Delete(TempPath, true); |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Helper Methods RunProtoGen / RunCsc |
||||
|
||||
private void RunProtoc(int expect, string protoFile, params string[] args) |
||||
{ |
||||
string protoPath = string.Format("-I. -I\"{0}\"", OriginalWorkingDirectory); |
||||
string plugin = string.Format("--plugin=\"{0}\"", Path.Combine(OriginalWorkingDirectory, "protoc-gen-cs.exe")); |
||||
string csOut = args.Length == 0 ? "--cs_out=." : string.Format("--cs_out=\"{0}:.\"", string.Join(" ", args)); |
||||
// Start the child process. |
||||
Process p = new Process(); |
||||
// Redirect the output stream of the child process. |
||||
p.StartInfo.CreateNoWindow = true; |
||||
p.StartInfo.UseShellExecute = false; |
||||
p.StartInfo.RedirectStandardError = true; |
||||
p.StartInfo.RedirectStandardOutput = true; |
||||
p.StartInfo.WorkingDirectory = TempPath; |
||||
p.StartInfo.FileName = Path.Combine(OriginalWorkingDirectory, "protoc.exe"); |
||||
p.StartInfo.Arguments = string.Join(" ", new string[] { plugin, csOut, protoPath, protoFile }); |
||||
p.Start(); |
||||
// Read the output stream first and then wait. |
||||
buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments)); |
||||
buffer.AppendLine(p.StandardError.ReadToEnd()); |
||||
buffer.AppendLine(p.StandardOutput.ReadToEnd()); |
||||
p.WaitForExit(); |
||||
Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString()); |
||||
} |
||||
|
||||
private Assembly RunCsc(int expect, params string[] sources) |
||||
{ |
||||
using (TempFile tempDll = new TempFile(String.Empty)) |
||||
{ |
||||
tempDll.ChangeExtension(".dll"); |
||||
List<string> args = new List<string>(); |
||||
args.Add("/nologo"); |
||||
args.Add("/target:library"); |
||||
args.Add("/debug-"); |
||||
args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath)); |
||||
args.Add("/r:System.dll"); |
||||
args.Add(String.Format(@"""/r:{0}""", |
||||
typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly. |
||||
Location)); |
||||
args.AddRange(sources); |
||||
|
||||
string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), |
||||
"csc.exe"); |
||||
ProcessStartInfo psi = new ProcessStartInfo(exe); |
||||
psi.WorkingDirectory = TempPath; |
||||
psi.CreateNoWindow = true; |
||||
psi.UseShellExecute = false; |
||||
psi.RedirectStandardOutput = true; |
||||
psi.RedirectStandardError = true; |
||||
psi.Arguments = string.Join(" ", args.ToArray()); |
||||
Process p = Process.Start(psi); |
||||
buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments)); |
||||
buffer.AppendLine(p.StandardError.ReadToEnd()); |
||||
buffer.AppendLine(p.StandardOutput.ReadToEnd()); |
||||
p.WaitForExit(); |
||||
Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString()); |
||||
|
||||
Assembly asm = null; |
||||
if (p.ExitCode == 0) |
||||
{ |
||||
byte[] allbytes = File.ReadAllBytes(tempDll.TempPath); |
||||
asm = Assembly.Load(allbytes); |
||||
|
||||
foreach (Type t in asm.GetTypes()) |
||||
{ |
||||
Debug.WriteLine(t.FullName, asm.FullName); |
||||
} |
||||
} |
||||
return asm; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
// ******************************************************************* |
||||
// The following tests excercise options for protogen.exe |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestProtoFile() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithConflictingType() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message " +
|
||||
test + @" {
|
||||
optional string name = 1; |
||||
} "))
|
||||
{ |
||||
RunProtoc(0, proto.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test, true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-namespace=MyNewNamespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithUmbrellaClassName() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.MyUmbrellaClassname", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNestedClass() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-nest_classes=true"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithExpandedNsDirectories() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-expand_namespace_directories=true"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNewExtension() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".Generated.cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-file_extension=.Generated.cs"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithUmbrellaNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-umbrella_namespace=MyUmbrella.Namespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(0, proto.TempPath, "-nest_classes=true", "-umbrella_namespace=MyUmbrella.Namespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithExplicitEmptyUmbrellaNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message " +
|
||||
test + @" {
|
||||
optional string name = 1; |
||||
} "))
|
||||
{ |
||||
//Forces the umbrella class to not use a namespace even if a collision with a type is detected. |
||||
RunProtoc(0, proto.TempPath, "-umbrella_namespace="); |
||||
//error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed |
||||
RunCsc(1, source.TempPath); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNewOutputFolder() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoc(1, proto.TempPath, "-output_directory=generated-code"); |
||||
Directory.CreateDirectory("generated-code"); |
||||
RunProtoc(0, proto.TempPath, "-output_directory=generated-code"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileAndIgnoreGoogleProtobuf() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
" +
|
||||
DefaultProto)) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
RunProtoc(0, proto.TempPath); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithoutIgnoreGoogleProtobuf() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
" +
|
||||
DefaultProto)) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
//Without the option this fails due to being unable to resolve google/protobuf descriptors |
||||
RunProtoc(0, proto.TempPath); |
||||
} |
||||
} |
||||
|
||||
// ******************************************************************* |
||||
// The following tests excercise options for protoc.exe |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithIncludeImports() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} ")
|
||||
) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
//if you specify the protoc option --include_imports this should build three source files |
||||
RunProtoc(0, proto.TempPath); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
//Seems the --proto_path or -I option is non-functional for me. Maybe others have luck? |
||||
[Test] |
||||
public void TestProtoFileInDifferentDirectory() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||
RunProtoc(0, proto.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
// ******************************************************************* |
||||
// Handling of mutliple input files |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestMultipleProtoFiles() |
||||
{ |
||||
Setup(); |
||||
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||
using ( |
||||
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}")
|
||||
) |
||||
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||
using ( |
||||
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
import ""MyMessage.proto""; |
||||
// Test a very simple message. |
||||
message MyMessageList { |
||||
repeated MyMessage messages = 1; |
||||
}")
|
||||
) |
||||
{ |
||||
RunProtoc(0, proto1.TempPath); |
||||
RunProtoc(0, proto2.TempPath); |
||||
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||
//assert that the message type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestOneProtoFileWithBufferFile() |
||||
{ |
||||
Setup(); |
||||
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||
using ( |
||||
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}")
|
||||
) |
||||
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||
using ( |
||||
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
import ""MyMessage.proto""; |
||||
// Test a very simple message. |
||||
message MyMessageList { |
||||
repeated MyMessage messages = 1; |
||||
}")
|
||||
) |
||||
{ |
||||
//build the proto buffer for MyMessage |
||||
RunProtoc(0, proto1.TempPath); |
||||
//build the MyMessageList proto-buffer and generate code by including MyMessage.pb |
||||
RunProtoc(0, proto2.TempPath); |
||||
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||
//assert that the message type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithService() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} |
||||
// test a very simple service. |
||||
service TestService { |
||||
rpc Execute (MyMessage) returns (MyMessage); |
||||
}"))
|
||||
{ |
||||
CopyInGoogleProtoFiles(); |
||||
|
||||
RunProtoc(0, proto.TempPath, "-nest_classes=false"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the service type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||
//assert that the Stub subclass type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithServiceInternal() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} |
||||
// test a very simple service. |
||||
service TestService { |
||||
rpc Execute (MyMessage) returns (MyMessage); |
||||
}"))
|
||||
{ |
||||
CopyInGoogleProtoFiles(); |
||||
|
||||
RunProtoc(0, proto.TempPath, "-nest_classes=false", "-public_classes=false"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the service type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||
//assert that the Stub subclass type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||
} |
||||
} |
||||
|
||||
private static void CopyInGoogleProtoFiles() |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,59 +0,0 @@ |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Text; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class ProtoFile : TempFile |
||||
{ |
||||
public ProtoFile(string filename, string contents) |
||||
: base(filename, contents) |
||||
{ |
||||
} |
||||
} |
||||
|
||||
internal class TempFile : IDisposable |
||||
{ |
||||
private string tempFile; |
||||
|
||||
public static TempFile Attach(string path) |
||||
{ |
||||
return new TempFile(path, null); |
||||
} |
||||
|
||||
protected TempFile(string filename, string contents) |
||||
{ |
||||
tempFile = filename; |
||||
if (contents != null) |
||||
{ |
||||
File.WriteAllText(tempFile, contents, new UTF8Encoding(false)); |
||||
} |
||||
} |
||||
|
||||
public TempFile(string contents) |
||||
: this(Path.GetTempFileName(), contents) |
||||
{ |
||||
} |
||||
|
||||
public string TempPath |
||||
{ |
||||
get { return tempFile; } |
||||
} |
||||
|
||||
public void ChangeExtension(string ext) |
||||
{ |
||||
string newFile = Path.ChangeExtension(tempFile, ext); |
||||
File.Move(tempFile, newFile); |
||||
tempFile = newFile; |
||||
} |
||||
|
||||
public void Dispose() |
||||
{ |
||||
if (File.Exists(tempFile)) |
||||
{ |
||||
File.Delete(tempFile); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,733 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Reflection; |
||||
using NUnit.Framework; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
[TestFixture] |
||||
[Category("Preprocessor")] |
||||
public partial class TestPreprocessing |
||||
{ |
||||
private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "proto-gen-test"); |
||||
|
||||
private const string DefaultProto = |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}";
|
||||
|
||||
#region TestFixture SetUp/TearDown |
||||
|
||||
private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory; |
||||
|
||||
[TestFixtureSetUp] |
||||
public virtual void Setup() |
||||
{ |
||||
Teardown(); |
||||
Directory.CreateDirectory(TempPath); |
||||
Environment.CurrentDirectory = TempPath; |
||||
} |
||||
|
||||
[TestFixtureTearDown] |
||||
public virtual void Teardown() |
||||
{ |
||||
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||
if (Directory.Exists(TempPath)) |
||||
{ |
||||
Directory.Delete(TempPath, true); |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
#region Helper Methods RunProtoGen / RunCsc |
||||
|
||||
private void RunProtoGen(int expect, params string[] args) |
||||
{ |
||||
TextWriter tout = Console.Out, terr = Console.Error; |
||||
StringWriter temp = new StringWriter(); |
||||
Console.SetOut(temp); |
||||
Console.SetError(temp); |
||||
try |
||||
{ |
||||
Assert.AreEqual(expect, ProgramPreprocess.Run(args), "ProtoGen Failed: {0}", temp); |
||||
} |
||||
finally |
||||
{ |
||||
Console.SetOut(tout); |
||||
Console.SetError(terr); |
||||
} |
||||
} |
||||
|
||||
private Assembly RunCsc(int expect, params string[] sources) |
||||
{ |
||||
using (TempFile tempDll = new TempFile(String.Empty)) |
||||
{ |
||||
tempDll.ChangeExtension(".dll"); |
||||
List<string> args = new List<string>(); |
||||
args.Add("/nologo"); |
||||
args.Add("/target:library"); |
||||
args.Add("/debug-"); |
||||
args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath)); |
||||
args.Add("/r:System.dll"); |
||||
args.Add(String.Format(@"""/r:{0}""", |
||||
typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly. |
||||
Location)); |
||||
args.AddRange(sources); |
||||
|
||||
string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), |
||||
"csc.exe"); |
||||
ProcessStartInfo psi = new ProcessStartInfo(exe); |
||||
psi.CreateNoWindow = true; |
||||
psi.UseShellExecute = false; |
||||
psi.RedirectStandardOutput = true; |
||||
psi.RedirectStandardError = true; |
||||
psi.Arguments = string.Join(" ", args.ToArray()); |
||||
Process p = Process.Start(psi); |
||||
p.WaitForExit(); |
||||
string errorText = p.StandardOutput.ReadToEnd() + p.StandardError.ReadToEnd(); |
||||
Assert.AreEqual(expect, p.ExitCode, "CSC.exe Failed: {0}", errorText); |
||||
|
||||
Assembly asm = null; |
||||
if (p.ExitCode == 0) |
||||
{ |
||||
byte[] allbytes = File.ReadAllBytes(tempDll.TempPath); |
||||
asm = Assembly.Load(allbytes); |
||||
|
||||
foreach (Type t in asm.GetTypes()) |
||||
{ |
||||
Debug.WriteLine(t.FullName, asm.FullName); |
||||
} |
||||
} |
||||
return asm; |
||||
} |
||||
} |
||||
|
||||
#endregion |
||||
|
||||
// ******************************************************************* |
||||
// The following tests excercise options for protogen.exe |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestProtoFile() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithConflictingType() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message " +
|
||||
test + @" {
|
||||
optional string name = 1; |
||||
} "))
|
||||
{ |
||||
RunProtoGen(0, proto.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test, true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-namespace:MyNewNamespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithUmbrellaClassName() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.MyUmbrellaClassname", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNestedClass() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-nest_classes:true"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithExpandedNsDirectories() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-expand_namespace_directories:true"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNewExtension() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".Generated.cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-file_extension:.Generated.cs"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithUmbrellaNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-umbrella_namespace:MyUmbrella.Namespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "-nest_classes:true", "-umbrella_namespace:MyUmbrella.Namespace"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithExplicitEmptyUmbrellaNamespace() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message " +
|
||||
test + @" {
|
||||
optional string name = 1; |
||||
} "))
|
||||
{ |
||||
//Forces the umbrella class to not use a namespace even if a collision with a type is detected. |
||||
RunProtoGen(0, proto.TempPath, "-umbrella_namespace:"); |
||||
//error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed |
||||
RunCsc(1, source.TempPath); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithNewOutputFolder() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
RunProtoGen(1, proto.TempPath, "-output_directory:generated-code"); |
||||
Directory.CreateDirectory("generated-code"); |
||||
RunProtoGen(0, proto.TempPath, "-output_directory:generated-code"); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileAndIgnoreGoogleProtobuf() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
" +
|
||||
DefaultProto)) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithoutIgnoreGoogleProtobuf() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
" +
|
||||
DefaultProto)) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
//Without the option this fails due to being unable to resolve google/protobuf descriptors |
||||
RunProtoGen(1, proto.TempPath, "-ignore_google_protobuf:false"); |
||||
} |
||||
} |
||||
|
||||
// ******************************************************************* |
||||
// The following tests excercise options for protoc.exe |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithIncludeImports() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} ")
|
||||
) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
//if you specify the protoc option --include_imports this should build three source files |
||||
RunProtoGen(0, proto.TempPath, "--include_imports"); |
||||
Assert.AreEqual(3, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithIncludeImportsAndIgnoreGoogleProtobuf() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} ")
|
||||
) |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
|
||||
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
//Even with --include_imports, if you provide -ignore_google_protobuf:true you only get the one source file |
||||
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "--include_imports"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("MyNewNamespace." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileKeepingTheProtoBuffer() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile protobuf = TempFile.Attach(test + ".pb")) |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using ( |
||||
ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} ")
|
||||
) |
||||
{ |
||||
RunProtoGen(0, proto.TempPath, "--descriptor_set_out=" + protobuf.TempPath); |
||||
Assert.IsTrue(File.Exists(protobuf.TempPath), "Missing: " + protobuf.TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
//Seems the --proto_path or -I option is non-functional for me. Maybe others have luck? |
||||
[Test] |
||||
public void TestProtoFileInDifferentDirectory() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||
{ |
||||
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||
RunProtoGen(0, proto.TempPath, "--proto_path=" + TempPath); |
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple." + test, true, true); |
||||
} |
||||
} |
||||
|
||||
// ******************************************************************* |
||||
// Handling of mutliple input files |
||||
// ******************************************************************* |
||||
|
||||
[Test] |
||||
public void TestMultipleProtoFiles() |
||||
{ |
||||
Setup(); |
||||
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||
using ( |
||||
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}")
|
||||
) |
||||
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||
using ( |
||||
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
import ""MyMessage.proto""; |
||||
// Test a very simple message. |
||||
message MyMessageList { |
||||
repeated MyMessage messages = 1; |
||||
}")
|
||||
) |
||||
{ |
||||
RunProtoGen(0, proto1.TempPath, proto2.TempPath); |
||||
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||
//assert that the message type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestOneProtoFileWithBufferFile() |
||||
{ |
||||
Setup(); |
||||
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||
using (TempFile protobuf = TempFile.Attach("MyMessage.pb")) |
||||
using ( |
||||
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
}")
|
||||
) |
||||
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||
using ( |
||||
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||
@"
|
||||
package nunit.simple; |
||||
import ""MyMessage.proto""; |
||||
// Test a very simple message. |
||||
message MyMessageList { |
||||
repeated MyMessage messages = 1; |
||||
}")
|
||||
) |
||||
{ |
||||
//build the proto buffer for MyMessage |
||||
RunProtoGen(0, proto1.TempPath, "--descriptor_set_out=" + protobuf.TempPath); |
||||
//build the MyMessageList proto-buffer and generate code by including MyMessage.pb |
||||
RunProtoGen(0, proto2.TempPath, protobuf.TempPath); |
||||
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||
//assert that the message type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||
//assert that the message type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||
//assert that we can find the static descriptor type |
||||
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithService() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} |
||||
// test a very simple service. |
||||
service TestService { |
||||
rpc Execute (MyMessage) returns (MyMessage); |
||||
}"))
|
||||
{ |
||||
CopyInGoogleProtoFiles(); |
||||
|
||||
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the service type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||
//assert that the Stub subclass type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||
} |
||||
} |
||||
|
||||
[Test] |
||||
public void TestProtoFileWithServiceInternal() |
||||
{ |
||||
string test = new StackFrame(false).GetMethod().Name; |
||||
Setup(); |
||||
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||
@"
|
||||
import ""google/protobuf/csharp_options.proto""; |
||||
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||
|
||||
package nunit.simple; |
||||
// Test a very simple message. |
||||
message MyMessage { |
||||
optional string name = 1; |
||||
} |
||||
// test a very simple service. |
||||
service TestService { |
||||
rpc Execute (MyMessage) returns (MyMessage); |
||||
}"))
|
||||
{ |
||||
CopyInGoogleProtoFiles(); |
||||
|
||||
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false", "-public_classes=false"); |
||||
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||
|
||||
Assembly a = RunCsc(0, source.TempPath); |
||||
//assert that the service type is in the expected namespace |
||||
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||
//assert that the Stub subclass type is in the expected namespace |
||||
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||
} |
||||
} |
||||
|
||||
private static void CopyInGoogleProtoFiles() |
||||
{ |
||||
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||
Directory.CreateDirectory(google); |
||||
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||
{ |
||||
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,101 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup> |
||||
<EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor> |
||||
<EnvironmentTemplate>NET35</EnvironmentTemplate> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProductVersion>9.0.30729</ProductVersion> |
||||
<SchemaVersion>2.0</SchemaVersion> |
||||
<ProjectGuid>{C1024C9C-8176-48C3-B547-B9F6DF6B80A6}</ProjectGuid> |
||||
<OutputType>Library</OutputType> |
||||
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
<RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace> |
||||
<AssemblyName>protoc-gen-cs.Test</AssemblyName> |
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||
<FileAlignment>512</FileAlignment> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\NET35\Debug</OutputPath> |
||||
<IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath> |
||||
<DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||
<NoStdLib>true</NoStdLib> |
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\NET35\Release</OutputPath> |
||||
<IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath> |
||||
<DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||
<NoStdLib>true</NoStdLib> |
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||
</PropertyGroup> |
||||
<ItemGroup> |
||||
<Reference Include="nunit.framework"> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
<HintPath>..\..\lib\NUnit\lib\nunit.framework.dll</HintPath> |
||||
</Reference> |
||||
<Reference Include="mscorlib" /> |
||||
<Reference Include="System" /> |
||||
<Reference Include="System.Data" /> |
||||
<Reference Include="System.Xml" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="ProtocGenCsUnittests.cs" /> |
||||
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||
<Compile Include="TempFile.cs" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj"> |
||||
<Project>{6908bdce-d925-43f3-94ac-a531e6df2591}</Project> |
||||
<Name>ProtocolBuffers</Name> |
||||
</ProjectReference> |
||||
<ProjectReference Include="..\ProtoGen\protoc-gen-cs.csproj"> |
||||
<Project>{250ade34-82fd-4bae-86d5-985fbe589c4b}</Project> |
||||
<Name>protoc-gen-cs</Name> |
||||
</ProjectReference> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Content Include="..\..\lib\protoc.exe"> |
||||
<Link>protoc.exe</Link> |
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||
</Content> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<None Include="..\..\protos\google\protobuf\csharp_options.proto"> |
||||
<Link>google\protobuf\csharp_options.proto</Link> |
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||
</None> |
||||
<None Include="..\..\protos\google\protobuf\descriptor.proto"> |
||||
<Link>google\protobuf\descriptor.proto</Link> |
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||
</None> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
Other similar extension points exist, see Microsoft.Common.targets. |
||||
<Target Name="BeforeBuild"> |
||||
</Target> |
||||
<Target Name="AfterBuild"> |
||||
</Target> |
||||
--> |
||||
<PropertyGroup> |
||||
<StartAction>Program</StartAction> |
||||
<StartProgram>$(ProjectDir)..\..\lib\NUnit\tools\nunit-console.exe</StartProgram> |
||||
<StartArguments>/nologo /noshadow /labels /wait $(AssemblyName).dll</StartArguments> |
||||
<StartWorkingDirectory>$(ProjectDir)$(OutputPath)</StartWorkingDirectory> |
||||
</PropertyGroup> |
||||
</Project> |
@ -1,55 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Exception thrown when dependencies within a descriptor set can't be resolved. |
||||
/// </summary> |
||||
public sealed class DependencyResolutionException : Exception |
||||
{ |
||||
public DependencyResolutionException(string message) : base(message) |
||||
{ |
||||
} |
||||
|
||||
public DependencyResolutionException(string format, params object[] args) |
||||
: base(string.Format(format, args)) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -1,106 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Utility class for determining namespaces etc. |
||||
/// </summary> |
||||
internal static class DescriptorUtil |
||||
{ |
||||
internal static string GetFullUmbrellaClassName(IDescriptor descriptor) |
||||
{ |
||||
CSharpFileOptions options = descriptor.File.CSharpOptions; |
||||
string result = options.Namespace; |
||||
if (result != "") |
||||
{ |
||||
result += '.'; |
||||
} |
||||
result += GetQualifiedUmbrellaClassName(options); |
||||
return "global::" + result; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Evaluates the options and returns the qualified name of the umbrella class |
||||
/// relative to the descriptor type's namespace. Basically concatenates the |
||||
/// UmbrellaNamespace + UmbrellaClassname fields. |
||||
/// </summary> |
||||
internal static string GetQualifiedUmbrellaClassName(CSharpFileOptions options) |
||||
{ |
||||
string fullName = options.UmbrellaClassname; |
||||
if (!options.NestClasses && options.UmbrellaNamespace != "") |
||||
{ |
||||
fullName = String.Format("{0}.{1}", options.UmbrellaNamespace, options.UmbrellaClassname); |
||||
} |
||||
return fullName; |
||||
} |
||||
|
||||
internal static string GetMappedTypeName(MappedType type) |
||||
{ |
||||
switch (type) |
||||
{ |
||||
case MappedType.Int32: |
||||
return "int"; |
||||
case MappedType.Int64: |
||||
return "long"; |
||||
case MappedType.UInt32: |
||||
return "uint"; |
||||
case MappedType.UInt64: |
||||
return "ulong"; |
||||
case MappedType.Single: |
||||
return "float"; |
||||
case MappedType.Double: |
||||
return "double"; |
||||
case MappedType.Boolean: |
||||
return "bool"; |
||||
case MappedType.String: |
||||
return "string"; |
||||
case MappedType.ByteString: |
||||
return "pb::ByteString"; |
||||
case MappedType.Enum: |
||||
return null; |
||||
case MappedType.Message: |
||||
return null; |
||||
default: |
||||
throw new ArgumentOutOfRangeException("Unknown mapped type " + type); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,148 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class EnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal EnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("private bool has{0};", PropertyName); |
||||
writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}; }}", PropertyName); |
||||
writer.WriteLine(" set {{ Set{0}(value); }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = false;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.Has{0}) {{", PropertyName); |
||||
writer.WriteLine(" {0} = other.{0};", PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
// Nothing to do here for enum types |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("object unknown;"); |
||||
writer.WriteLine("if(input.ReadEnum(ref result.{0}_, out unknown)) {{", Name); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine("} else if(unknown is int) {"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now |
||||
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)unknown);", Number); |
||||
} |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" output.WriteEnum({0}, field_names[{2}], (int) {1}, {1});", Number, PropertyName, |
||||
FieldOrdinal); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" size += pb::CodedOutputStream.ComputeEnumSize({0}, (int) {1});", Number, PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) hash ^= {1}_.GetHashCode();", PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0} != other.has{0} || (has{0} && !{1}_.Equals(other.{1}_))) return false;", |
||||
PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{0}\", has{1}, {2}_, writer);", Descriptor.Name, PropertyName, Name); |
||||
} |
||||
} |
||||
} |
@ -1,62 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class EnumGenerator : SourceGeneratorBase<EnumDescriptor>, ISourceGenerator |
||||
{ |
||||
internal EnumGenerator(EnumDescriptor descriptor) : base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
// TODO(jonskeet): Write out enum descriptors? Can be retrieved from file... |
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} enum {1} {{", ClassAccessLevel, Descriptor.Name); |
||||
writer.Indent(); |
||||
foreach (EnumValueDescriptor value in Descriptor.Values) |
||||
{ |
||||
writer.WriteLine("{0} = {1},", value.Name, value.Number); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
} |
||||
} |
@ -1,183 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class ExtensionGenerator : FieldGeneratorBase, ISourceGenerator |
||||
{ |
||||
private readonly string extends; |
||||
private readonly string scope; |
||||
private readonly string type; |
||||
private readonly string name; |
||||
|
||||
internal ExtensionGenerator(FieldDescriptor descriptor) |
||||
: base(descriptor, 0) |
||||
{ |
||||
if (Descriptor.ExtensionScope != null) |
||||
{ |
||||
scope = GetClassName(Descriptor.ExtensionScope); |
||||
} |
||||
else |
||||
{ |
||||
scope = DescriptorUtil.GetFullUmbrellaClassName(Descriptor.File); |
||||
} |
||||
switch (Descriptor.MappedType) |
||||
{ |
||||
case MappedType.Message: |
||||
type = GetClassName(Descriptor.MessageType); |
||||
break; |
||||
case MappedType.Enum: |
||||
type = GetClassName(Descriptor.EnumType); |
||||
break; |
||||
default: |
||||
type = DescriptorUtil.GetMappedTypeName(Descriptor.MappedType); |
||||
break; |
||||
} |
||||
extends = GetClassName(Descriptor.ContainingType); |
||||
name = Descriptor.CSharpOptions.PropertyName; |
||||
} |
||||
|
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(Descriptor).StartsWith("_")) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
|
||||
writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(Descriptor), Descriptor.FieldNumber); |
||||
|
||||
if (UseLiteRuntime) |
||||
{ |
||||
if (Descriptor.MappedType == MappedType.Message && Descriptor.MessageType.Options.MessageSetWireFormat) |
||||
{ |
||||
throw new ArgumentException( |
||||
"option message_set_wire_format = true; is not supported in Lite runtime extensions."); |
||||
} |
||||
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("{0} static pb::{4}<{1}, {2}> {3};", ClassAccessLevel, extends, type, name, |
||||
Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite"); |
||||
} |
||||
else if (Descriptor.IsRepeated) |
||||
{ |
||||
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("{0} static pb::GeneratedExtensionBase<scg::IList<{1}>> {2};", ClassAccessLevel, type, |
||||
name); |
||||
} |
||||
else |
||||
{ |
||||
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("{0} static pb::GeneratedExtensionBase<{1}> {2};", ClassAccessLevel, type, name); |
||||
} |
||||
} |
||||
|
||||
internal void GenerateStaticVariableInitializers(TextGenerator writer) |
||||
{ |
||||
if (UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("{0}.{1} = ", scope, name); |
||||
writer.Indent(); |
||||
writer.WriteLine("new pb::{0}<{1}, {2}>(", |
||||
Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite", |
||||
extends, type); |
||||
writer.Indent(); |
||||
writer.WriteLine("\"{0}\",", Descriptor.FullName); |
||||
writer.WriteLine("{0}.DefaultInstance,", extends); |
||||
if (!Descriptor.IsRepeated) |
||||
{ |
||||
writer.WriteLine("{0},", |
||||
Descriptor.HasDefaultValue |
||||
? DefaultValue |
||||
: IsNullableType ? "null" : "default(" + type + ")"); |
||||
} |
||||
writer.WriteLine("{0},", |
||||
(Descriptor.MappedType == MappedType.Message) ? type + ".DefaultInstance" : "null"); |
||||
writer.WriteLine("{0},", |
||||
(Descriptor.MappedType == MappedType.Enum) ? "new EnumLiteMap<" + type + ">()" : "null"); |
||||
writer.WriteLine("{0}.{1}FieldNumber,", scope, name); |
||||
writer.Write("pbd::FieldType.{0}", Descriptor.FieldType); |
||||
if (Descriptor.IsRepeated) |
||||
{ |
||||
writer.WriteLine(","); |
||||
writer.Write(Descriptor.IsPacked ? "true" : "false"); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine(");"); |
||||
writer.Outdent(); |
||||
} |
||||
else if (Descriptor.IsRepeated) |
||||
{ |
||||
writer.WriteLine( |
||||
"{0}.{1} = pb::GeneratedRepeatExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope, |
||||
name, type, Descriptor.Index); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine( |
||||
"{0}.{1} = pb::GeneratedSingleExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope, |
||||
name, type, Descriptor.Index); |
||||
} |
||||
} |
||||
|
||||
internal void GenerateExtensionRegistrationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("registry.Add({0}.{1});", scope, name); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
} |
||||
} |
||||
} |
@ -1,389 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Globalization; |
||||
using System.Text; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal abstract class FieldGeneratorBase : SourceGeneratorBase<FieldDescriptor> |
||||
{ |
||||
private readonly int _fieldOrdinal; |
||||
|
||||
protected FieldGeneratorBase(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor) |
||||
{ |
||||
_fieldOrdinal = fieldOrdinal; |
||||
} |
||||
|
||||
public abstract void WriteHash(TextGenerator writer); |
||||
public abstract void WriteEquals(TextGenerator writer); |
||||
public abstract void WriteToString(TextGenerator writer); |
||||
|
||||
public int FieldOrdinal |
||||
{ |
||||
get { return _fieldOrdinal; } |
||||
} |
||||
|
||||
private static bool AllPrintableAscii(string text) |
||||
{ |
||||
foreach (char c in text) |
||||
{ |
||||
if (c < 0x20 || c > 0x7e) |
||||
{ |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// This returns true if the field has a non-default default value. For instance this returns |
||||
/// false for numerics with a default of zero '0', or booleans with a default of false. |
||||
/// </summary> |
||||
protected bool HasDefaultValue |
||||
{ |
||||
get |
||||
{ |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.Float: |
||||
case FieldType.Double: |
||||
case FieldType.Int32: |
||||
case FieldType.Int64: |
||||
case FieldType.SInt32: |
||||
case FieldType.SInt64: |
||||
case FieldType.SFixed32: |
||||
case FieldType.SFixed64: |
||||
case FieldType.UInt32: |
||||
case FieldType.UInt64: |
||||
case FieldType.Fixed32: |
||||
case FieldType.Fixed64: |
||||
{ |
||||
IConvertible value = (IConvertible) Descriptor.DefaultValue; |
||||
return value.ToString(CultureInfo.InvariantCulture) != "0"; |
||||
} |
||||
case FieldType.Bool: |
||||
return ((bool) Descriptor.DefaultValue) == true; |
||||
default: |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/// <remarks>Copy exists in ExtensionGenerator.cs</remarks> |
||||
protected string DefaultValue |
||||
{ |
||||
get |
||||
{ |
||||
string suffix = ""; |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.Float: |
||||
suffix = "F"; |
||||
break; |
||||
case FieldType.Double: |
||||
suffix = "D"; |
||||
break; |
||||
case FieldType.Int64: |
||||
suffix = "L"; |
||||
break; |
||||
case FieldType.UInt64: |
||||
suffix = "UL"; |
||||
break; |
||||
} |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.Float: |
||||
case FieldType.Double: |
||||
case FieldType.Int32: |
||||
case FieldType.Int64: |
||||
case FieldType.SInt32: |
||||
case FieldType.SInt64: |
||||
case FieldType.SFixed32: |
||||
case FieldType.SFixed64: |
||||
case FieldType.UInt32: |
||||
case FieldType.UInt64: |
||||
case FieldType.Fixed32: |
||||
case FieldType.Fixed64: |
||||
{ |
||||
// The simple Object.ToString converts using the current culture. |
||||
// We want to always use the invariant culture so it's predictable. |
||||
IConvertible value = (IConvertible) Descriptor.DefaultValue; |
||||
//a few things that must be handled explicitly |
||||
if (Descriptor.FieldType == FieldType.Double && value is double) |
||||
{ |
||||
if (double.IsNaN((double) value)) |
||||
{ |
||||
return "double.NaN"; |
||||
} |
||||
if (double.IsPositiveInfinity((double) value)) |
||||
{ |
||||
return "double.PositiveInfinity"; |
||||
} |
||||
if (double.IsNegativeInfinity((double) value)) |
||||
{ |
||||
return "double.NegativeInfinity"; |
||||
} |
||||
} |
||||
else if (Descriptor.FieldType == FieldType.Float && value is float) |
||||
{ |
||||
if (float.IsNaN((float) value)) |
||||
{ |
||||
return "float.NaN"; |
||||
} |
||||
if (float.IsPositiveInfinity((float) value)) |
||||
{ |
||||
return "float.PositiveInfinity"; |
||||
} |
||||
if (float.IsNegativeInfinity((float) value)) |
||||
{ |
||||
return "float.NegativeInfinity"; |
||||
} |
||||
} |
||||
return value.ToString(CultureInfo.InvariantCulture) + suffix; |
||||
} |
||||
case FieldType.Bool: |
||||
return (bool) Descriptor.DefaultValue ? "true" : "false"; |
||||
|
||||
case FieldType.Bytes: |
||||
if (!Descriptor.HasDefaultValue) |
||||
{ |
||||
return "pb::ByteString.Empty"; |
||||
} |
||||
if (UseLiteRuntime && Descriptor.DefaultValue is ByteString) |
||||
{ |
||||
string temp = (((ByteString) Descriptor.DefaultValue).ToBase64()); |
||||
return String.Format("pb::ByteString.FromBase64(\"{0}\")", temp); |
||||
} |
||||
return string.Format("(pb::ByteString) {0}.Descriptor.Fields[{1}].DefaultValue", |
||||
GetClassName(Descriptor.ContainingType), Descriptor.Index); |
||||
case FieldType.String: |
||||
if (AllPrintableAscii(Descriptor.Proto.DefaultValue)) |
||||
{ |
||||
// All chars are ASCII and printable. In this case we only |
||||
// need to escape quotes and backslashes. |
||||
return "\"" + Descriptor.Proto.DefaultValue |
||||
.Replace("\\", "\\\\") |
||||
.Replace("'", "\\'") |
||||
.Replace("\"", "\\\"") |
||||
+ "\""; |
||||
} |
||||
if (UseLiteRuntime && Descriptor.DefaultValue is String) |
||||
{ |
||||
string temp = Convert.ToBase64String( |
||||
Encoding.UTF8.GetBytes((String) Descriptor.DefaultValue)); |
||||
return String.Format("pb::ByteString.FromBase64(\"{0}\").ToStringUtf8()", temp); |
||||
} |
||||
return string.Format("(string) {0}.Descriptor.Fields[{1}].DefaultValue", |
||||
GetClassName(Descriptor.ContainingType), Descriptor.Index); |
||||
case FieldType.Enum: |
||||
return TypeName + "." + ((EnumValueDescriptor) Descriptor.DefaultValue).Name; |
||||
case FieldType.Message: |
||||
case FieldType.Group: |
||||
return TypeName + ".DefaultInstance"; |
||||
default: |
||||
throw new InvalidOperationException("Invalid field descriptor type"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected string PropertyName |
||||
{ |
||||
get { return Descriptor.CSharpOptions.PropertyName; } |
||||
} |
||||
|
||||
protected string Name |
||||
{ |
||||
get { return NameHelpers.UnderscoresToCamelCase(GetFieldName(Descriptor)); } |
||||
} |
||||
|
||||
protected int Number |
||||
{ |
||||
get { return Descriptor.FieldNumber; } |
||||
} |
||||
|
||||
protected void AddNullCheck(TextGenerator writer) |
||||
{ |
||||
AddNullCheck(writer, "value"); |
||||
} |
||||
|
||||
protected void AddNullCheck(TextGenerator writer, string name) |
||||
{ |
||||
if (IsNullableType) |
||||
{ |
||||
writer.WriteLine(" pb::ThrowHelper.ThrowIfNull({0}, \"{0}\");", name); |
||||
} |
||||
} |
||||
|
||||
protected void AddPublicMemberAttributes(TextGenerator writer) |
||||
{ |
||||
AddDeprecatedFlag(writer); |
||||
AddClsComplianceCheck(writer); |
||||
} |
||||
|
||||
protected void AddClsComplianceCheck(TextGenerator writer) |
||||
{ |
||||
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
} |
||||
|
||||
protected bool IsObsolete { get { return Descriptor.Options.Deprecated; } } |
||||
|
||||
/// <summary> |
||||
/// Writes [global::System.ObsoleteAttribute()] if the member is obsolete |
||||
/// </summary> |
||||
protected void AddDeprecatedFlag(TextGenerator writer) |
||||
{ |
||||
if (IsObsolete) |
||||
{ |
||||
writer.WriteLine("[global::System.ObsoleteAttribute()]"); |
||||
} |
||||
} |
||||
|
||||
/// <summary> |
||||
/// For encodings with fixed sizes, returns that size in bytes. Otherwise |
||||
/// returns -1. TODO(jonskeet): Make this less ugly. |
||||
/// </summary> |
||||
protected int FixedSize |
||||
{ |
||||
get |
||||
{ |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.UInt32: |
||||
case FieldType.UInt64: |
||||
case FieldType.Int32: |
||||
case FieldType.Int64: |
||||
case FieldType.SInt32: |
||||
case FieldType.SInt64: |
||||
case FieldType.Enum: |
||||
case FieldType.Bytes: |
||||
case FieldType.String: |
||||
case FieldType.Message: |
||||
case FieldType.Group: |
||||
return -1; |
||||
case FieldType.Float: |
||||
return WireFormat.FloatSize; |
||||
case FieldType.SFixed32: |
||||
return WireFormat.SFixed32Size; |
||||
case FieldType.Fixed32: |
||||
return WireFormat.Fixed32Size; |
||||
case FieldType.Double: |
||||
return WireFormat.DoubleSize; |
||||
case FieldType.SFixed64: |
||||
return WireFormat.SFixed64Size; |
||||
case FieldType.Fixed64: |
||||
return WireFormat.Fixed64Size; |
||||
case FieldType.Bool: |
||||
return WireFormat.BoolSize; |
||||
default: |
||||
throw new InvalidOperationException("Invalid field descriptor type"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected bool IsNullableType |
||||
{ |
||||
get |
||||
{ |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.Float: |
||||
case FieldType.Double: |
||||
case FieldType.Int32: |
||||
case FieldType.Int64: |
||||
case FieldType.SInt32: |
||||
case FieldType.SInt64: |
||||
case FieldType.SFixed32: |
||||
case FieldType.SFixed64: |
||||
case FieldType.UInt32: |
||||
case FieldType.UInt64: |
||||
case FieldType.Fixed32: |
||||
case FieldType.Fixed64: |
||||
case FieldType.Bool: |
||||
case FieldType.Enum: |
||||
return false; |
||||
case FieldType.Bytes: |
||||
case FieldType.String: |
||||
case FieldType.Message: |
||||
case FieldType.Group: |
||||
return true; |
||||
default: |
||||
throw new InvalidOperationException("Invalid field descriptor type"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected string TypeName |
||||
{ |
||||
get |
||||
{ |
||||
switch (Descriptor.FieldType) |
||||
{ |
||||
case FieldType.Enum: |
||||
return GetClassName(Descriptor.EnumType); |
||||
case FieldType.Message: |
||||
case FieldType.Group: |
||||
return GetClassName(Descriptor.MessageType); |
||||
default: |
||||
return DescriptorUtil.GetMappedTypeName(Descriptor.MappedType); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected string MessageOrGroup |
||||
{ |
||||
get { return Descriptor.FieldType == FieldType.Group ? "Group" : "Message"; } |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Returns the type name as used in CodedInputStream method names: SFixed32, UInt32 etc. |
||||
/// </summary> |
||||
protected string CapitalizedTypeName |
||||
{ |
||||
get |
||||
{ |
||||
// Our enum names match perfectly. How serendipitous. |
||||
return Descriptor.FieldType.ToString(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,267 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Text; |
||||
using Google.ProtocolBuffers.Collections; |
||||
using Google.ProtocolBuffers.Compiler.PluginProto; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Code generator for protocol buffers. Only C# is supported at the moment. |
||||
/// </summary> |
||||
public sealed class Generator |
||||
{ |
||||
private readonly GeneratorOptions options; |
||||
|
||||
private Generator(GeneratorOptions options) |
||||
{ |
||||
options.Validate(); |
||||
this.options = options; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Returns a generator configured with the specified options. |
||||
/// </summary> |
||||
public static Generator CreateGenerator(GeneratorOptions options) |
||||
{ |
||||
return new Generator(options); |
||||
} |
||||
|
||||
public void Generate(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response) |
||||
{ |
||||
IList<FileDescriptor> descriptors = ConvertDescriptors(options.FileOptions, request.ProtoFileList); |
||||
|
||||
// Combine with options from command line |
||||
foreach (FileDescriptor descriptor in descriptors) |
||||
{ |
||||
descriptor.ConfigureWithDefaultOptions(options.FileOptions); |
||||
} |
||||
|
||||
bool duplicates = false; |
||||
Dictionary<string, bool> names = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase); |
||||
foreach (FileDescriptor descriptor in descriptors) |
||||
{ |
||||
string file = GetOutputFile(descriptor, false); |
||||
if (names.ContainsKey(file)) |
||||
{ |
||||
duplicates = true; |
||||
break; |
||||
} |
||||
names.Add(file, true); |
||||
} |
||||
|
||||
//ROK - Changed to dictionary from HashSet to allow 2.0 compile |
||||
var filesToGenerate = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
||||
foreach (var item in request.FileToGenerateList) |
||||
{ |
||||
filesToGenerate[item] = null; |
||||
} |
||||
foreach (FileDescriptor descriptor in descriptors) |
||||
{ |
||||
// Optionally exclude descriptors in google.protobuf |
||||
if (descriptor.CSharpOptions.IgnoreGoogleProtobuf && descriptor.Package == "google.protobuf") |
||||
{ |
||||
continue; |
||||
} |
||||
if (filesToGenerate.ContainsKey(descriptor.Name)) |
||||
{ |
||||
Generate(descriptor, duplicates, response); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Generates code for a particular file. All dependencies must |
||||
/// already have been resolved. |
||||
/// </summary> |
||||
private void Generate(FileDescriptor descriptor, bool duplicates, CodeGeneratorResponse.Builder response) |
||||
{ |
||||
var code = new StringBuilder(); |
||||
var ucg = new UmbrellaClassGenerator(descriptor); |
||||
using (StringWriter textWriter = new StringWriter(code)) |
||||
{ |
||||
TextGenerator writer = new TextGenerator(textWriter, options.LineBreak); |
||||
ucg.Generate(writer); |
||||
} |
||||
response.AddFile(new CodeGeneratorResponse.Types.File.Builder |
||||
{ |
||||
Name = GetOutputFile(descriptor, duplicates), |
||||
Content = code.ToString(), |
||||
}.Build()); |
||||
} |
||||
|
||||
private string GetOutputFile(FileDescriptor descriptor, bool duplicates) |
||||
{ |
||||
CSharpFileOptions fileOptions = descriptor.CSharpOptions; |
||||
|
||||
string filename = descriptor.CSharpOptions.UmbrellaClassname + descriptor.CSharpOptions.FileExtension; |
||||
if (duplicates) |
||||
{ |
||||
string namepart; |
||||
if (String.IsNullOrEmpty(descriptor.Name) || String.IsNullOrEmpty(namepart = Path.GetFileNameWithoutExtension(descriptor.Name))) |
||||
throw new ApplicationException("Duplicate UmbrellaClassname options created a file name collision."); |
||||
|
||||
filename = namepart + descriptor.CSharpOptions.FileExtension; |
||||
} |
||||
|
||||
string outputDirectory = descriptor.CSharpOptions.OutputDirectory; |
||||
if (fileOptions.ExpandNamespaceDirectories) |
||||
{ |
||||
string package = fileOptions.Namespace; |
||||
if (!string.IsNullOrEmpty(package)) |
||||
{ |
||||
string[] bits = package.Split('.'); |
||||
foreach (string bit in bits) |
||||
{ |
||||
outputDirectory = Path.Combine(outputDirectory, bit); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// As the directory can be explicitly specified in options, we need to make sure it exists |
||||
Directory.CreateDirectory(outputDirectory); |
||||
return Path.Combine(outputDirectory, filename); |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Resolves any dependencies and converts FileDescriptorProtos into FileDescriptors. |
||||
/// The list returned is in the same order as the protos are listed in the descriptor set. |
||||
/// Note: this method is internal rather than private to allow testing. |
||||
/// </summary> |
||||
/// <exception cref="DependencyResolutionException">Not all dependencies could be resolved.</exception> |
||||
public static IList<FileDescriptor> ConvertDescriptors(CSharpFileOptions options, |
||||
IList<FileDescriptorProto> fileList) |
||||
{ |
||||
FileDescriptor[] converted = new FileDescriptor[fileList.Count]; |
||||
|
||||
Dictionary<string, FileDescriptor> convertedMap = new Dictionary<string, FileDescriptor>(); |
||||
|
||||
int totalConverted = 0; |
||||
|
||||
bool madeProgress = true; |
||||
while (madeProgress && totalConverted < converted.Length) |
||||
{ |
||||
madeProgress = false; |
||||
for (int i = 0; i < converted.Length; i++) |
||||
{ |
||||
if (converted[i] != null) |
||||
{ |
||||
// Already done this one |
||||
continue; |
||||
} |
||||
FileDescriptorProto candidate = fileList[i]; |
||||
FileDescriptor[] dependencies = new FileDescriptor[candidate.DependencyList.Count]; |
||||
|
||||
|
||||
CSharpFileOptions.Builder builder = options.ToBuilder(); |
||||
if (candidate.Options.HasExtension(CSharpOptions.CSharpFileOptions)) |
||||
{ |
||||
builder.MergeFrom( |
||||
candidate.Options.GetExtension(CSharpOptions.CSharpFileOptions)); |
||||
} |
||||
CSharpFileOptions localOptions = builder.Build(); |
||||
|
||||
bool foundAllDependencies = true; |
||||
for (int j = 0; j < dependencies.Length; j++) |
||||
{ |
||||
if (!convertedMap.TryGetValue(candidate.DependencyList[j], out dependencies[j])) |
||||
{ |
||||
// We can auto-magically resolve these since we already have their description |
||||
// This way if the file is only referencing options it does not need to be built with the |
||||
// --include_imports definition. |
||||
if (localOptions.IgnoreGoogleProtobuf && |
||||
(candidate.DependencyList[j] == "google/protobuf/csharp_options.proto")) |
||||
{ |
||||
dependencies[j] = CSharpOptions.Descriptor; |
||||
continue; |
||||
} |
||||
if (localOptions.IgnoreGoogleProtobuf && |
||||
(candidate.DependencyList[j] == "google/protobuf/descriptor.proto")) |
||||
{ |
||||
dependencies[j] = DescriptorProtoFile.Descriptor; |
||||
continue; |
||||
} |
||||
foundAllDependencies = false; |
||||
break; |
||||
} |
||||
} |
||||
if (!foundAllDependencies) |
||||
{ |
||||
continue; |
||||
} |
||||
madeProgress = true; |
||||
totalConverted++; |
||||
converted[i] = FileDescriptor.BuildFrom(candidate, dependencies); |
||||
convertedMap[candidate.Name] = converted[i]; |
||||
} |
||||
} |
||||
if (!madeProgress) |
||||
{ |
||||
StringBuilder remaining = new StringBuilder(); |
||||
for (int i = 0; i < converted.Length; i++) |
||||
{ |
||||
if (converted[i] == null) |
||||
{ |
||||
if (remaining.Length != 0) |
||||
{ |
||||
remaining.Append(", "); |
||||
} |
||||
FileDescriptorProto failure = fileList[i]; |
||||
remaining.Append(failure.Name); |
||||
remaining.Append(":"); |
||||
foreach (string dependency in failure.DependencyList) |
||||
{ |
||||
if (!convertedMap.ContainsKey(dependency)) |
||||
{ |
||||
remaining.Append(" "); |
||||
remaining.Append(dependency); |
||||
} |
||||
} |
||||
remaining.Append(";"); |
||||
} |
||||
} |
||||
throw new DependencyResolutionException("Unable to resolve all dependencies: " + remaining); |
||||
} |
||||
return Lists.AsReadOnly(converted); |
||||
} |
||||
} |
||||
} |
@ -1,330 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Text.RegularExpressions; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// All the configuration required for the generator - where to generate |
||||
/// output files, the location of input files etc. While this isn't immutable |
||||
/// in practice, the contents shouldn't be changed after being passed to |
||||
/// the generator. |
||||
/// </summary> |
||||
public sealed class GeneratorOptions |
||||
{ |
||||
private static Dictionary<string, string> LineBreaks = |
||||
new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) |
||||
{ |
||||
{"Windows", "\r\n"}, |
||||
{"Unix", "\n"}, |
||||
{"Default", Environment.NewLine} |
||||
}; |
||||
|
||||
public IList<string> InputFiles { get; set; } |
||||
|
||||
public GeneratorOptions() |
||||
{ |
||||
LineBreak = Environment.NewLine; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Attempts to validate the options, but doesn't throw an exception if they're invalid. |
||||
/// Instead, when this method returns false, the output variable will contain a collection |
||||
/// of reasons for the validation failure. |
||||
/// </summary> |
||||
/// <param name="reasons">Variable to receive a list of reasons in case of validation failure.</param> |
||||
/// <returns>true if the options are valid; false otherwise</returns> |
||||
public bool TryValidate(out IList<string> reasons) |
||||
{ |
||||
List<string> tmpReasons = new List<string>(); |
||||
|
||||
ParseArguments(tmpReasons); |
||||
|
||||
// Output directory validation |
||||
if (string.IsNullOrEmpty(FileOptions.OutputDirectory)) |
||||
{ |
||||
tmpReasons.Add("No output directory specified"); |
||||
} |
||||
else |
||||
{ |
||||
if (!Directory.Exists(FileOptions.OutputDirectory)) |
||||
{ |
||||
tmpReasons.Add("Specified output directory (" + FileOptions.OutputDirectory + " doesn't exist."); |
||||
} |
||||
} |
||||
|
||||
// Input file validation (just in terms of presence) |
||||
if (InputFiles == null || InputFiles.Count == 0) |
||||
{ |
||||
tmpReasons.Add("No input files specified"); |
||||
} |
||||
else |
||||
{ |
||||
foreach (string input in InputFiles) |
||||
{ |
||||
FileInfo fi = new FileInfo(input); |
||||
if (!fi.Exists) |
||||
{ |
||||
tmpReasons.Add("Input file " + input + " doesn't exist."); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (tmpReasons.Count != 0) |
||||
{ |
||||
reasons = tmpReasons; |
||||
return false; |
||||
} |
||||
|
||||
reasons = null; |
||||
return true; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Validates that all the options have been set and are valid, |
||||
/// throwing an exception if they haven't. |
||||
/// </summary> |
||||
/// <exception cref="InvalidOptionsException">The options are invalid.</exception> |
||||
public void Validate() |
||||
{ |
||||
IList<string> reasons; |
||||
if (!TryValidate(out reasons)) |
||||
{ |
||||
throw new InvalidOptionsException(reasons); |
||||
} |
||||
} |
||||
|
||||
// Raw arguments, used to provide defaults for proto file options |
||||
public IList<string> Arguments { get; set; } |
||||
|
||||
[Obsolete("Please use GeneratorOptions.FileOptions.OutputDirectory instead")] |
||||
public string OutputDirectory |
||||
{ |
||||
get { return FileOptions.OutputDirectory; } |
||||
set |
||||
{ |
||||
CSharpFileOptions.Builder bld = FileOptions.ToBuilder(); |
||||
bld.OutputDirectory = value; |
||||
FileOptions = bld.Build(); |
||||
} |
||||
} |
||||
|
||||
private static readonly Regex ArgMatch = new Regex(@"^[-/](?<name>[\w_]+?)[:=](?<value>.*)$"); |
||||
private CSharpFileOptions fileOptions; |
||||
|
||||
public CSharpFileOptions FileOptions |
||||
{ |
||||
get { return fileOptions ?? (fileOptions = CSharpFileOptions.DefaultInstance); } |
||||
set { fileOptions = value; } |
||||
} |
||||
|
||||
public string LineBreak { get; set; } |
||||
|
||||
private void ParseArguments(IList<string> tmpReasons) |
||||
{ |
||||
bool doHelp = Arguments.Count == 0; |
||||
|
||||
InputFiles = new List<string>(); |
||||
CSharpFileOptions.Builder builder = FileOptions.ToBuilder(); |
||||
Dictionary<string, FieldDescriptor> fields = |
||||
new Dictionary<string, FieldDescriptor>(StringComparer.OrdinalIgnoreCase); |
||||
foreach (FieldDescriptor fld in builder.DescriptorForType.Fields) |
||||
{ |
||||
fields.Add(fld.Name, fld); |
||||
} |
||||
|
||||
foreach (string argument in Arguments) |
||||
{ |
||||
if (StringComparer.OrdinalIgnoreCase.Equals("-help", argument) || |
||||
StringComparer.OrdinalIgnoreCase.Equals("/help", argument) || |
||||
StringComparer.OrdinalIgnoreCase.Equals("-?", argument) || |
||||
StringComparer.OrdinalIgnoreCase.Equals("/?", argument)) |
||||
{ |
||||
doHelp = true; |
||||
break; |
||||
} |
||||
|
||||
Match m = ArgMatch.Match(argument); |
||||
if (m.Success) |
||||
{ |
||||
FieldDescriptor fld; |
||||
string name = m.Groups["name"].Value; |
||||
string value = m.Groups["value"].Value; |
||||
|
||||
if (fields.TryGetValue(name, out fld)) |
||||
{ |
||||
object obj; |
||||
if (TryCoerceType(value, fld, out obj, tmpReasons)) |
||||
{ |
||||
builder[fld] = obj; |
||||
} |
||||
} |
||||
else if (name == "line_break") |
||||
{ |
||||
string tmp; |
||||
if (LineBreaks.TryGetValue(value, out tmp)) |
||||
{ |
||||
LineBreak = tmp; |
||||
} |
||||
else |
||||
{ |
||||
tmpReasons.Add("Invalid value for 'line_break': " + value + "."); |
||||
} |
||||
} |
||||
else if (!File.Exists(argument)) |
||||
{ |
||||
doHelp = true; |
||||
tmpReasons.Add("Unknown argument '" + name + "'."); |
||||
} |
||||
else |
||||
{ |
||||
InputFiles.Add(argument); |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
InputFiles.Add(argument); |
||||
} |
||||
} |
||||
|
||||
if (doHelp || InputFiles.Count == 0) |
||||
{ |
||||
tmpReasons.Add("Arguments:"); |
||||
foreach (KeyValuePair<string, FieldDescriptor> field in fields) |
||||
{ |
||||
tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType)); |
||||
} |
||||
tmpReasons.Add("-line_break=[" + string.Join("|", new List<string>(LineBreaks.Keys).ToArray()) + "]"); |
||||
tmpReasons.Add("followed by one or more file paths."); |
||||
} |
||||
else |
||||
{ |
||||
FileOptions = builder.Build(); |
||||
} |
||||
} |
||||
|
||||
private static bool TryCoerceType(string text, FieldDescriptor field, out object value, IList<string> tmpReasons) |
||||
{ |
||||
value = null; |
||||
|
||||
switch (field.FieldType) |
||||
{ |
||||
case FieldType.Int32: |
||||
case FieldType.SInt32: |
||||
case FieldType.SFixed32: |
||||
value = Int32.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.Int64: |
||||
case FieldType.SInt64: |
||||
case FieldType.SFixed64: |
||||
value = Int64.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.UInt32: |
||||
case FieldType.Fixed32: |
||||
value = UInt32.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.UInt64: |
||||
case FieldType.Fixed64: |
||||
value = UInt64.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.Float: |
||||
value = float.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.Double: |
||||
value = Double.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.Bool: |
||||
value = Boolean.Parse(text); |
||||
break; |
||||
|
||||
case FieldType.String: |
||||
value = text; |
||||
break; |
||||
|
||||
case FieldType.Enum: |
||||
{ |
||||
EnumDescriptor enumType = field.EnumType; |
||||
|
||||
int number; |
||||
if (int.TryParse(text, out number)) |
||||
{ |
||||
value = enumType.FindValueByNumber(number); |
||||
if (value == null) |
||||
{ |
||||
tmpReasons.Add( |
||||
"Enum type \"" + enumType.FullName + |
||||
"\" has no value with number " + number + "."); |
||||
return false; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
value = enumType.FindValueByName(text); |
||||
if (value == null) |
||||
{ |
||||
tmpReasons.Add( |
||||
"Enum type \"" + enumType.FullName + |
||||
"\" has no value named \"" + text + "\"."); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
break; |
||||
} |
||||
|
||||
case FieldType.Bytes: |
||||
case FieldType.Message: |
||||
case FieldType.Group: |
||||
tmpReasons.Add("Unhandled field type " + field.FieldType.ToString() + "."); |
||||
return false; |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
} |
||||
} |
@ -1,45 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Helpers to resolve class names etc. |
||||
/// </summary> |
||||
internal static class Helpers |
||||
{ |
||||
} |
||||
} |
@ -1,53 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal interface IFieldSourceGenerator |
||||
{ |
||||
void GenerateMembers(TextGenerator writer); |
||||
void GenerateBuilderMembers(TextGenerator writer); |
||||
void GenerateMergingCode(TextGenerator writer); |
||||
void GenerateBuildingCode(TextGenerator writer); |
||||
void GenerateParsingCode(TextGenerator writer); |
||||
void GenerateSerializationCode(TextGenerator writer); |
||||
void GenerateSerializedSizeCode(TextGenerator writer); |
||||
|
||||
void WriteHash(TextGenerator writer); |
||||
void WriteEquals(TextGenerator writer); |
||||
void WriteToString(TextGenerator writer); |
||||
} |
||||
} |
@ -1,43 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal interface ISourceGenerator |
||||
{ |
||||
void Generate(TextGenerator writer); |
||||
} |
||||
} |
@ -1,77 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
using Google.ProtocolBuffers.Collections; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Exception thrown to indicate that the options passed were invalid. |
||||
/// </summary> |
||||
public sealed class InvalidOptionsException : Exception |
||||
{ |
||||
private readonly IList<string> reasons; |
||||
|
||||
/// <summary> |
||||
/// An immutable list of reasons why the options were invalid. |
||||
/// </summary> |
||||
public IList<string> Reasons |
||||
{ |
||||
get { return reasons; } |
||||
} |
||||
|
||||
public InvalidOptionsException(IList<string> reasons) |
||||
: base(BuildMessage(reasons)) |
||||
{ |
||||
this.reasons = Lists.AsReadOnly(reasons); |
||||
} |
||||
|
||||
private static string BuildMessage(IEnumerable<string> reasons) |
||||
{ |
||||
StringBuilder builder = new StringBuilder("Invalid options:"); |
||||
builder.AppendLine(); |
||||
foreach (string reason in reasons) |
||||
{ |
||||
builder.Append(" "); |
||||
builder.AppendLine(reason); |
||||
} |
||||
return builder.ToString(); |
||||
} |
||||
} |
||||
} |
@ -1,174 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class MessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal MessageFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("private bool has{0};", PropertyName); |
||||
writer.WriteLine("private {0} {1}_;", TypeName, Name); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_ ?? {1}; }}", Name, DefaultValue); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}; }}", PropertyName); |
||||
writer.WriteLine(" set {{ Set{0}(value); }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Set{0}({1}.Builder builderForValue) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer, "builderForValue"); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = builderForValue.Build();", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Merge{0}({1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" if (result.has{0} &&", PropertyName); |
||||
writer.WriteLine(" result.{0}_ != {1}) {{", Name, DefaultValue); |
||||
writer.WriteLine(" result.{0}_ = {1}.CreateBuilder(result.{0}_).MergeFrom(value).BuildPartial();", Name, |
||||
TypeName); |
||||
writer.WriteLine(" } else {"); |
||||
writer.WriteLine(" result.{0}_ = value;", Name); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = false;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = null;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.Has{0}) {{", PropertyName); |
||||
writer.WriteLine(" Merge{0}(other.{0});", PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
// Nothing to do for singular fields |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{0}.Builder subBuilder = {0}.CreateBuilder();", TypeName); |
||||
writer.WriteLine("if (result.has{0}) {{", PropertyName); |
||||
writer.WriteLine(" subBuilder.MergeFrom({0});", PropertyName); |
||||
writer.WriteLine("}"); |
||||
if (Descriptor.FieldType == FieldType.Group) |
||||
{ |
||||
writer.WriteLine("input.ReadGroup({0}, subBuilder, extensionRegistry);", Number); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("input.ReadMessage(subBuilder, extensionRegistry);"); |
||||
} |
||||
writer.WriteLine("{0} = subBuilder.BuildPartial();", PropertyName); |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" output.Write{0}({1}, field_names[{3}], {2});", MessageOrGroup, Number, PropertyName, |
||||
FieldOrdinal); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, {2});", |
||||
MessageOrGroup, Number, PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) hash ^= {1}_.GetHashCode();", PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0} != other.has{0} || (has{0} && !{1}_.Equals(other.{1}_))) return false;", |
||||
PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{2}\", has{0}, {1}_, writer);", PropertyName, Name, |
||||
Descriptor.FieldType == FieldType.Group ? Descriptor.MessageType.Name : Descriptor.Name); |
||||
} |
||||
} |
||||
} |
@ -1,893 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class MessageGenerator : SourceGeneratorBase<MessageDescriptor>, ISourceGenerator |
||||
{ |
||||
private string[] _fieldNames; |
||||
|
||||
internal MessageGenerator(MessageDescriptor descriptor) : base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
private string ClassName |
||||
{ |
||||
get { return Descriptor.Name; } |
||||
} |
||||
|
||||
private string FullClassName |
||||
{ |
||||
get { return GetClassName(Descriptor); } |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Get an identifier that uniquely identifies this type within the file. |
||||
/// This is used to declare static variables related to this type at the |
||||
/// outermost file scope. |
||||
/// </summary> |
||||
private static string GetUniqueFileScopeIdentifier(IDescriptor descriptor) |
||||
{ |
||||
return "static_" + descriptor.FullName.Replace(".", "_"); |
||||
} |
||||
|
||||
internal void GenerateStaticVariables(TextGenerator writer) |
||||
{ |
||||
// Because descriptor.proto (Google.ProtocolBuffers.DescriptorProtos) is |
||||
// used in the construction of descriptors, we have a tricky bootstrapping |
||||
// problem. To help control static initialization order, we make sure all |
||||
// descriptors and other static data that depends on them are members of |
||||
// the proto-descriptor class. This way, they will be initialized in |
||||
// a deterministic order. |
||||
|
||||
string identifier = GetUniqueFileScopeIdentifier(Descriptor); |
||||
|
||||
if (!UseLiteRuntime) |
||||
{ |
||||
// The descriptor for this type. |
||||
string access = Descriptor.File.CSharpOptions.NestClasses ? "private" : "internal"; |
||||
writer.WriteLine("{0} static pbd::MessageDescriptor internal__{1}__Descriptor;", access, identifier); |
||||
writer.WriteLine( |
||||
"{0} static pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder> internal__{2}__FieldAccessorTable;", |
||||
access, FullClassName, identifier); |
||||
} |
||||
// Generate static members for all nested types. |
||||
foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) |
||||
{ |
||||
new MessageGenerator(nestedMessage).GenerateStaticVariables(writer); |
||||
} |
||||
} |
||||
|
||||
internal void GenerateStaticVariableInitializers(TextGenerator writer) |
||||
{ |
||||
string identifier = GetUniqueFileScopeIdentifier(Descriptor); |
||||
|
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.Write("internal__{0}__Descriptor = ", identifier); |
||||
if (Descriptor.ContainingType == null) |
||||
{ |
||||
writer.WriteLine("Descriptor.MessageTypes[{0}];", Descriptor.Index); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("internal__{0}__Descriptor.NestedTypes[{1}];", |
||||
GetUniqueFileScopeIdentifier(Descriptor.ContainingType), Descriptor.Index); |
||||
} |
||||
|
||||
writer.WriteLine("internal__{0}__FieldAccessorTable = ", identifier); |
||||
writer.WriteLine( |
||||
" new pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder>(internal__{0}__Descriptor,", |
||||
identifier, FullClassName); |
||||
writer.Print(" new string[] { "); |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
writer.Write("\"{0}\", ", field.CSharpOptions.PropertyName); |
||||
} |
||||
writer.WriteLine("});"); |
||||
} |
||||
|
||||
// Generate static member initializers for all nested types. |
||||
foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) |
||||
{ |
||||
new MessageGenerator(nestedMessage).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
|
||||
foreach (FieldDescriptor extension in Descriptor.Extensions) |
||||
{ |
||||
new ExtensionGenerator(extension).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
} |
||||
|
||||
public string[] FieldNames |
||||
{ |
||||
get |
||||
{ |
||||
if (_fieldNames == null) |
||||
{ |
||||
List<string> names = new List<string>(); |
||||
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields) |
||||
{ |
||||
names.Add(fieldDescriptor.Name); |
||||
} |
||||
//if you change this, the search must also change in GenerateBuilderParsingMethods |
||||
names.Sort(StringComparer.Ordinal); |
||||
_fieldNames = names.ToArray(); |
||||
} |
||||
return _fieldNames; |
||||
} |
||||
} |
||||
|
||||
internal int FieldOrdinal(FieldDescriptor field) |
||||
{ |
||||
return Array.BinarySearch(FieldNames, field.Name, StringComparer.Ordinal); |
||||
} |
||||
|
||||
private IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor fieldDescriptor) |
||||
{ |
||||
return SourceGenerators.CreateFieldGenerator(fieldDescriptor, FieldOrdinal(fieldDescriptor)); |
||||
} |
||||
|
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.AddSerializable) |
||||
{ |
||||
writer.WriteLine("[global::System.SerializableAttribute()]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} sealed partial class {1} : pb::{2}Message{3}<{1}, {1}.Builder> {{", |
||||
ClassAccessLevel, ClassName, |
||||
Descriptor.Proto.ExtensionRangeCount > 0 ? "Extendable" : "Generated", |
||||
RuntimeSuffix); |
||||
writer.Indent(); |
||||
if (Descriptor.File.CSharpOptions.GeneratePrivateCtor) |
||||
{ |
||||
writer.WriteLine("private {0}() {{ }}", ClassName); |
||||
} |
||||
// Must call MakeReadOnly() to make sure all lists are made read-only |
||||
writer.WriteLine("private static readonly {0} defaultInstance = new {0}().MakeReadOnly();", ClassName); |
||||
|
||||
if (OptimizeSpeed) |
||||
{ |
||||
writer.WriteLine("private static readonly string[] _{0}FieldNames = new string[] {{ {2}{1}{2} }};", |
||||
NameHelpers.UnderscoresToCamelCase(ClassName), String.Join("\", \"", FieldNames), |
||||
FieldNames.Length > 0 ? "\"" : ""); |
||||
List<string> tags = new List<string>(); |
||||
foreach (string name in FieldNames) |
||||
{ |
||||
tags.Add(WireFormat.MakeTag(Descriptor.FindFieldByName(name)).ToString()); |
||||
} |
||||
|
||||
writer.WriteLine("private static readonly uint[] _{0}FieldTags = new uint[] {{ {1} }};", |
||||
NameHelpers.UnderscoresToCamelCase(ClassName), String.Join(", ", tags.ToArray())); |
||||
} |
||||
writer.WriteLine("public static {0} DefaultInstance {{", ClassName); |
||||
writer.WriteLine(" get { return defaultInstance; }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName); |
||||
writer.WriteLine(" get { return DefaultInstance; }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("protected override {0} ThisMessage {{", ClassName); |
||||
writer.WriteLine(" get { return this; }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("public static pbd::MessageDescriptor Descriptor {"); |
||||
writer.WriteLine(" get {{ return {0}.internal__{1}__Descriptor; }}", |
||||
DescriptorUtil.GetFullUmbrellaClassName(Descriptor), |
||||
GetUniqueFileScopeIdentifier(Descriptor)); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine( |
||||
"protected override pb::FieldAccess.FieldAccessorTable<{0}, {0}.Builder> InternalFieldAccessors {{", |
||||
ClassName); |
||||
writer.WriteLine(" get {{ return {0}.internal__{1}__FieldAccessorTable; }}", |
||||
DescriptorUtil.GetFullUmbrellaClassName(Descriptor), |
||||
GetUniqueFileScopeIdentifier(Descriptor)); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
// Extensions don't need to go in an extra nested type |
||||
WriteChildren(writer, null, Descriptor.Extensions); |
||||
|
||||
if (Descriptor.EnumTypes.Count + Descriptor.NestedTypes.Count > 0) |
||||
{ |
||||
writer.WriteLine("#region Nested types"); |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("public static partial class Types {"); |
||||
writer.Indent(); |
||||
WriteChildren(writer, null, Descriptor.EnumTypes); |
||||
WriteChildren(writer, null, Descriptor.NestedTypes); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("#endregion"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields) |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(fieldDescriptor).StartsWith("_")) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
|
||||
// Rats: we lose the debug comment here :( |
||||
writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(fieldDescriptor), |
||||
fieldDescriptor.FieldNumber); |
||||
CreateFieldGenerator(fieldDescriptor).GenerateMembers(writer); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
if (OptimizeSpeed) |
||||
{ |
||||
GenerateIsInitialized(writer); |
||||
GenerateMessageSerializationMethods(writer); |
||||
} |
||||
if (UseLiteRuntime) |
||||
{ |
||||
GenerateLiteRuntimeMethods(writer); |
||||
} |
||||
|
||||
GenerateParseFromMethods(writer); |
||||
GenerateBuilder(writer); |
||||
|
||||
// Force the static initialization code for the file to run, since it may |
||||
// initialize static variables declared in this class. |
||||
writer.WriteLine("static {0}() {{", ClassName); |
||||
// We call object.ReferenceEquals() just to make it a valid statement on its own. |
||||
// Another option would be GetType(), but that causes problems in DescriptorProtoFile, |
||||
// where the bootstrapping is somewhat recursive - type initializers call |
||||
// each other, effectively. We temporarily see Descriptor as null. |
||||
writer.WriteLine(" object.ReferenceEquals({0}.Descriptor, null);", |
||||
DescriptorUtil.GetFullUmbrellaClassName(Descriptor)); |
||||
writer.WriteLine("}"); |
||||
|
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void GenerateLiteRuntimeMethods(TextGenerator writer) |
||||
{ |
||||
bool callbase = Descriptor.Proto.ExtensionRangeCount > 0; |
||||
writer.WriteLine("#region Lite runtime methods"); |
||||
writer.WriteLine("public override int GetHashCode() {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("int hash = GetType().GetHashCode();"); |
||||
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields) |
||||
{ |
||||
CreateFieldGenerator(fieldDescriptor).WriteHash(writer); |
||||
} |
||||
if (callbase) |
||||
{ |
||||
writer.WriteLine("hash ^= base.GetHashCode();"); |
||||
} |
||||
writer.WriteLine("return hash;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public override bool Equals(object obj) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("{0} other = obj as {0};", ClassName); |
||||
writer.WriteLine("if (other == null) return false;"); |
||||
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields) |
||||
{ |
||||
CreateFieldGenerator(fieldDescriptor).WriteEquals(writer); |
||||
} |
||||
if (callbase) |
||||
{ |
||||
writer.WriteLine("if (!base.Equals(other)) return false;"); |
||||
} |
||||
writer.WriteLine("return true;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public override void PrintTo(global::System.IO.TextWriter writer) {"); |
||||
writer.Indent(); |
||||
List<FieldDescriptor> sorted = new List<FieldDescriptor>(Descriptor.Fields); |
||||
sorted.Sort( |
||||
new Comparison<FieldDescriptor>( |
||||
delegate(FieldDescriptor a, FieldDescriptor b) { return a.FieldNumber.CompareTo(b.FieldNumber); })); |
||||
foreach (FieldDescriptor fieldDescriptor in sorted) |
||||
{ |
||||
CreateFieldGenerator(fieldDescriptor).WriteToString(writer); |
||||
} |
||||
if (callbase) |
||||
{ |
||||
writer.WriteLine("base.PrintTo(writer);"); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("#endregion"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void GenerateMessageSerializationMethods(TextGenerator writer) |
||||
{ |
||||
List<FieldDescriptor> sortedFields = new List<FieldDescriptor>(Descriptor.Fields); |
||||
sortedFields.Sort((f1, f2) => f1.FieldNumber.CompareTo(f2.FieldNumber)); |
||||
|
||||
List<DescriptorProto.Types.ExtensionRange> sortedExtensions = |
||||
new List<DescriptorProto.Types.ExtensionRange>(Descriptor.Proto.ExtensionRangeList); |
||||
sortedExtensions.Sort((r1, r2) => (r1.Start.CompareTo(r2.Start))); |
||||
|
||||
writer.WriteLine("public override void WriteTo(pb::ICodedOutputStream output) {"); |
||||
writer.Indent(); |
||||
// Make sure we've computed the serialized length, so that packed fields are generated correctly. |
||||
writer.WriteLine("CalcSerializedSize();"); |
||||
writer.WriteLine("string[] field_names = _{0}FieldNames;", NameHelpers.UnderscoresToCamelCase(ClassName)); |
||||
if (Descriptor.Proto.ExtensionRangeList.Count > 0) |
||||
{ |
||||
writer.WriteLine( |
||||
"pb::ExtendableMessage{1}<{0}, {0}.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);", |
||||
ClassName, RuntimeSuffix); |
||||
} |
||||
|
||||
// Merge the fields and the extension ranges, both sorted by field number. |
||||
for (int i = 0, j = 0; i < Descriptor.Fields.Count || j < sortedExtensions.Count;) |
||||
{ |
||||
if (i == Descriptor.Fields.Count) |
||||
{ |
||||
GenerateSerializeOneExtensionRange(writer, sortedExtensions[j++]); |
||||
} |
||||
else if (j == sortedExtensions.Count) |
||||
{ |
||||
GenerateSerializeOneField(writer, sortedFields[i++]); |
||||
} |
||||
else if (sortedFields[i].FieldNumber < sortedExtensions[j].Start) |
||||
{ |
||||
GenerateSerializeOneField(writer, sortedFields[i++]); |
||||
} |
||||
else |
||||
{ |
||||
GenerateSerializeOneExtensionRange(writer, sortedExtensions[j++]); |
||||
} |
||||
} |
||||
|
||||
if (!UseLiteRuntime) |
||||
{ |
||||
if (Descriptor.Proto.Options.MessageSetWireFormat) |
||||
{ |
||||
writer.WriteLine("UnknownFields.WriteAsMessageSetTo(output);"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("UnknownFields.WriteTo(output);"); |
||||
} |
||||
} |
||||
|
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("private int memoizedSerializedSize = -1;"); |
||||
writer.WriteLine("public override int SerializedSize {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("get {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("int size = memoizedSerializedSize;"); |
||||
writer.WriteLine("if (size != -1) return size;"); |
||||
writer.WriteLine("return CalcSerializedSize();"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("private int CalcSerializedSize() {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("int size = memoizedSerializedSize;"); |
||||
writer.WriteLine("if (size != -1) return size;"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("size = 0;"); |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
CreateFieldGenerator(field).GenerateSerializedSizeCode(writer); |
||||
} |
||||
if (Descriptor.Proto.ExtensionRangeCount > 0) |
||||
{ |
||||
writer.WriteLine("size += ExtensionsSerializedSize;"); |
||||
} |
||||
|
||||
if (!UseLiteRuntime) |
||||
{ |
||||
if (Descriptor.Options.MessageSetWireFormat) |
||||
{ |
||||
writer.WriteLine("size += UnknownFields.SerializedSizeAsMessageSet;"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("size += UnknownFields.SerializedSize;"); |
||||
} |
||||
} |
||||
writer.WriteLine("memoizedSerializedSize = size;"); |
||||
writer.WriteLine("return size;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
private void GenerateSerializeOneField(TextGenerator writer, FieldDescriptor fieldDescriptor) |
||||
{ |
||||
CreateFieldGenerator(fieldDescriptor).GenerateSerializationCode(writer); |
||||
} |
||||
|
||||
private static void GenerateSerializeOneExtensionRange(TextGenerator writer, |
||||
DescriptorProto.Types.ExtensionRange extensionRange) |
||||
{ |
||||
writer.WriteLine("extensionWriter.WriteUntil({0}, output);", extensionRange.End); |
||||
} |
||||
|
||||
private void GenerateParseFromMethods(TextGenerator writer) |
||||
{ |
||||
// Note: These are separate from GenerateMessageSerializationMethods() |
||||
// because they need to be generated even for messages that are optimized |
||||
// for code size. |
||||
|
||||
writer.WriteLine("public static {0} ParseFrom(pb::ByteString data) {{", ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine( |
||||
"public static {0} ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {{", |
||||
ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public static {0} ParseFrom(byte[] data) {{", ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public static {0} ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {{", |
||||
ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public static {0} ParseFrom(global::System.IO.Stream input) {{", ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine( |
||||
"public static {0} ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {{", |
||||
ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public static {0} ParseDelimitedFrom(global::System.IO.Stream input) {{", ClassName); |
||||
writer.WriteLine(" return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine( |
||||
"public static {0} ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {{", |
||||
ClassName); |
||||
writer.WriteLine(" return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public static {0} ParseFrom(pb::ICodedInputStream input) {{", ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine( |
||||
"public static {0} ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {{", |
||||
ClassName); |
||||
writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Returns whether or not the specified message type has any required fields. |
||||
/// If it doesn't, calls to check for initialization can be optimised. |
||||
/// TODO(jonskeet): Move this into MessageDescriptor? |
||||
/// </summary> |
||||
private static bool HasRequiredFields(MessageDescriptor descriptor, |
||||
Dictionary<MessageDescriptor, object> alreadySeen) |
||||
{ |
||||
if (alreadySeen.ContainsKey(descriptor)) |
||||
{ |
||||
// The type is already in cache. This means that either: |
||||
// a. The type has no required fields. |
||||
// b. We are in the midst of checking if the type has required fields, |
||||
// somewhere up the stack. In this case, we know that if the type |
||||
// has any required fields, they'll be found when we return to it, |
||||
// and the whole call to HasRequiredFields() will return true. |
||||
// Therefore, we don't have to check if this type has required fields |
||||
// here. |
||||
return false; |
||||
} |
||||
alreadySeen[descriptor] = descriptor; // Value is irrelevant |
||||
|
||||
// If the type has extensions, an extension with message type could contain |
||||
// required fields, so we have to be conservative and assume such an |
||||
// extension exists. |
||||
if (descriptor.Extensions.Count > 0) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
foreach (FieldDescriptor field in descriptor.Fields) |
||||
{ |
||||
if (field.IsRequired) |
||||
{ |
||||
return true; |
||||
} |
||||
// Message or group |
||||
if (field.MappedType == MappedType.Message) |
||||
{ |
||||
if (HasRequiredFields(field.MessageType, alreadySeen)) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private void GenerateBuilder(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("private {0} MakeReadOnly() {{", ClassName); |
||||
writer.Indent(); |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
CreateFieldGenerator(field).GenerateBuildingCode(writer); |
||||
} |
||||
writer.WriteLine("return this;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public static Builder CreateBuilder() { return new Builder(); }"); |
||||
writer.WriteLine("public override Builder ToBuilder() { return CreateBuilder(this); }"); |
||||
writer.WriteLine("public override Builder CreateBuilderForType() { return new Builder(); }"); |
||||
writer.WriteLine("public static Builder CreateBuilder({0} prototype) {{", ClassName); |
||||
writer.WriteLine(" return new Builder(prototype);"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
if (Descriptor.File.CSharpOptions.AddSerializable) |
||||
{ |
||||
writer.WriteLine("[global::System.SerializableAttribute()]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} sealed partial class Builder : pb::{2}Builder{3}<{1}, Builder> {{", |
||||
ClassAccessLevel, ClassName, |
||||
Descriptor.Proto.ExtensionRangeCount > 0 ? "Extendable" : "Generated", RuntimeSuffix); |
||||
writer.Indent(); |
||||
writer.WriteLine("protected override Builder ThisBuilder {"); |
||||
writer.WriteLine(" get { return this; }"); |
||||
writer.WriteLine("}"); |
||||
GenerateCommonBuilderMethods(writer); |
||||
if (OptimizeSpeed) |
||||
{ |
||||
GenerateBuilderParsingMethods(writer); |
||||
} |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
writer.WriteLine(); |
||||
// No field comment :( |
||||
CreateFieldGenerator(field).GenerateBuilderMembers(writer); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
private void GenerateCommonBuilderMethods(TextGenerator writer) |
||||
{ |
||||
//default constructor |
||||
writer.WriteLine("public Builder() {"); |
||||
//Durring static initialization of message, DefaultInstance is expected to return null. |
||||
writer.WriteLine(" result = DefaultInstance;"); |
||||
writer.WriteLine(" resultIsReadOnly = true;"); |
||||
writer.WriteLine("}"); |
||||
//clone constructor |
||||
writer.WriteLine("internal Builder({0} cloneFrom) {{", ClassName); |
||||
writer.WriteLine(" result = cloneFrom;"); |
||||
writer.WriteLine(" resultIsReadOnly = true;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("private bool resultIsReadOnly;"); |
||||
writer.WriteLine("private {0} result;", ClassName); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("private {0} PrepareBuilder() {{", ClassName); |
||||
writer.WriteLine(" if (resultIsReadOnly) {"); |
||||
writer.WriteLine(" {0} original = result;", ClassName); |
||||
writer.WriteLine(" result = new {0}();", ClassName); |
||||
writer.WriteLine(" resultIsReadOnly = false;"); |
||||
writer.WriteLine(" MergeFrom(original);"); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine(" return result;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public override bool IsInitialized {"); |
||||
writer.WriteLine(" get { return result.IsInitialized; }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("protected override {0} MessageBeingBuilt {{", ClassName); |
||||
writer.WriteLine(" get { return PrepareBuilder(); }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
//Not actually expecting that DefaultInstance would ever be null here; however, we will ensure it does not break |
||||
writer.WriteLine("public override Builder Clear() {"); |
||||
writer.WriteLine(" result = DefaultInstance;", ClassName); |
||||
writer.WriteLine(" resultIsReadOnly = true;"); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public override Builder Clone() {"); |
||||
writer.WriteLine(" if (resultIsReadOnly) {"); |
||||
writer.WriteLine(" return new Builder(result);"); |
||||
writer.WriteLine(" } else {"); |
||||
writer.WriteLine(" return new Builder().MergeFrom(result);"); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("public override pbd::MessageDescriptor DescriptorForType {"); |
||||
writer.WriteLine(" get {{ return {0}.Descriptor; }}", FullClassName); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName); |
||||
writer.WriteLine(" get {{ return {0}.DefaultInstance; }}", FullClassName); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public override {0} BuildPartial() {{", ClassName); |
||||
writer.Indent(); |
||||
writer.WriteLine("if (resultIsReadOnly) {"); |
||||
writer.WriteLine(" return result;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("resultIsReadOnly = true;"); |
||||
writer.WriteLine("return result.MakeReadOnly();"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
if (OptimizeSpeed) |
||||
{ |
||||
writer.WriteLine("public override Builder MergeFrom(pb::IMessage{0} other) {{", RuntimeSuffix); |
||||
writer.WriteLine(" if (other is {0}) {{", ClassName); |
||||
writer.WriteLine(" return MergeFrom(({0}) other);", ClassName); |
||||
writer.WriteLine(" } else {"); |
||||
writer.WriteLine(" base.MergeFrom(other);"); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public override Builder MergeFrom({0} other) {{", ClassName); |
||||
// Optimization: If other is the default instance, we know none of its |
||||
// fields are set so we can skip the merge. |
||||
writer.Indent(); |
||||
writer.WriteLine("if (other == {0}.DefaultInstance) return this;", FullClassName); |
||||
writer.WriteLine("PrepareBuilder();"); |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
CreateFieldGenerator(field).GenerateMergingCode(writer); |
||||
} |
||||
// if message type has extensions |
||||
if (Descriptor.Proto.ExtensionRangeCount > 0) |
||||
{ |
||||
writer.WriteLine(" this.MergeExtensionFields(other);"); |
||||
} |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("this.MergeUnknownFields(other.UnknownFields);"); |
||||
} |
||||
writer.WriteLine("return this;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
} |
||||
|
||||
private void GenerateBuilderParsingMethods(TextGenerator writer) |
||||
{ |
||||
List<FieldDescriptor> sortedFields = new List<FieldDescriptor>(Descriptor.Fields); |
||||
sortedFields.Sort((f1, f2) => f1.FieldNumber.CompareTo(f2.FieldNumber)); |
||||
|
||||
writer.WriteLine("public override Builder MergeFrom(pb::ICodedInputStream input) {"); |
||||
writer.WriteLine(" return MergeFrom(input, pb::ExtensionRegistry.Empty);"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine( |
||||
"public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("PrepareBuilder();"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = null;"); |
||||
} |
||||
writer.WriteLine("uint tag;"); |
||||
writer.WriteLine("string field_name;"); |
||||
writer.WriteLine("while (input.ReadTag(out tag, out field_name)) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("if(tag == 0 && field_name != null) {"); |
||||
writer.Indent(); |
||||
//if you change from StringComparer.Ordinal, the array sort in FieldNames { get; } must also change |
||||
writer.WriteLine( |
||||
"int field_ordinal = global::System.Array.BinarySearch(_{0}FieldNames, field_name, global::System.StringComparer.Ordinal);", |
||||
NameHelpers.UnderscoresToCamelCase(ClassName)); |
||||
writer.WriteLine("if(field_ordinal >= 0)"); |
||||
writer.WriteLine(" tag = _{0}FieldTags[field_ordinal];", NameHelpers.UnderscoresToCamelCase(ClassName)); |
||||
writer.WriteLine("else {"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now |
||||
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); |
||||
writer.WriteLine(" }"); |
||||
} |
||||
writer.WriteLine(" ParseUnknownField(input, {0}extensionRegistry, tag, field_name);", |
||||
UseLiteRuntime ? "" : "unknownFields, "); |
||||
writer.WriteLine(" continue;"); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
|
||||
writer.WriteLine("switch (tag) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("case 0: {"); // 0 signals EOF / limit reached |
||||
writer.WriteLine(" throw pb::InvalidProtocolBufferException.InvalidTag();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("default: {"); |
||||
writer.WriteLine(" if (pb::WireFormat.IsEndGroupTag(tag)) {"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine(" if (unknownFields != null) {"); |
||||
writer.WriteLine(" this.UnknownFields = unknownFields.Build();"); |
||||
writer.WriteLine(" }"); |
||||
} |
||||
writer.WriteLine(" return this;"); // it's an endgroup tag |
||||
writer.WriteLine(" }"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now |
||||
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); |
||||
writer.WriteLine(" }"); |
||||
} |
||||
writer.WriteLine(" ParseUnknownField(input, {0}extensionRegistry, tag, field_name);", |
||||
UseLiteRuntime ? "" : "unknownFields, "); |
||||
writer.WriteLine(" break;"); |
||||
writer.WriteLine("}"); |
||||
foreach (FieldDescriptor field in sortedFields) |
||||
{ |
||||
WireFormat.WireType wt = WireFormat.GetWireType(field.FieldType); |
||||
uint tag = WireFormat.MakeTag(field.FieldNumber, wt); |
||||
|
||||
if (field.IsRepeated && |
||||
(wt == WireFormat.WireType.Varint || wt == WireFormat.WireType.Fixed32 || |
||||
wt == WireFormat.WireType.Fixed64)) |
||||
{ |
||||
writer.WriteLine("case {0}:", |
||||
WireFormat.MakeTag(field.FieldNumber, WireFormat.WireType.LengthDelimited)); |
||||
} |
||||
|
||||
writer.WriteLine("case {0}: {{", tag); |
||||
writer.Indent(); |
||||
CreateFieldGenerator(field).GenerateParsingCode(writer); |
||||
writer.WriteLine("break;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("if (unknownFields != null) {"); |
||||
writer.WriteLine(" this.UnknownFields = unknownFields.Build();"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
writer.WriteLine("return this;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void GenerateIsInitialized(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("public override bool IsInitialized {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("get {"); |
||||
writer.Indent(); |
||||
|
||||
// Check that all required fields in this message are set. |
||||
// TODO(kenton): We can optimize this when we switch to putting all the |
||||
// "has" fields into a single bitfield. |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
if (field.IsRequired) |
||||
{ |
||||
writer.WriteLine("if (!has{0}) return false;", field.CSharpOptions.PropertyName); |
||||
} |
||||
} |
||||
|
||||
// Now check that all embedded messages are initialized. |
||||
foreach (FieldDescriptor field in Descriptor.Fields) |
||||
{ |
||||
if (field.FieldType != FieldType.Message || |
||||
!HasRequiredFields(field.MessageType, new Dictionary<MessageDescriptor, object>())) |
||||
{ |
||||
continue; |
||||
} |
||||
string propertyName = NameHelpers.UnderscoresToPascalCase(GetFieldName(field)); |
||||
if (field.IsRepeated) |
||||
{ |
||||
writer.WriteLine("foreach ({0} element in {1}List) {{", GetClassName(field.MessageType), |
||||
propertyName); |
||||
writer.WriteLine(" if (!element.IsInitialized) return false;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
else if (field.IsOptional) |
||||
{ |
||||
writer.WriteLine("if (Has{0}) {{", propertyName); |
||||
writer.WriteLine(" if (!{0}.IsInitialized) return false;", propertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("if (!{0}.IsInitialized) return false;", propertyName); |
||||
} |
||||
} |
||||
|
||||
if (Descriptor.Proto.ExtensionRangeCount > 0) |
||||
{ |
||||
writer.WriteLine("if (!ExtensionsAreInitialized) return false;"); |
||||
} |
||||
writer.WriteLine("return true;"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
internal void GenerateExtensionRegistrationCode(TextGenerator writer) |
||||
{ |
||||
foreach (FieldDescriptor extension in Descriptor.Extensions) |
||||
{ |
||||
new ExtensionGenerator(extension).GenerateExtensionRegistrationCode(writer); |
||||
} |
||||
foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) |
||||
{ |
||||
new MessageGenerator(nestedMessage).GenerateExtensionRegistrationCode(writer); |
||||
} |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,140 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
// TODO(jonskeet): Refactor this. There's loads of common code here. |
||||
internal class PrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal PrimitiveFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("private bool has{0};", PropertyName); |
||||
writer.WriteLine("private {0} {1}_{2};", TypeName, Name, HasDefaultValue ? " = " + DefaultValue : ""); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.has{0}; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}; }}", PropertyName); |
||||
writer.WriteLine(" set {{ Set{0}(value); }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.has{0} = false;", PropertyName); |
||||
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.Has{0}) {{", PropertyName); |
||||
writer.WriteLine(" {0} = other.{0};", PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
// Nothing to do here for primitive types |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("result.has{0} = input.Read{1}(ref result.{2}_);", PropertyName, CapitalizedTypeName, Name); |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" output.Write{0}({1}, field_names[{3}], {2});", CapitalizedTypeName, Number, PropertyName, |
||||
FieldOrdinal); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||
writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, {2});", |
||||
CapitalizedTypeName, Number, PropertyName); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0}) hash ^= {1}_.GetHashCode();", PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (has{0} != other.has{0} || (has{0} && !{1}_.Equals(other.{1}_))) return false;", |
||||
PropertyName, Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{0}\", has{1}, {2}_, writer);", Descriptor.Name, PropertyName, Name); |
||||
} |
||||
} |
||||
} |
@ -1,105 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.IO; |
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.Compiler.PluginProto; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Entry point for the Protocol Buffers generator. |
||||
/// </summary> |
||||
internal class Program |
||||
{ |
||||
internal static int Main(string[] args) |
||||
{ |
||||
try |
||||
{ |
||||
// Hack to make sure everything's initialized |
||||
DescriptorProtoFile.Descriptor.ToString(); |
||||
GeneratorOptions options = new GeneratorOptions {Arguments = args}; |
||||
|
||||
IList<string> validationFailures; |
||||
if (!options.TryValidate(out validationFailures)) |
||||
{ |
||||
// We've already got the message-building logic in the exception... |
||||
InvalidOptionsException exception = new InvalidOptionsException(validationFailures); |
||||
Console.WriteLine(exception.Message); |
||||
return 1; |
||||
} |
||||
|
||||
var request = new CodeGeneratorRequest.Builder(); |
||||
foreach (string inputFile in options.InputFiles) |
||||
{ |
||||
ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance(); |
||||
CSharpOptions.RegisterAllExtensions(extensionRegistry); |
||||
using (Stream inputStream = File.OpenRead(inputFile)) |
||||
{ |
||||
var fileSet = FileDescriptorSet.ParseFrom(inputStream, extensionRegistry); |
||||
foreach (var fileProto in fileSet.FileList) |
||||
{ |
||||
request.AddFileToGenerate(fileProto.Name); |
||||
request.AddProtoFile(fileProto); |
||||
} |
||||
} |
||||
} |
||||
|
||||
Generator generator = Generator.CreateGenerator(options); |
||||
var response = new CodeGeneratorResponse.Builder(); |
||||
generator.Generate(request.Build(), response); |
||||
if (response.HasError) |
||||
{ |
||||
throw new Exception(response.Error); |
||||
} |
||||
foreach (var file in response.FileList) |
||||
{ |
||||
File.WriteAllText(file.Name, file.Content); |
||||
} |
||||
return 0; |
||||
} |
||||
catch (Exception e) |
||||
{ |
||||
Console.Error.WriteLine("Error: {0}", e.Message); |
||||
Console.Error.WriteLine(); |
||||
Console.Error.WriteLine("Detailed exception information: {0}", e); |
||||
return 1; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,276 +0,0 @@ |
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Text; |
||||
using System.Text.RegularExpressions; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Preprocesses any input files with an extension of '.proto' by running protoc.exe. If arguments |
||||
/// are supplied with '--' prefix they are provided to protoc.exe, otherwise they are assumed to |
||||
/// be used for ProtoGen.exe which is run on the resulting output proto buffer. If the option |
||||
/// --descriptor_set_out= is specified the proto buffer file is kept, otherwise it will be removed |
||||
/// after code generation. |
||||
/// </summary> |
||||
public class ProgramPreprocess |
||||
{ |
||||
private const string ProtocExecutable = "protoc.exe"; |
||||
private const string ProtocDirectoryArg = "--protoc_dir="; |
||||
|
||||
private static int Main(string[] args) |
||||
{ |
||||
try |
||||
{ |
||||
return Environment.ExitCode = Run(args); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
Console.Error.WriteLine(ex); |
||||
return Environment.ExitCode = 2; |
||||
} |
||||
} |
||||
|
||||
public static int Run(params string[] args) |
||||
{ |
||||
bool deleteFile = false; |
||||
string tempFile = null; |
||||
int result; |
||||
bool doHelp = args.Length == 0; |
||||
try |
||||
{ |
||||
List<string> protocArgs = new List<string>(); |
||||
List<string> protoGenArgs = new List<string>(); |
||||
|
||||
string protocFile = GuessProtocFile(args); |
||||
|
||||
foreach (string arg in args) |
||||
{ |
||||
doHelp |= StringComparer.OrdinalIgnoreCase.Equals(arg, "/?"); |
||||
doHelp |= StringComparer.OrdinalIgnoreCase.Equals(arg, "/help"); |
||||
doHelp |= StringComparer.OrdinalIgnoreCase.Equals(arg, "-?"); |
||||
doHelp |= StringComparer.OrdinalIgnoreCase.Equals(arg, "-help"); |
||||
|
||||
if (arg.StartsWith("--descriptor_set_out=")) |
||||
{ |
||||
tempFile = arg.Substring("--descriptor_set_out=".Length); |
||||
protoGenArgs.Add(tempFile); |
||||
} |
||||
} |
||||
|
||||
if (doHelp) |
||||
{ |
||||
Console.WriteLine(); |
||||
Console.WriteLine("PROTOC.exe: Use any of the following options that begin with '--':"); |
||||
Console.WriteLine(); |
||||
try |
||||
{ |
||||
RunProtoc(protocFile, "--help"); |
||||
} |
||||
catch (Exception ex) |
||||
{ |
||||
Console.Error.WriteLine(ex.Message); |
||||
} |
||||
Console.WriteLine(); |
||||
Console.WriteLine(); |
||||
Console.WriteLine( |
||||
"PROTOGEN.exe: The following options are used to specify defaults for code generation."); |
||||
Console.WriteLine(); |
||||
Program.Main(new string[0]); |
||||
Console.WriteLine(); |
||||
Console.WriteLine("The following option enables PROTOGEN.exe to find PROTOC.exe"); |
||||
Console.WriteLine("{0}<directory containing protoc.exe>", ProtocDirectoryArg); |
||||
return 0; |
||||
} |
||||
|
||||
string pathRoot = Environment.CurrentDirectory; |
||||
foreach(string arg in args) |
||||
{ |
||||
if (arg.StartsWith("--proto_path=", StringComparison.InvariantCultureIgnoreCase)) |
||||
{ |
||||
pathRoot = arg.Substring(13); |
||||
} |
||||
} |
||||
|
||||
foreach (string arg in args) |
||||
{ |
||||
if (arg.StartsWith(ProtocDirectoryArg)) |
||||
{ |
||||
// Handled earlier |
||||
continue; |
||||
} |
||||
if (arg.StartsWith("--")) |
||||
{ |
||||
protocArgs.Add(arg); |
||||
} |
||||
else if ((File.Exists(arg) || File.Exists(Path.Combine(pathRoot, arg))) && |
||||
StringComparer.OrdinalIgnoreCase.Equals(".proto", Path.GetExtension(arg))) |
||||
{ |
||||
if (tempFile == null) |
||||
{ |
||||
deleteFile = true; |
||||
tempFile = Path.GetTempFileName(); |
||||
protocArgs.Add(String.Format("--descriptor_set_out={0}", tempFile)); |
||||
protoGenArgs.Add(tempFile); |
||||
} |
||||
string patharg = arg; |
||||
if (!File.Exists(patharg)) |
||||
{ |
||||
patharg = Path.Combine(pathRoot, arg); |
||||
} |
||||
|
||||
protocArgs.Add(patharg); |
||||
} |
||||
else |
||||
{ |
||||
protoGenArgs.Add(arg); |
||||
} |
||||
} |
||||
|
||||
if (tempFile != null) |
||||
{ |
||||
result = RunProtoc(protocFile, protocArgs.ToArray()); |
||||
if (result != 0) |
||||
{ |
||||
return result; |
||||
} |
||||
} |
||||
|
||||
result = Program.Main(protoGenArgs.ToArray()); |
||||
} |
||||
finally |
||||
{ |
||||
if (deleteFile && tempFile != null && File.Exists(tempFile)) |
||||
{ |
||||
File.Delete(tempFile); |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Tries to work out where protoc is based on command line arguments, the current |
||||
/// directory, the directory containing protogen, and the path. |
||||
/// </summary> |
||||
/// <returns>The path to protoc.exe, or null if it can't be found.</returns> |
||||
private static string GuessProtocFile(params string[] args) |
||||
{ |
||||
// Why oh why is this not in System.IO.Path or Environment...? |
||||
List<string> searchPath = new List<string>(); |
||||
foreach (string arg in args) |
||||
{ |
||||
if (arg.StartsWith("--protoc_dir=")) |
||||
{ |
||||
searchPath.Add(arg.Substring(ProtocDirectoryArg.Length)); |
||||
} |
||||
} |
||||
searchPath.Add(Environment.CurrentDirectory); |
||||
searchPath.Add(AppDomain.CurrentDomain.BaseDirectory); |
||||
searchPath.AddRange((Environment.GetEnvironmentVariable("PATH") ?? String.Empty).Split(Path.PathSeparator)); |
||||
|
||||
foreach (string path in searchPath) |
||||
{ |
||||
string exeFile = Path.Combine(path, ProtocExecutable); |
||||
if (File.Exists(exeFile)) |
||||
{ |
||||
return exeFile; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private static int RunProtoc(string exeFile, params string[] args) |
||||
{ |
||||
if (exeFile == null) |
||||
{ |
||||
throw new FileNotFoundException( |
||||
"Unable to locate " + ProtocExecutable + |
||||
" make sure it is in the PATH, cwd, or exe dir, or use --protoc_dir=..."); |
||||
} |
||||
|
||||
ProcessStartInfo psi = new ProcessStartInfo(exeFile); |
||||
psi.Arguments = EscapeArguments(args); |
||||
psi.RedirectStandardError = true; |
||||
psi.RedirectStandardInput = false; |
||||
psi.RedirectStandardOutput = true; |
||||
psi.ErrorDialog = false; |
||||
psi.CreateNoWindow = true; |
||||
psi.UseShellExecute = false; |
||||
psi.WorkingDirectory = Environment.CurrentDirectory; |
||||
|
||||
Process process = Process.Start(psi); |
||||
if (process == null) |
||||
{ |
||||
return 1; |
||||
} |
||||
|
||||
process.WaitForExit(); |
||||
|
||||
string tmp = process.StandardOutput.ReadToEnd(); |
||||
if (tmp.Trim().Length > 0) |
||||
{ |
||||
Console.Out.WriteLine(tmp); |
||||
} |
||||
tmp = process.StandardError.ReadToEnd(); |
||||
if (tmp.Trim().Length > 0) |
||||
{ |
||||
// Replace protoc output with something more amenable to Visual Studio. |
||||
var regexMsvs = new Regex(@"(.*)\((\d+)\).* column=(\d+)\s*:\s*(.*)"); |
||||
tmp = regexMsvs.Replace(tmp, "$1($2,$3): error CS9999: $4"); |
||||
var regexGcc = new Regex(@"(.*):(\d+):(\d+):\s*(.*)"); |
||||
tmp = regexGcc.Replace(tmp, "$1($2,$3): error CS9999: $4"); |
||||
Console.Error.WriteLine(tmp); |
||||
} |
||||
return process.ExitCode; |
||||
} |
||||
|
||||
/// <summary> |
||||
/// Quotes all arguments that contain whitespace, or begin with a quote and returns a single |
||||
/// argument string for use with Process.Start(). |
||||
/// </summary> |
||||
/// <remarks>http://csharptest.net/?p=529</remarks> |
||||
/// <param name="args">A list of strings for arguments, may not contain null, '\0', '\r', or '\n'</param> |
||||
/// <returns>The combined list of escaped/quoted strings</returns> |
||||
/// <exception cref="System.ArgumentNullException">Raised when one of the arguments is null</exception> |
||||
/// <exception cref="System.ArgumentOutOfRangeException">Raised if an argument contains '\0', '\r', or '\n'</exception> |
||||
public static string EscapeArguments(params string[] args) |
||||
{ |
||||
StringBuilder arguments = new StringBuilder(); |
||||
Regex invalidChar = new Regex("[\x00\x0a\x0d]");// these can not be escaped |
||||
Regex needsQuotes = new Regex(@"\s|""");// contains whitespace or two quote characters |
||||
Regex escapeQuote = new Regex(@"(\\*)(""|$)");// one or more '\' followed with a quote or end of string |
||||
for (int carg = 0; args != null && carg < args.Length; carg++) |
||||
{ |
||||
if (args[carg] == null) |
||||
{ |
||||
throw new ArgumentNullException("args[" + carg + "]"); |
||||
} |
||||
if (invalidChar.IsMatch(args[carg])) |
||||
{ |
||||
throw new ArgumentOutOfRangeException("args[" + carg + "]"); |
||||
} |
||||
if (args[carg] == String.Empty) |
||||
{ |
||||
arguments.Append("\"\""); |
||||
} |
||||
else if (!needsQuotes.IsMatch(args[carg])) { arguments.Append(args[carg]); } |
||||
else |
||||
{ |
||||
arguments.Append('"'); |
||||
arguments.Append(escapeQuote.Replace(args[carg], |
||||
m => |
||||
m.Groups[1].Value + m.Groups[1].Value + |
||||
(m.Groups[2].Value == "\"" ? "\\\"" : "") |
||||
)); |
||||
arguments.Append('"'); |
||||
} |
||||
if (carg + 1 < args.Length) |
||||
{ |
||||
arguments.Append(' '); |
||||
} |
||||
} |
||||
return arguments.ToString(); |
||||
} |
||||
} |
||||
} |
@ -1,29 +0,0 @@ |
||||
using System.Reflection; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
// General Information about an assembly is controlled through the following |
||||
// set of attributes. Change these attribute values to modify the information |
||||
// associated with an assembly. |
||||
|
||||
[assembly: AssemblyTitle("ProtoGen")] |
||||
[assembly: AssemblyDescription("")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("")] |
||||
[assembly: AssemblyProduct("ProtoGen")] |
||||
[assembly: AssemblyCopyright("Copyright © 2008")] |
||||
[assembly: AssemblyTrademark("")] |
||||
[assembly: AssemblyCulture("")] |
||||
|
||||
// Version information for an assembly consists of the following four values: |
||||
// |
||||
// Major Version |
||||
// Minor Version |
||||
// Build Number |
||||
// Revision |
||||
// |
||||
// You can specify all the values or you can default the Build and Revision Numbers |
||||
// by using the '*' as shown below: |
||||
// [assembly: AssemblyVersion("2.4.1.555")] |
||||
|
||||
[assembly: AssemblyVersion("2.4.1.555")] |
||||
[assembly: AssemblyFileVersion("2.4.1.555")] |
@ -1,76 +0,0 @@ |
||||
using Google.ProtocolBuffers.Compiler.PluginProto; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
// Usage example: |
||||
// protoc.exe |
||||
// --plugin=path\to\protoc-gen-cs.exe |
||||
// --cs_out="-generated_code_attributes=true umbrella_namespace=TutorialProto :." |
||||
// --proto_path=.\protos\ |
||||
// protos\tutorial\addressbook.proto |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
public static class ProtocGenCs |
||||
{ |
||||
internal static void Run(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response) |
||||
{ |
||||
var arguments = new List<string>(); |
||||
foreach (var arg in request.Parameter.Split(' ')) |
||||
{ |
||||
var timmedArg = (arg ?? "").Trim(); |
||||
if (!string.IsNullOrEmpty(timmedArg)) |
||||
{ |
||||
arguments.Add(timmedArg); |
||||
} |
||||
} |
||||
// Adding fake input file to make TryValidate happy. |
||||
arguments.Add(System.Reflection.Assembly.GetExecutingAssembly().Location); |
||||
|
||||
GeneratorOptions options = new GeneratorOptions |
||||
{ |
||||
Arguments = arguments |
||||
}; |
||||
IList<string> validationFailures; |
||||
if (!options.TryValidate(out validationFailures)) |
||||
{ |
||||
response.Error += new InvalidOptionsException(validationFailures).Message; |
||||
return; |
||||
} |
||||
|
||||
Generator generator = Generator.CreateGenerator(options); |
||||
generator.Generate(request, response); |
||||
} |
||||
|
||||
public static int Main(string[] args) |
||||
{ |
||||
// Hack to make sure everything's initialized |
||||
DescriptorProtoFile.Descriptor.ToString(); |
||||
ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance(); |
||||
CSharpOptions.RegisterAllExtensions(extensionRegistry); |
||||
|
||||
CodeGeneratorRequest request; |
||||
var response = new CodeGeneratorResponse.Builder(); |
||||
try |
||||
{ |
||||
using (var input = Console.OpenStandardInput()) |
||||
{ |
||||
request = CodeGeneratorRequest.ParseFrom(input, extensionRegistry); |
||||
} |
||||
Run(request, response); |
||||
} |
||||
catch (Exception e) |
||||
{ |
||||
response.Error += e.ToString(); |
||||
} |
||||
|
||||
using (var output = Console.OpenStandardOutput()) |
||||
{ |
||||
response.Build().WriteTo(output); |
||||
output.Flush(); |
||||
} |
||||
return 0; |
||||
} |
||||
} |
||||
} |
@ -1,212 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class RepeatedEnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal RepeatedEnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
if (Descriptor.IsPacked && OptimizeSpeed) |
||||
{ |
||||
writer.WriteLine("private int {0}MemoizedSerializedSize;", Name); |
||||
} |
||||
writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return pbc::Lists.AsReadOnly({0}_); }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
// TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_.Count; }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return {0}_[index];", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
// Note: We can return the original list here, because we make it unmodifiable when we build |
||||
// We return it via IPopsicleList so that collection initializers work more pleasantly. |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return result.Get{0}(index);", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_[index] = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(values);", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Clear();", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.{0}_.Count != 0) {{", Name); |
||||
writer.WriteLine(" result.{0}_.Add(other.{0}_);", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{0}_.MakeReadOnly();", Name); |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("scg::ICollection<object> unknownItems;"); |
||||
writer.WriteLine("input.ReadEnumArray<{0}>(tag, field_name, result.{1}_, out unknownItems);", TypeName, Name); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
writer.WriteLine("if (unknownItems != null) {"); |
||||
writer.WriteLine(" if (unknownFields == null) {"); |
||||
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); |
||||
writer.WriteLine(" }"); |
||||
writer.WriteLine(" foreach (object rawValue in unknownItems)"); |
||||
writer.WriteLine(" if (rawValue is int)"); |
||||
writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)rawValue);", Number); |
||||
writer.WriteLine("}"); |
||||
} |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if ({0}_.Count > 0) {{", Name); |
||||
writer.Indent(); |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine( |
||||
"output.WritePackedEnumArray({0}, field_names[{2}], {1}MemoizedSerializedSize, {1}_);", Number, Name, |
||||
FieldOrdinal, Descriptor.FieldType); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("output.WriteEnumArray({0}, field_names[{2}], {1}_);", Number, Name, FieldOrdinal, |
||||
Descriptor.FieldType); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{"); |
||||
writer.Indent(); |
||||
writer.WriteLine("int dataSize = 0;"); |
||||
writer.WriteLine("if ({0}_.Count > 0) {{", Name); |
||||
writer.Indent(); |
||||
writer.WriteLine("foreach ({0} element in {1}_) {{", TypeName, Name); |
||||
writer.WriteLine(" dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("size += dataSize;"); |
||||
int tagSize = CodedOutputStream.ComputeTagSize(Descriptor.FieldNumber); |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine("size += {0};", tagSize); |
||||
writer.WriteLine("size += pb::CodedOutputStream.ComputeRawVarint32Size((uint) dataSize);"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("size += {0} * {1}_.Count;", tagSize, Name); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
// cache the data size for packed fields. |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine("{0}MemoizedSerializedSize = dataSize;", Name); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("foreach({0} i in {1}_)", TypeName, Name); |
||||
writer.WriteLine(" hash ^= i.GetHashCode();"); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if({0}_.Count != other.{0}_.Count) return false;", Name); |
||||
writer.WriteLine("for(int ix=0; ix < {0}_.Count; ix++)", Name); |
||||
writer.WriteLine(" if(!{0}_[ix].Equals(other.{0}_[ix])) return false;", Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{0}\", {1}_, writer);", Descriptor.Name, Name); |
||||
} |
||||
} |
||||
} |
@ -1,184 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class RepeatedMessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal RepeatedMessageFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
// TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_.Count; }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return {0}_[index];", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
// Note: We can return the original list here, because we make it unmodifiable when we build |
||||
// We return it via IPopsicleList so that collection initializers work more pleasantly. |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return result.Get{0}(index);", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_[index] = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
// Extra overload for builder (just on messages) |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Set{0}(int index, {1}.Builder builderForValue) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer, "builderForValue"); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_[index] = builderForValue.Build();", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
// Extra overload for builder (just on messages) |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Add{0}({1}.Builder builderForValue) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer, "builderForValue"); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(builderForValue.Build());", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(values);", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Clear();", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.{0}_.Count != 0) {{", Name); |
||||
writer.WriteLine(" result.{0}_.Add(other.{0}_);", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{0}_.MakeReadOnly();", Name); |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine( |
||||
"input.Read{0}Array(tag, field_name, result.{1}_, {2}.DefaultInstance, extensionRegistry);", |
||||
MessageOrGroup, Name, TypeName); |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if ({0}_.Count > 0) {{", Name); |
||||
writer.Indent(); |
||||
writer.WriteLine("output.Write{0}Array({1}, field_names[{3}], {2}_);", MessageOrGroup, Number, Name, |
||||
FieldOrdinal, Descriptor.FieldType); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, element);", MessageOrGroup, Number); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("foreach({0} i in {1}_)", TypeName, Name); |
||||
writer.WriteLine(" hash ^= i.GetHashCode();"); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if({0}_.Count != other.{0}_.Count) return false;", Name); |
||||
writer.WriteLine("for(int ix=0; ix < {0}_.Count; ix++)", Name); |
||||
writer.WriteLine(" if(!{0}_[ix].Equals(other.{0}_[ix])) return false;", Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{0}\", {1}_, writer);", |
||||
Descriptor.FieldType == FieldType.Group ? Descriptor.MessageType.Name : Descriptor.Name, |
||||
Name); |
||||
} |
||||
} |
||||
} |
@ -1,207 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class RepeatedPrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||
{ |
||||
internal RepeatedPrimitiveFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||
: base(descriptor, fieldOrdinal) |
||||
{ |
||||
} |
||||
|
||||
public void GenerateMembers(TextGenerator writer) |
||||
{ |
||||
if (Descriptor.IsPacked && OptimizeSpeed) |
||||
{ |
||||
writer.WriteLine("private int {0}MemoizedSerializedSize;", Name); |
||||
} |
||||
writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return pbc::Lists.AsReadOnly({0}_); }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
// TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option. |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return {0}_.Count; }}", Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return {0}_[index];", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuilderMembers(TextGenerator writer) |
||||
{ |
||||
// Note: We can return the original list here, because we make it unmodifiable when we build |
||||
// We return it via IPopsicleList so that collection initializers work more pleasantly. |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public pbc::IPopsicleList<{0}> {1}List {{", TypeName, PropertyName); |
||||
writer.WriteLine(" get {{ return PrepareBuilder().{0}_; }}", Name); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public int {0}Count {{", PropertyName); |
||||
writer.WriteLine(" get {{ return result.{0}Count; }}", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" return result.Get{0}(index);", PropertyName); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_[index] = value;", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public Builder Add{0}({1} value) {{", PropertyName, TypeName); |
||||
AddNullCheck(writer); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddPublicMemberAttributes(writer); |
||||
writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", PropertyName, TypeName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Add(values);", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
AddDeprecatedFlag(writer); |
||||
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||
writer.WriteLine(" PrepareBuilder();"); |
||||
writer.WriteLine(" result.{0}_.Clear();", Name); |
||||
writer.WriteLine(" return this;"); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateMergingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if (other.{0}_.Count != 0) {{", Name); |
||||
writer.WriteLine(" result.{0}_.Add(other.{0}_);", Name); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateBuildingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{0}_.MakeReadOnly();", Name); |
||||
} |
||||
|
||||
public void GenerateParsingCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("input.Read{0}Array(tag, field_name, result.{1}_);", CapitalizedTypeName, Name, |
||||
Descriptor.FieldType); |
||||
} |
||||
|
||||
public void GenerateSerializationCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if ({0}_.Count > 0) {{", Name); |
||||
writer.Indent(); |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine("output.WritePacked{0}Array({1}, field_names[{3}], {2}MemoizedSerializedSize, {2}_);", |
||||
CapitalizedTypeName, Number, Name, FieldOrdinal, Descriptor.FieldType); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("output.Write{0}Array({1}, field_names[{3}], {2}_);", CapitalizedTypeName, Number, Name, |
||||
FieldOrdinal, Descriptor.FieldType); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("{"); |
||||
writer.Indent(); |
||||
writer.WriteLine("int dataSize = 0;"); |
||||
if (FixedSize == -1) |
||||
{ |
||||
writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, PropertyName); |
||||
writer.WriteLine(" dataSize += pb::CodedOutputStream.Compute{0}SizeNoTag(element);", |
||||
CapitalizedTypeName, Number); |
||||
writer.WriteLine("}"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("dataSize = {0} * {1}_.Count;", FixedSize, Name); |
||||
} |
||||
writer.WriteLine("size += dataSize;"); |
||||
int tagSize = CodedOutputStream.ComputeTagSize(Descriptor.FieldNumber); |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine("if ({0}_.Count != 0) {{", Name); |
||||
writer.WriteLine(" size += {0} + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);", tagSize); |
||||
writer.WriteLine("}"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("size += {0} * {1}_.Count;", tagSize, Name); |
||||
} |
||||
// cache the data size for packed fields. |
||||
if (Descriptor.IsPacked) |
||||
{ |
||||
writer.WriteLine("{0}MemoizedSerializedSize = dataSize;", Name); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
public override void WriteHash(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("foreach({0} i in {1}_)", TypeName, Name); |
||||
writer.WriteLine(" hash ^= i.GetHashCode();"); |
||||
} |
||||
|
||||
public override void WriteEquals(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("if({0}_.Count != other.{0}_.Count) return false;", Name); |
||||
writer.WriteLine("for(int ix=0; ix < {0}_.Count; ix++)", Name); |
||||
writer.WriteLine(" if(!{0}_[ix].Equals(other.{0}_[ix])) return false;", Name); |
||||
} |
||||
|
||||
public override void WriteToString(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("PrintField(\"{0}\", {1}_, writer);", Descriptor.Name, Name); |
||||
} |
||||
} |
||||
} |
@ -1,190 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class GenericServiceGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator |
||||
{ |
||||
private enum RequestOrResponse |
||||
{ |
||||
Request, |
||||
Response |
||||
} |
||||
|
||||
internal GenericServiceGenerator(ServiceDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} abstract class {1} : pb::IService {{", ClassAccessLevel, Descriptor.Name); |
||||
writer.Indent(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine("{0} abstract void {1}(", ClassAccessLevel, |
||||
NameHelpers.UnderscoresToPascalCase(method.Name)); |
||||
writer.WriteLine(" pb::IRpcController controller,"); |
||||
writer.WriteLine(" {0} request,", GetClassName(method.InputType)); |
||||
writer.WriteLine(" global::System.Action<{0}> done);", GetClassName(method.OutputType)); |
||||
} |
||||
|
||||
// Generate Descriptor and DescriptorForType. |
||||
writer.WriteLine(); |
||||
writer.WriteLine("{0} static pbd::ServiceDescriptor Descriptor {{", ClassAccessLevel); |
||||
writer.WriteLine(" get {{ return {0}.Descriptor.Services[{1}]; }}", |
||||
DescriptorUtil.GetQualifiedUmbrellaClassName(Descriptor.File.CSharpOptions), |
||||
Descriptor.Index); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public pbd::ServiceDescriptor DescriptorForType {"); |
||||
writer.WriteLine(" get { return Descriptor; }"); |
||||
writer.WriteLine("}"); |
||||
|
||||
GenerateCallMethod(writer); |
||||
GenerateGetPrototype(RequestOrResponse.Request, writer); |
||||
GenerateGetPrototype(RequestOrResponse.Response, writer); |
||||
GenerateStub(writer); |
||||
|
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
|
||||
private void GenerateCallMethod(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public void CallMethod("); |
||||
writer.WriteLine(" pbd::MethodDescriptor method,"); |
||||
writer.WriteLine(" pb::IRpcController controller,"); |
||||
writer.WriteLine(" pb::IMessage request,"); |
||||
writer.WriteLine(" global::System.Action<pb::IMessage> done) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("if (method.Service != Descriptor) {"); |
||||
writer.WriteLine(" throw new global::System.ArgumentException("); |
||||
writer.WriteLine(" \"Service.CallMethod() given method descriptor for wrong service type.\");"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("switch(method.Index) {"); |
||||
writer.Indent(); |
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine("case {0}:", method.Index); |
||||
writer.WriteLine(" this.{0}(controller, ({1}) request,", |
||||
NameHelpers.UnderscoresToPascalCase(method.Name), GetClassName(method.InputType)); |
||||
writer.WriteLine(" pb::RpcUtil.SpecializeCallback<{0}>(", GetClassName(method.OutputType)); |
||||
writer.WriteLine(" done));"); |
||||
writer.WriteLine(" return;"); |
||||
} |
||||
writer.WriteLine("default:"); |
||||
writer.WriteLine(" throw new global::System.InvalidOperationException(\"Can't get here.\");"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void GenerateGetPrototype(RequestOrResponse which, TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("public pb::IMessage Get{0}Prototype(pbd::MethodDescriptor method) {{", which); |
||||
writer.Indent(); |
||||
writer.WriteLine("if (method.Service != Descriptor) {"); |
||||
writer.WriteLine(" throw new global::System.ArgumentException("); |
||||
writer.WriteLine(" \"Service.Get{0}Prototype() given method descriptor for wrong service type.\");", |
||||
which); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("switch(method.Index) {"); |
||||
writer.Indent(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine("case {0}:", method.Index); |
||||
writer.WriteLine(" return {0}.DefaultInstance;", |
||||
GetClassName(which == RequestOrResponse.Request ? method.InputType : method.OutputType)); |
||||
} |
||||
writer.WriteLine("default:"); |
||||
writer.WriteLine(" throw new global::System.InvalidOperationException(\"Can't get here.\");"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void GenerateStub(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("public static Stub CreateStub(pb::IRpcChannel channel) {"); |
||||
writer.WriteLine(" return new Stub(channel);"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} class Stub : {1} {{", ClassAccessLevel, GetClassName(Descriptor)); |
||||
writer.Indent(); |
||||
writer.WriteLine("internal Stub(pb::IRpcChannel channel) {"); |
||||
writer.WriteLine(" this.channel = channel;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("private readonly pb::IRpcChannel channel;"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("public pb::IRpcChannel Channel {"); |
||||
writer.WriteLine(" get { return channel; }"); |
||||
writer.WriteLine("}"); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine(); |
||||
writer.WriteLine("{0} override void {1}(", ClassAccessLevel, |
||||
NameHelpers.UnderscoresToPascalCase(method.Name)); |
||||
writer.WriteLine(" pb::IRpcController controller,"); |
||||
writer.WriteLine(" {0} request,", GetClassName(method.InputType)); |
||||
writer.WriteLine(" global::System.Action<{0}> done) {{", GetClassName(method.OutputType)); |
||||
writer.Indent(); |
||||
writer.WriteLine("channel.CallMethod(Descriptor.Methods[{0}],", method.Index); |
||||
writer.WriteLine(" controller, request, {0}.DefaultInstance,", GetClassName(method.OutputType)); |
||||
writer.WriteLine(" pb::RpcUtil.GeneralizeCallback<{0}, {0}.Builder>(done, {0}.DefaultInstance));", |
||||
GetClassName(method.OutputType)); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
} |
||||
} |
@ -1,300 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal class ServiceGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator |
||||
{ |
||||
private readonly CSharpServiceType svcType; |
||||
private ISourceGenerator _generator; |
||||
|
||||
internal ServiceGenerator(ServiceDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
svcType = descriptor.File.CSharpOptions.ServiceGeneratorType; |
||||
switch (svcType) |
||||
{ |
||||
case CSharpServiceType.NONE: |
||||
_generator = new NoServicesGenerator(descriptor); |
||||
break; |
||||
case CSharpServiceType.GENERIC: |
||||
_generator = new GenericServiceGenerator(descriptor); |
||||
break; |
||||
case CSharpServiceType.INTERFACE: |
||||
_generator = new ServiceInterfaceGenerator(descriptor); |
||||
break; |
||||
case CSharpServiceType.IRPCDISPATCH: |
||||
_generator = new RpcServiceGenerator(descriptor); |
||||
break; |
||||
default: |
||||
throw new ApplicationException("Unknown ServiceGeneratorType = " + svcType.ToString()); |
||||
} |
||||
} |
||||
|
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
_generator.Generate(writer); |
||||
} |
||||
|
||||
private class NoServicesGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator |
||||
{ |
||||
public NoServicesGenerator(ServiceDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
public virtual void Generate(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("/*"); |
||||
writer.WriteLine("* Service generation is now disabled by default, use the following option to enable:"); |
||||
writer.WriteLine("* option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;"); |
||||
writer.WriteLine("*/"); |
||||
} |
||||
} |
||||
|
||||
private class ServiceInterfaceGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator |
||||
{ |
||||
public ServiceInterfaceGenerator(ServiceDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
public virtual void Generate(TextGenerator writer) |
||||
{ |
||||
CSharpServiceOptions options = Descriptor.Options.GetExtension(CSharpOptions.CsharpServiceOptions); |
||||
if (options != null && options.HasInterfaceId) |
||||
{ |
||||
writer.WriteLine("[global::System.Runtime.InteropServices.GuidAttribute(\"{0}\")]", |
||||
new Guid(options.InterfaceId)); |
||||
} |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} partial interface I{1} {{", ClassAccessLevel, Descriptor.Name); |
||||
writer.Indent(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
CSharpMethodOptions mth = method.Options.GetExtension(CSharpOptions.CsharpMethodOptions); |
||||
if (mth.HasDispatchId) |
||||
{ |
||||
writer.WriteLine("[global::System.Runtime.InteropServices.DispId({0})]", mth.DispatchId); |
||||
} |
||||
writer.WriteLine("{0} {1}({2} {3});", GetClassName(method.OutputType), |
||||
NameHelpers.UnderscoresToPascalCase(method.Name), GetClassName(method.InputType), |
||||
NameHelpers.UnderscoresToCamelCase(method.InputType.Name)); |
||||
} |
||||
|
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
} |
||||
|
||||
private class RpcServiceGenerator : ServiceInterfaceGenerator |
||||
{ |
||||
public RpcServiceGenerator(ServiceDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
public override void Generate(TextGenerator writer) |
||||
{ |
||||
base.Generate(writer); |
||||
|
||||
writer.WriteLine(); |
||||
|
||||
// CLIENT Proxy |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} partial class {1} : I{1}, pb::IRpcDispatch, global::System.IDisposable {{", |
||||
ClassAccessLevel, Descriptor.Name); |
||||
writer.Indent(); |
||||
writer.WriteLine("private readonly bool dispose;"); |
||||
writer.WriteLine("private readonly pb::IRpcDispatch dispatch;"); |
||||
|
||||
writer.WriteLine("public {0}(pb::IRpcDispatch dispatch) : this(dispatch, true) {{", Descriptor.Name); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public {0}(pb::IRpcDispatch dispatch, bool dispose) {{", Descriptor.Name); |
||||
writer.WriteLine(" pb::ThrowHelper.ThrowIfNull(this.dispatch = dispatch, \"dispatch\");"); |
||||
writer.WriteLine(" this.dispose = dispose && dispatch is global::System.IDisposable;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public void Dispose() {"); |
||||
writer.WriteLine(" if (dispose) ((global::System.IDisposable)dispatch).Dispose();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine( |
||||
"TMessage pb::IRpcDispatch.CallMethod<TMessage, TBuilder>(string method, pb::IMessageLite request, pb::IBuilderLite<TMessage, TBuilder> response) {"); |
||||
writer.WriteLine(" return dispatch.CallMethod(method, request, response);"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine("public {0} {1}({2} {3}) {{", GetClassName(method.OutputType), |
||||
NameHelpers.UnderscoresToPascalCase(method.Name), |
||||
GetClassName(method.InputType), |
||||
NameHelpers.UnderscoresToCamelCase(method.InputType.Name)); |
||||
writer.WriteLine(" return dispatch.CallMethod(\"{0}\", {1}, {2}.CreateBuilder());", |
||||
method.Name, |
||||
NameHelpers.UnderscoresToCamelCase(method.InputType.Name), |
||||
GetClassName(method.OutputType) |
||||
); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
} |
||||
} |
||||
// SERVER - DISPATCH |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("public partial class Dispatch : pb::IRpcDispatch, global::System.IDisposable {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("private readonly bool dispose;"); |
||||
writer.WriteLine("private readonly I{0} implementation;", Descriptor.Name); |
||||
|
||||
writer.WriteLine("public Dispatch(I{0} implementation) : this(implementation, true) {{", |
||||
Descriptor.Name); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public Dispatch(I{0} implementation, bool dispose) {{", Descriptor.Name); |
||||
writer.WriteLine(" pb::ThrowHelper.ThrowIfNull(this.implementation = implementation, \"implementation\");"); |
||||
writer.WriteLine(" this.dispose = dispose && implementation is global::System.IDisposable;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public void Dispose() {"); |
||||
writer.WriteLine(" if (dispose) ((global::System.IDisposable)implementation).Dispose();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine( |
||||
"public TMessage CallMethod<TMessage, TBuilder>(string methodName, pb::IMessageLite request, pb::IBuilderLite<TMessage, TBuilder> response)"); |
||||
writer.WriteLine(" where TMessage : pb::IMessageLite<TMessage, TBuilder>"); |
||||
writer.WriteLine(" where TBuilder : pb::IBuilderLite<TMessage, TBuilder> {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("switch(methodName) {"); |
||||
writer.Indent(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine( |
||||
"case \"{0}\": return response.MergeFrom(implementation.{1}(({2})request)).Build();", |
||||
method.Name, NameHelpers.UnderscoresToPascalCase(method.Name), |
||||
GetClassName(method.InputType)); |
||||
} |
||||
writer.WriteLine("default: throw pb::ThrowHelper.CreateMissingMethod(typeof(I{0}), methodName);", Descriptor.Name); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end switch |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end invoke |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end server |
||||
} |
||||
// SERVER - STUB |
||||
{ |
||||
if (Descriptor.File.CSharpOptions.ClsCompliance) |
||||
{ |
||||
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine( |
||||
"public partial class ServerStub : pb::IRpcServerStub, global::System.IDisposable {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("private readonly bool dispose;"); |
||||
writer.WriteLine("private readonly pb::IRpcDispatch implementation;", Descriptor.Name); |
||||
|
||||
writer.WriteLine("public ServerStub(I{0} implementation) : this(implementation, true) {{", |
||||
Descriptor.Name); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine( |
||||
"public ServerStub(I{0} implementation, bool dispose) : this(new Dispatch(implementation, dispose), dispose) {{", |
||||
Descriptor.Name); |
||||
writer.WriteLine("}"); |
||||
|
||||
writer.WriteLine("public ServerStub(pb::IRpcDispatch implementation) : this(implementation, true) {"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("public ServerStub(pb::IRpcDispatch implementation, bool dispose) {"); |
||||
writer.WriteLine(" pb::ThrowHelper.ThrowIfNull(this.implementation = implementation, \"implementation\");"); |
||||
writer.WriteLine(" this.dispose = dispose && implementation is global::System.IDisposable;"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine("public void Dispose() {"); |
||||
writer.WriteLine(" if (dispose) ((global::System.IDisposable)implementation).Dispose();"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine(); |
||||
|
||||
writer.WriteLine( |
||||
"public pb::IMessageLite CallMethod(string methodName, pb::ICodedInputStream input, pb::ExtensionRegistry registry) {{", |
||||
Descriptor.Name); |
||||
writer.Indent(); |
||||
writer.WriteLine("switch(methodName) {"); |
||||
writer.Indent(); |
||||
|
||||
foreach (MethodDescriptor method in Descriptor.Methods) |
||||
{ |
||||
writer.WriteLine( |
||||
"case \"{0}\": return implementation.CallMethod(methodName, {1}.ParseFrom(input, registry), {2}.CreateBuilder());", |
||||
method.Name, GetClassName(method.InputType), GetClassName(method.OutputType)); |
||||
} |
||||
writer.WriteLine("default: throw pb::ThrowHelper.CreateMissingMethod(typeof(I{0}), methodName);", Descriptor.Name); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end switch |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end invoke |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); //end server |
||||
} |
||||
|
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,167 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.DescriptorProtos; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
internal abstract class SourceGeneratorBase<T> where T : IDescriptor |
||||
{ |
||||
private readonly T descriptor; |
||||
|
||||
protected readonly bool OptimizeSpeed; |
||||
protected readonly bool OptimizeSize; |
||||
protected readonly bool UseLiteRuntime; |
||||
protected readonly string RuntimeSuffix; |
||||
|
||||
protected SourceGeneratorBase(T descriptor) |
||||
{ |
||||
this.descriptor = descriptor; |
||||
|
||||
OptimizeSize = descriptor.File.Options.OptimizeFor == |
||||
FileOptions.Types.OptimizeMode.CODE_SIZE; |
||||
OptimizeSpeed = descriptor.File.Options.OptimizeFor == |
||||
FileOptions.Types.OptimizeMode.SPEED; |
||||
UseLiteRuntime = descriptor.File.Options.OptimizeFor == |
||||
FileOptions.Types.OptimizeMode.LITE_RUNTIME; |
||||
//Lite runtime uses OptimizeSpeed code branches |
||||
OptimizeSpeed |= UseLiteRuntime; |
||||
RuntimeSuffix = UseLiteRuntime ? "Lite" : ""; |
||||
} |
||||
|
||||
protected T Descriptor |
||||
{ |
||||
get { return descriptor; } |
||||
} |
||||
|
||||
internal static string GetClassName(IDescriptor descriptor) |
||||
{ |
||||
return ToCSharpName(descriptor.FullName, descriptor.File); |
||||
} |
||||
|
||||
// Groups are hacky: The name of the field is just the lower-cased name |
||||
// of the group type. In C#, though, we would like to retain the original |
||||
// capitalization of the type name. |
||||
internal static string GetFieldName(FieldDescriptor descriptor) |
||||
{ |
||||
if (descriptor.FieldType == FieldType.Group) |
||||
{ |
||||
return descriptor.MessageType.Name; |
||||
} |
||||
else |
||||
{ |
||||
return descriptor.Name; |
||||
} |
||||
} |
||||
|
||||
internal static string GetFieldConstantName(FieldDescriptor field) |
||||
{ |
||||
return field.CSharpOptions.PropertyName + "FieldNumber"; |
||||
} |
||||
|
||||
private static string ToCSharpName(string name, FileDescriptor file) |
||||
{ |
||||
string result = file.CSharpOptions.Namespace; |
||||
if (file.CSharpOptions.NestClasses) |
||||
{ |
||||
if (result != "") |
||||
{ |
||||
result += "."; |
||||
} |
||||
result += file.CSharpOptions.UmbrellaClassname; |
||||
} |
||||
if (result != "") |
||||
{ |
||||
result += '.'; |
||||
} |
||||
string classname; |
||||
if (file.Package == "") |
||||
{ |
||||
classname = name; |
||||
} |
||||
else |
||||
{ |
||||
// Strip the proto package from full_name since we've replaced it with |
||||
// the C# namespace. |
||||
classname = name.Substring(file.Package.Length + 1); |
||||
} |
||||
result += classname.Replace(".", ".Types."); |
||||
return "global::" + result; |
||||
} |
||||
|
||||
protected string ClassAccessLevel |
||||
{ |
||||
get { return descriptor.File.CSharpOptions.PublicClasses ? "public" : "internal"; } |
||||
} |
||||
|
||||
protected void WriteGeneratedCodeAttributes(TextGenerator writer) |
||||
{ |
||||
if (descriptor.File.CSharpOptions.GeneratedCodeAttributes) |
||||
{ |
||||
writer.WriteLine("[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]"); |
||||
writer.WriteLine("[global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"{0}\", \"{1}\")]", |
||||
GetType().Assembly.GetName().Name, GetType().Assembly.GetName().Version); |
||||
} |
||||
} |
||||
|
||||
protected void WriteChildren<TChild>(TextGenerator writer, string region, IEnumerable<TChild> children) |
||||
where TChild : IDescriptor |
||||
{ |
||||
// Copy the set of children; makes access easier |
||||
List<TChild> copy = new List<TChild>(children); |
||||
if (copy.Count == 0) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
if (region != null) |
||||
{ |
||||
writer.WriteLine("#region {0}", region); |
||||
} |
||||
foreach (TChild child in children) |
||||
{ |
||||
SourceGenerators.CreateGenerator(child).Generate(writer); |
||||
} |
||||
if (region != null) |
||||
{ |
||||
writer.WriteLine("#endregion"); |
||||
writer.WriteLine(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,87 +0,0 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
public delegate TResult Func<T, TResult>(T arg); |
||||
|
||||
internal static class SourceGenerators |
||||
{ |
||||
private static readonly Dictionary<Type, Func<IDescriptor, ISourceGenerator>> GeneratorFactories = |
||||
new Dictionary<Type, Func<IDescriptor, ISourceGenerator>> |
||||
{ |
||||
{typeof(FileDescriptor), descriptor => new UmbrellaClassGenerator((FileDescriptor) descriptor)}, |
||||
{typeof(EnumDescriptor), descriptor => new EnumGenerator((EnumDescriptor) descriptor)}, |
||||
{typeof(ServiceDescriptor), descriptor => new ServiceGenerator((ServiceDescriptor) descriptor)}, |
||||
{typeof(MessageDescriptor), descriptor => new MessageGenerator((MessageDescriptor) descriptor)}, |
||||
// For other fields, we have IFieldSourceGenerators. |
||||
{typeof(FieldDescriptor), descriptor => new ExtensionGenerator((FieldDescriptor) descriptor)} |
||||
}; |
||||
|
||||
public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field, int fieldOrdinal) |
||||
{ |
||||
switch (field.MappedType) |
||||
{ |
||||
case MappedType.Message: |
||||
return field.IsRepeated |
||||
? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field, fieldOrdinal) |
||||
: new MessageFieldGenerator(field, fieldOrdinal); |
||||
case MappedType.Enum: |
||||
return field.IsRepeated |
||||
? (IFieldSourceGenerator) new RepeatedEnumFieldGenerator(field, fieldOrdinal) |
||||
: new EnumFieldGenerator(field, fieldOrdinal); |
||||
default: |
||||
return field.IsRepeated |
||||
? (IFieldSourceGenerator) new RepeatedPrimitiveFieldGenerator(field, fieldOrdinal) |
||||
: new PrimitiveFieldGenerator(field, fieldOrdinal); |
||||
} |
||||
} |
||||
|
||||
public static ISourceGenerator CreateGenerator<T>(T descriptor) where T : IDescriptor |
||||
{ |
||||
Func<IDescriptor, ISourceGenerator> factory; |
||||
if (!GeneratorFactories.TryGetValue(typeof(T), out factory)) |
||||
{ |
||||
throw new ArgumentException("No generator registered for " + typeof(T).Name); |
||||
} |
||||
return factory(descriptor); |
||||
} |
||||
} |
||||
} |
@ -1,294 +0,0 @@ |
||||
// Protocol Buffers - Google's data interchange format |
||||
// Copyright 2008 Google Inc. All rights reserved. |
||||
// http://github.com/jskeet/dotnet-protobufs/ |
||||
// Original C++/Java/Python code: |
||||
// http://code.google.com/p/protobuf/ |
||||
// |
||||
// Redistribution and use in source and binary forms, with or without |
||||
// modification, are permitted provided that the following conditions are |
||||
// met: |
||||
// |
||||
// * Redistributions of source code must retain the above copyright |
||||
// notice, this list of conditions and the following disclaimer. |
||||
// * Redistributions in binary form must reproduce the above |
||||
// copyright notice, this list of conditions and the following disclaimer |
||||
// in the documentation and/or other materials provided with the |
||||
// distribution. |
||||
// * Neither the name of Google Inc. nor the names of its |
||||
// contributors may be used to endorse or promote products derived from |
||||
// this software without specific prior written permission. |
||||
// |
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
using System; |
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using Google.ProtocolBuffers.Descriptors; |
||||
|
||||
namespace Google.ProtocolBuffers.ProtoGen |
||||
{ |
||||
/// <summary> |
||||
/// Generator for the class describing the .proto file in general, |
||||
/// containing things like the message descriptor. |
||||
/// </summary> |
||||
internal sealed class UmbrellaClassGenerator : SourceGeneratorBase<FileDescriptor>, ISourceGenerator |
||||
{ |
||||
internal UmbrellaClassGenerator(FileDescriptor descriptor) |
||||
: base(descriptor) |
||||
{ |
||||
} |
||||
|
||||
// Recursively searches the given message to see if it contains any extensions. |
||||
private static bool UsesExtensions(IMessage message) |
||||
{ |
||||
// We conservatively assume that unknown fields are extensions. |
||||
if (message.UnknownFields.FieldDictionary.Count > 0) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
foreach (KeyValuePair<FieldDescriptor, object> keyValue in message.AllFields) |
||||
{ |
||||
FieldDescriptor field = keyValue.Key; |
||||
if (field.IsExtension) |
||||
{ |
||||
return true; |
||||
} |
||||
if (field.MappedType == MappedType.Message) |
||||
{ |
||||
if (field.IsRepeated) |
||||
{ |
||||
foreach (IMessage subMessage in (IEnumerable) keyValue.Value) |
||||
{ |
||||
if (UsesExtensions(subMessage)) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if (UsesExtensions((IMessage) keyValue.Value)) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public void Generate(TextGenerator writer) |
||||
{ |
||||
WriteIntroduction(writer); |
||||
WriteExtensionRegistration(writer); |
||||
WriteChildren(writer, "Extensions", Descriptor.Extensions); |
||||
writer.WriteLine("#region Static variables"); |
||||
foreach (MessageDescriptor message in Descriptor.MessageTypes) |
||||
{ |
||||
new MessageGenerator(message).GenerateStaticVariables(writer); |
||||
} |
||||
writer.WriteLine("#endregion"); |
||||
if (!UseLiteRuntime) |
||||
{ |
||||
WriteDescriptor(writer); |
||||
} |
||||
else |
||||
{ |
||||
WriteLiteExtensions(writer); |
||||
} |
||||
// The class declaration either gets closed before or after the children are written. |
||||
if (!Descriptor.CSharpOptions.NestClasses) |
||||
{ |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
|
||||
// Close the namespace around the umbrella class if defined |
||||
if (!Descriptor.CSharpOptions.NestClasses && Descriptor.CSharpOptions.UmbrellaNamespace != "") |
||||
{ |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
} |
||||
WriteChildren(writer, "Enums", Descriptor.EnumTypes); |
||||
WriteChildren(writer, "Messages", Descriptor.MessageTypes); |
||||
WriteChildren(writer, "Services", Descriptor.Services); |
||||
if (Descriptor.CSharpOptions.NestClasses) |
||||
{ |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
if (Descriptor.CSharpOptions.Namespace != "") |
||||
{ |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
} |
||||
writer.WriteLine(); |
||||
writer.WriteLine("#endregion Designer generated code"); |
||||
} |
||||
|
||||
private void WriteIntroduction(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("// Generated by {0}. DO NOT EDIT!", this.GetType().Assembly.FullName); |
||||
writer.WriteLine("#pragma warning disable 1591, 0612, 3021"); |
||||
writer.WriteLine("#region Designer generated code"); |
||||
|
||||
writer.WriteLine(); |
||||
writer.WriteLine("using pb = global::Google.ProtocolBuffers;"); |
||||
writer.WriteLine("using pbc = global::Google.ProtocolBuffers.Collections;"); |
||||
writer.WriteLine("using pbd = global::Google.ProtocolBuffers.Descriptors;"); |
||||
writer.WriteLine("using scg = global::System.Collections.Generic;"); |
||||
|
||||
if (Descriptor.CSharpOptions.Namespace != "") |
||||
{ |
||||
writer.WriteLine("namespace {0} {{", Descriptor.CSharpOptions.Namespace); |
||||
writer.Indent(); |
||||
writer.WriteLine(); |
||||
} |
||||
// Add the namespace around the umbrella class if defined |
||||
if (!Descriptor.CSharpOptions.NestClasses && Descriptor.CSharpOptions.UmbrellaNamespace != "") |
||||
{ |
||||
writer.WriteLine("namespace {0} {{", Descriptor.CSharpOptions.UmbrellaNamespace); |
||||
writer.Indent(); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
if (Descriptor.CSharpOptions.CodeContracts) |
||||
{ |
||||
writer.WriteLine("[global::System.Diagnostics.Contracts.ContractVerificationAttribute(false)]"); |
||||
} |
||||
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]"); |
||||
WriteGeneratedCodeAttributes(writer); |
||||
writer.WriteLine("{0} static partial class {1} {{", ClassAccessLevel, |
||||
Descriptor.CSharpOptions.UmbrellaClassname); |
||||
writer.WriteLine(); |
||||
writer.Indent(); |
||||
} |
||||
|
||||
private void WriteExtensionRegistration(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("#region Extension registration"); |
||||
writer.WriteLine("public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {"); |
||||
writer.Indent(); |
||||
foreach (FieldDescriptor extension in Descriptor.Extensions) |
||||
{ |
||||
new ExtensionGenerator(extension).GenerateExtensionRegistrationCode(writer); |
||||
} |
||||
foreach (MessageDescriptor message in Descriptor.MessageTypes) |
||||
{ |
||||
new MessageGenerator(message).GenerateExtensionRegistrationCode(writer); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("#endregion"); |
||||
} |
||||
|
||||
private void WriteDescriptor(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("#region Descriptor"); |
||||
|
||||
writer.WriteLine("public static pbd::FileDescriptor Descriptor {"); |
||||
writer.WriteLine(" get { return descriptor; }"); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("private static pbd::FileDescriptor descriptor;"); |
||||
writer.WriteLine(); |
||||
writer.WriteLine("static {0}() {{", Descriptor.CSharpOptions.UmbrellaClassname); |
||||
writer.Indent(); |
||||
writer.WriteLine("byte[] descriptorData = global::System.Convert.FromBase64String("); |
||||
writer.Indent(); |
||||
writer.Indent(); |
||||
writer.WriteLine("string.Concat("); |
||||
writer.Indent(); |
||||
// TODO(jonskeet): Consider a C#-escaping format here instead of just Base64. |
||||
byte[] bytes = Descriptor.Proto.ToByteArray(); |
||||
string base64 = Convert.ToBase64String(bytes); |
||||
|
||||
while (base64.Length > 60) |
||||
{ |
||||
writer.WriteLine("\"{0}\", ", base64.Substring(0, 60)); |
||||
base64 = base64.Substring(60); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("\"{0}\"));", base64); |
||||
writer.Outdent(); |
||||
writer.Outdent(); |
||||
writer.WriteLine( |
||||
"pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {"); |
||||
writer.Indent(); |
||||
writer.WriteLine("descriptor = root;"); |
||||
foreach (MessageDescriptor message in Descriptor.MessageTypes) |
||||
{ |
||||
new MessageGenerator(message).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
foreach (FieldDescriptor extension in Descriptor.Extensions) |
||||
{ |
||||
new ExtensionGenerator(extension).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
|
||||
if (UsesExtensions(Descriptor.Proto)) |
||||
{ |
||||
// Must construct an ExtensionRegistry containing all possible extensions |
||||
// and return it. |
||||
writer.WriteLine("pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();"); |
||||
writer.WriteLine("RegisterAllExtensions(registry);"); |
||||
foreach (FileDescriptor dependency in Descriptor.Dependencies) |
||||
{ |
||||
writer.WriteLine("{0}.RegisterAllExtensions(registry);", |
||||
DescriptorUtil.GetFullUmbrellaClassName(dependency)); |
||||
} |
||||
writer.WriteLine("return registry;"); |
||||
} |
||||
else |
||||
{ |
||||
writer.WriteLine("return null;"); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("};"); |
||||
|
||||
// ----------------------------------------------------------------- |
||||
// Invoke internalBuildGeneratedFileFrom() to build the file. |
||||
writer.WriteLine("pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,"); |
||||
writer.WriteLine(" new pbd::FileDescriptor[] {"); |
||||
foreach (FileDescriptor dependency in Descriptor.Dependencies) |
||||
{ |
||||
writer.WriteLine(" {0}.Descriptor, ", DescriptorUtil.GetFullUmbrellaClassName(dependency)); |
||||
} |
||||
writer.WriteLine(" }, assigner);"); |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("#endregion"); |
||||
writer.WriteLine(); |
||||
} |
||||
|
||||
private void WriteLiteExtensions(TextGenerator writer) |
||||
{ |
||||
writer.WriteLine("#region Extensions"); |
||||
writer.WriteLine("internal static readonly object Descriptor;"); |
||||
writer.WriteLine("static {0}() {{", Descriptor.CSharpOptions.UmbrellaClassname); |
||||
writer.Indent(); |
||||
writer.WriteLine("Descriptor = null;"); |
||||
|
||||
foreach (MessageDescriptor message in Descriptor.MessageTypes) |
||||
{ |
||||
new MessageGenerator(message).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
foreach (FieldDescriptor extension in Descriptor.Extensions) |
||||
{ |
||||
new ExtensionGenerator(extension).GenerateStaticVariableInitializers(writer); |
||||
} |
||||
writer.Outdent(); |
||||
writer.WriteLine("}"); |
||||
writer.WriteLine("#endregion"); |
||||
writer.WriteLine(); |
||||
} |
||||
} |
||||
} |
@ -1,101 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup> |
||||
<EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor> |
||||
<EnvironmentTemplate>NET35</EnvironmentTemplate> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProductVersion>9.0.30729</ProductVersion> |
||||
<SchemaVersion>2.0</SchemaVersion> |
||||
<ProjectGuid>{250ADE34-82FD-4BAE-86D5-985FBE589C4B}</ProjectGuid> |
||||
<OutputType>Exe</OutputType> |
||||
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
<RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace> |
||||
<AssemblyName>protoc-gen-cs</AssemblyName> |
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||
<FileAlignment>512</FileAlignment> |
||||
<SignAssembly>true</SignAssembly> |
||||
<AssemblyOriginatorKeyFile>..\..\keys\Google.ProtocolBuffers.snk</AssemblyOriginatorKeyFile> |
||||
<StartupObject>Google.ProtocolBuffers.ProtoGen.ProtocGenCs</StartupObject> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||
<DebugSymbols>true</DebugSymbols> |
||||
<DebugType>full</DebugType> |
||||
<Optimize>false</Optimize> |
||||
<OutputPath>bin\NET35\Debug</OutputPath> |
||||
<IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath> |
||||
<DefineConstants>DEBUG;TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||
<NoStdLib>true</NoStdLib> |
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||
<DebugType>pdbonly</DebugType> |
||||
<Optimize>true</Optimize> |
||||
<OutputPath>bin\NET35\Release</OutputPath> |
||||
<IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath> |
||||
<DefineConstants>TRACE</DefineConstants> |
||||
<ErrorReport>prompt</ErrorReport> |
||||
<WarningLevel>4</WarningLevel> |
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||
<NoStdLib>true</NoStdLib> |
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||
</PropertyGroup> |
||||
<ItemGroup> |
||||
<Reference Include="mscorlib" /> |
||||
<Reference Include="System" /> |
||||
<Reference Include="System.Data" /> |
||||
<Reference Include="System.Xml" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="DescriptorUtil.cs" /> |
||||
<Compile Include="EnumFieldGenerator.cs" /> |
||||
<Compile Include="EnumGenerator.cs" /> |
||||
<Compile Include="ExtensionGenerator.cs" /> |
||||
<Compile Include="FieldGeneratorBase.cs" /> |
||||
<Compile Include="IFieldSourceGenerator.cs" /> |
||||
<Compile Include="ISourceGenerator.cs" /> |
||||
<Compile Include="MessageFieldGenerator.cs" /> |
||||
<Compile Include="MessageGenerator.cs" /> |
||||
<Compile Include="PluginProtoFile.cs" /> |
||||
<Compile Include="PrimitiveFieldGenerator.cs" /> |
||||
<Compile Include="ProtocGenCs.cs" /> |
||||
<Compile Include="RepeatedEnumFieldGenerator.cs" /> |
||||
<Compile Include="RepeatedMessageFieldGenerator.cs" /> |
||||
<Compile Include="RepeatedPrimitiveFieldGenerator.cs" /> |
||||
<Compile Include="ServiceGenerator.cs" /> |
||||
<Compile Include="DependencyResolutionException.cs" /> |
||||
<Compile Include="Generator.cs" /> |
||||
<Compile Include="GeneratorOptions.cs" /> |
||||
<Compile Include="Helpers.cs" /> |
||||
<Compile Include="InvalidOptionsException.cs" /> |
||||
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||
<Compile Include="ServiceInterfaceGenerator.cs" /> |
||||
<Compile Include="SourceGeneratorBase.cs" /> |
||||
<Compile Include="SourceGenerators.cs" /> |
||||
<Compile Include="UmbrellaClassGenerator.cs" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ProjectReference Include="..\ProtocolBuffers.Serialization\ProtocolBuffers.Serialization.csproj"> |
||||
<Project>{231391af-449c-4a39-986c-ad7f270f4750}</Project> |
||||
<Name>ProtocolBuffers.Serialization</Name> |
||||
</ProjectReference> |
||||
<ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj"> |
||||
<Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project> |
||||
<Name>ProtocolBuffers</Name> |
||||
</ProjectReference> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<None Include="app.config" /> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
Other similar extension points exist, see Microsoft.Common.targets. |
||||
<Target Name="BeforeBuild"> |
||||
</Target> |
||||
<Target Name="AfterBuild"> |
||||
</Target> |
||||
--> |
||||
</Project> |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue