Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
385baaa8
Commit
385baaa8
authored
Jul 15, 2015
by
Jon Skeet
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #599 from jskeet/no-map-entries
Don't generate types for map entry messages
parents
f8281604
db52c9dd
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
39 additions
and
171 deletions
+39
-171
MapUnittestProto3.cs
.../src/ProtocolBuffers.Test/TestProtos/MapUnittestProto3.cs
+0
-0
Struct.cs
csharp/src/ProtocolBuffers/WellKnownTypes/Struct.cs
+0
-163
csharp_helpers.h
src/google/protobuf/compiler/csharp/csharp_helpers.h
+6
-0
csharp_message.cc
src/google/protobuf/compiler/csharp/csharp_message.cc
+31
-8
csharp_message.h
src/google/protobuf/compiler/csharp/csharp_message.h
+2
-0
No files found.
csharp/src/ProtocolBuffers.Test/TestProtos/MapUnittestProto3.cs
View file @
385baaa8
This diff is collapsed.
Click to expand it.
csharp/src/ProtocolBuffers/WellKnownTypes/Struct.cs
View file @
385baaa8
...
...
@@ -16,7 +16,6 @@ namespace Google.Protobuf.WellKnownTypes {
#
region
Static
variables
internal
static
pbr
::
FieldAccessorTable
internal__static_google_protobuf_Struct__FieldAccessorTable
;
internal
static
pbr
::
FieldAccessorTable
internal__static_google_protobuf_Struct_FieldsEntry__FieldAccessorTable
;
internal
static
pbr
::
FieldAccessorTable
internal__static_google_protobuf_Value__FieldAccessorTable
;
internal
static
pbr
::
FieldAccessorTable
internal__static_google_protobuf_ListValue__FieldAccessorTable
;
#
endregion
...
...
@@ -49,9 +48,6 @@ namespace Google.Protobuf.WellKnownTypes {
internal__static_google_protobuf_Struct__FieldAccessorTable
=
new
pbr
::
FieldAccessorTable
(
typeof
(
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Struct
),
descriptor
.
MessageTypes
[
0
],
new
string
[]
{
"Fields"
,
},
new
string
[]
{
});
internal__static_google_protobuf_Struct_FieldsEntry__FieldAccessorTable
=
new
pbr
::
FieldAccessorTable
(
typeof
(
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Struct
.
Types
.
FieldsEntry
),
descriptor
.
MessageTypes
[
0
].
NestedTypes
[
0
],
new
string
[]
{
"Key"
,
"Value"
,
},
new
string
[]
{
});
internal__static_google_protobuf_Value__FieldAccessorTable
=
new
pbr
::
FieldAccessorTable
(
typeof
(
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Value
),
descriptor
.
MessageTypes
[
1
],
new
string
[]
{
"NullValue"
,
"NumberValue"
,
"StringValue"
,
"BoolValue"
,
"StructValue"
,
"ListValue"
,
},
new
string
[]
{
"Kind"
,
});
...
...
@@ -180,165 +176,6 @@ namespace Google.Protobuf.WellKnownTypes {
}
}
#
region
Nested
types
[
global
::
System
.
Diagnostics
.
DebuggerNonUserCodeAttribute
()]
public
static
partial
class
Types
{
[
global
::
System
.
Diagnostics
.
DebuggerNonUserCodeAttribute
()]
public
sealed
partial
class
FieldsEntry
:
pb
::
IMessage
<
FieldsEntry
>
{
private
static
readonly
pb
::
MessageParser
<
FieldsEntry
>
_parser
=
new
pb
::
MessageParser
<
FieldsEntry
>(()
=>
new
FieldsEntry
());
public
static
pb
::
MessageParser
<
FieldsEntry
>
Parser
{
get
{
return
_parser
;
}
}
private
static
readonly
string
[]
_fieldNames
=
new
string
[]
{
"key"
,
"value"
};
private
static
readonly
uint
[]
_fieldTags
=
new
uint
[]
{
10
,
18
};
public
static
pbr
::
MessageDescriptor
Descriptor
{
get
{
return
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Struct
.
Descriptor
.
NestedTypes
[
0
];
}
}
pbr
::
FieldAccessorTable
pb
::
IReflectedMessage
.
Fields
{
get
{
return
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Proto
.
Struct
.
internal__static_google_protobuf_Struct_FieldsEntry__FieldAccessorTable
;
}
}
private
bool
_frozen
=
false
;
public
bool
IsFrozen
{
get
{
return
_frozen
;
}
}
public
FieldsEntry
()
{
OnConstruction
();
}
partial
void
OnConstruction
();
public
FieldsEntry
(
FieldsEntry
other
)
:
this
()
{
key_
=
other
.
key_
;
Value
=
other
.
value_
!=
null
?
other
.
Value
.
Clone
()
:
null
;
}
public
FieldsEntry
Clone
()
{
return
new
FieldsEntry
(
this
);
}
public
void
Freeze
()
{
if
(
IsFrozen
)
{
return
;
}
_frozen
=
true
;
if
(
value_
!=
null
)
Value
.
Freeze
();
}
public
const
int
KeyFieldNumber
=
1
;
private
string
key_
=
""
;
public
string
Key
{
get
{
return
key_
;
}
set
{
pb
::
Freezable
.
CheckMutable
(
this
);
key_
=
value
??
""
;
}
}
public
const
int
ValueFieldNumber
=
2
;
private
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Value
value_
;
public
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Value
Value
{
get
{
return
value_
;
}
set
{
pb
::
Freezable
.
CheckMutable
(
this
);
value_
=
value
;
}
}
public
override
bool
Equals
(
object
other
)
{
return
Equals
(
other
as
FieldsEntry
);
}
public
bool
Equals
(
FieldsEntry
other
)
{
if
(
ReferenceEquals
(
other
,
null
))
{
return
false
;
}
if
(
ReferenceEquals
(
other
,
this
))
{
return
true
;
}
if
(
Key
!=
other
.
Key
)
return
false
;
if
(!
object
.
Equals
(
Value
,
other
.
Value
))
return
false
;
return
true
;
}
public
override
int
GetHashCode
()
{
int
hash
=
1
;
if
(
Key
.
Length
!=
0
)
hash
^=
Key
.
GetHashCode
();
if
(
value_
!=
null
)
hash
^=
Value
.
GetHashCode
();
return
hash
;
}
public
override
string
ToString
()
{
return
pb
::
JsonFormatter
.
Default
.
Format
(
this
);
}
public
void
WriteTo
(
pb
::
CodedOutputStream
output
)
{
if
(
Key
.
Length
!=
0
)
{
output
.
WriteRawTag
(
10
);
output
.
WriteString
(
Key
);
}
if
(
value_
!=
null
)
{
output
.
WriteRawTag
(
18
);
output
.
WriteMessage
(
Value
);
}
}
public
int
CalculateSize
()
{
int
size
=
0
;
if
(
Key
.
Length
!=
0
)
{
size
+=
1
+
pb
::
CodedOutputStream
.
ComputeStringSize
(
Key
);
}
if
(
value_
!=
null
)
{
size
+=
1
+
pb
::
CodedOutputStream
.
ComputeMessageSize
(
Value
);
}
return
size
;
}
public
void
MergeFrom
(
FieldsEntry
other
)
{
if
(
other
==
null
)
{
return
;
}
if
(
other
.
Key
.
Length
!=
0
)
{
Key
=
other
.
Key
;
}
if
(
other
.
value_
!=
null
)
{
if
(
value_
==
null
)
{
value_
=
new
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Value
();
}
Value
.
MergeFrom
(
other
.
Value
);
}
}
public
void
MergeFrom
(
pb
::
CodedInputStream
input
)
{
uint
tag
;
while
(
input
.
ReadTag
(
out
tag
))
{
switch
(
tag
)
{
case
0
:
throw
pb
::
InvalidProtocolBufferException
.
InvalidTag
();
default
:
if
(
pb
::
WireFormat
.
IsEndGroupTag
(
tag
))
{
return
;
}
break
;
case
10
:
{
Key
=
input
.
ReadString
();
break
;
}
case
18
:
{
if
(
value_
==
null
)
{
value_
=
new
global
::
Google
.
Protobuf
.
WellKnownTypes
.
Value
();
}
input
.
ReadMessage
(
value_
);
break
;
}
}
}
}
}
}
#
endregion
}
[
global
::
System
.
Diagnostics
.
DebuggerNonUserCodeAttribute
()]
...
...
src/google/protobuf/compiler/csharp/csharp_helpers.h
View file @
385baaa8
...
...
@@ -105,6 +105,12 @@ uint FixedMakeTag(const FieldDescriptor* descriptor);
FieldGeneratorBase
*
CreateFieldGenerator
(
const
FieldDescriptor
*
descriptor
,
int
fieldOrdinal
);
// Determines whether the given message is a map entry message, i.e. one implicitly created
// by protoc due to a map<key, value> field.
inline
bool
IsMapEntryMessage
(
const
Descriptor
*
descriptor
)
{
return
descriptor
->
options
().
map_entry
();
}
// Determines whether we're generating code for the proto representation of descriptors etc,
// for use in the runtime. This is the only type which is allowed to use proto2 syntax,
// and it generates internal classes.
...
...
src/google/protobuf/compiler/csharp/csharp_message.cc
View file @
385baaa8
...
...
@@ -121,8 +121,11 @@ void MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
"full_class_name"
,
full_class_name
());
for
(
int
i
=
0
;
i
<
descriptor_
->
nested_type_count
();
i
++
)
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
GenerateStaticVariables
(
printer
);
// Don't generate accessor table fields for maps...
if
(
!
IsMapEntryMessage
(
descriptor_
->
nested_type
(
i
)))
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
GenerateStaticVariables
(
printer
);
}
}
}
...
...
@@ -159,10 +162,12 @@ void MessageGenerator::GenerateStaticVariableInitializers(io::Printer* printer)
}
printer
->
Print
(
"});
\n
"
);
// Generate static member initializers for all nested types.
// Generate static member initializers for all n
on-map-entry n
ested types.
for
(
int
i
=
0
;
i
<
descriptor_
->
nested_type_count
();
i
++
)
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
GenerateStaticVariableInitializers
(
printer
);
if
(
!
IsMapEntryMessage
(
descriptor_
->
nested_type
(
i
)))
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
GenerateStaticVariableInitializers
(
printer
);
}
}
}
...
...
@@ -285,7 +290,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
GenerateMergingMethods
(
printer
);
// Nested messages and enums
if
(
descriptor_
->
enum_type_count
()
+
descriptor_
->
nested_type_count
()
>
0
)
{
if
(
HasNestedGeneratedTypes
()
)
{
printer
->
Print
(
"#region Nested types
\n
"
"[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
\n
"
);
WriteGeneratedCodeAttributes
(
printer
);
...
...
@@ -296,8 +301,11 @@ void MessageGenerator::Generate(io::Printer* printer) {
enumGenerator
.
Generate
(
printer
);
}
for
(
int
i
=
0
;
i
<
descriptor_
->
nested_type_count
();
i
++
)
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
Generate
(
printer
);
// Don't generate nested types for maps...
if
(
!
IsMapEntryMessage
(
descriptor_
->
nested_type
(
i
)))
{
MessageGenerator
messageGenerator
(
descriptor_
->
nested_type
(
i
));
messageGenerator
.
Generate
(
printer
);
}
}
printer
->
Outdent
();
printer
->
Print
(
"}
\n
"
...
...
@@ -310,6 +318,21 @@ void MessageGenerator::Generate(io::Printer* printer) {
printer
->
Print
(
"
\n
"
);
}
// Helper to work out whether we need to generate a class to hold nested types/enums.
// Only tricky because we don't want to generate map entry types.
bool
MessageGenerator
::
HasNestedGeneratedTypes
()
{
if
(
descriptor_
->
enum_type_count
()
>
0
)
{
return
true
;
}
for
(
int
i
=
0
;
i
<
descriptor_
->
nested_type_count
();
i
++
)
{
if
(
!
IsMapEntryMessage
(
descriptor_
->
nested_type
(
i
)))
{
return
true
;
}
}
return
false
;
}
void
MessageGenerator
::
GenerateCloningCode
(
io
::
Printer
*
printer
)
{
map
<
string
,
string
>
vars
;
vars
[
"class_name"
]
=
class_name
();
...
...
src/google/protobuf/compiler/csharp/csharp_message.h
View file @
385baaa8
...
...
@@ -69,6 +69,8 @@ class MessageGenerator : public SourceGeneratorBase {
FieldGeneratorBase
*
CreateFieldGeneratorInternal
(
const
FieldDescriptor
*
descriptor
);
bool
HasNestedGeneratedTypes
();
std
::
string
class_name
();
std
::
string
full_class_name
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment