1- using Microsoft . CodeAnalysis . CSharp ;
1+ using Lagrange . Proto . Serialization ;
22using SF = Microsoft . CodeAnalysis . CSharp . SyntaxFactory ;
33using SK = Microsoft . CodeAnalysis . CSharp . SyntaxKind ;
44
@@ -14,6 +14,8 @@ private partial class Emitter
1414
1515 private readonly string _protoTypeInfoNullableFullName = $ "global::Lagrange.Proto.Serialization.Metadata.ProtoObjectInfo<{ parser . Identifier } >?";
1616
17+ private const string ProtoNumberHandlingFullName = "global::Lagrange.Proto.Serialization.ProtoNumberHandling" ;
18+
1719 private FieldDeclarationSyntax EmitTypeInfoField ( )
1820 {
1921 return SF . FieldDeclaration ( SF . VariableDeclaration ( SF . ParseTypeName ( _protoTypeInfoNullableFullName ) ) . AddVariables ( SF . VariableDeclarator ( SF . Identifier ( "_typeInfo" ) ) ) )
@@ -42,22 +44,32 @@ private MethodDeclarationSyntax EmitTypeInfoCreationMethod()
4244 {
4345 var fields = parser . Fields . ToDictionary (
4446 kv => ( kv . Key << 3 ) | ( byte ) kv . Value . WireType ,
45- kv => SF . ObjectCreationExpression ( SF . ParseTypeName ( $ "global::Lagrange.Proto.Serialization.Metadata.ProtoFieldInfo<{ kv . Value . TypeSyntax } >") )
46- . WithArgumentList ( SF . ArgumentList (
47- SF . SeparatedList < ArgumentSyntax > (
48- [
49- SF . Argument ( SF . LiteralExpression ( SK . NumericLiteralExpression , SF . Literal ( kv . Key ) ) ) ,
50- SF . Argument ( SF . MemberAccessExpression ( SK . SimpleMemberAccessExpression , SF . IdentifierName ( "global::Lagrange.Proto.Serialization.WireType" ) , SF . IdentifierName ( kv . Value . WireType . ToString ( ) ) ) ) ,
51- SF . Argument ( SF . TypeOfExpression ( SF . ParseTypeName ( parser . Identifier ) ) )
52- ]
53- )
54- ) )
55- . WithInitializer ( SF . InitializerExpression ( SK . ObjectInitializerExpression ) . AddExpressions (
56- SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "Get" ) , EmitTypeInfoGetter ( kv . Value . Name ) ) ,
57- SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "Set" ) , EmitTypeInfoSetter ( kv . Value . Name ) )
47+ kv =>
48+ {
49+ string first = kv . Value . WireType switch
50+ {
51+ WireType . Fixed32 or WireType . Fixed64 => $ "{ ProtoNumberHandlingFullName } .{ kv . Value . WireType } ",
52+ _ => $ "{ ProtoNumberHandlingFullName } .Default"
53+ } ;
54+ string numberHandling = $ "{ first } { ( kv . Value . IsSigned ? $ " | { ProtoNumberHandlingFullName } .Signed" : "" ) } ";
55+
56+ return SF . ObjectCreationExpression ( SF . ParseTypeName ( $ "global::Lagrange.Proto.Serialization.Metadata.ProtoFieldInfo<{ kv . Value . TypeSyntax } >") )
57+ . WithArgumentList ( SF . ArgumentList (
58+ SF . SeparatedList < ArgumentSyntax > (
59+ [
60+ SF . Argument ( SF . LiteralExpression ( SK . NumericLiteralExpression , SF . Literal ( kv . Key ) ) ) ,
61+ SF . Argument ( SF . MemberAccessExpression ( SK . SimpleMemberAccessExpression , SF . IdentifierName ( "global::Lagrange.Proto.Serialization.WireType" ) , SF . IdentifierName ( kv . Value . WireType . ToString ( ) ) ) ) ,
62+ SF . Argument ( SF . TypeOfExpression ( SF . ParseTypeName ( parser . Identifier ) ) )
63+ ]
5864 )
59- )
60- ) ;
65+ ) )
66+ . WithInitializer ( SF . InitializerExpression ( SK . ObjectInitializerExpression ) . AddExpressions (
67+ SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "Get" ) , EmitTypeInfoGetter ( kv . Value . Name ) ) ,
68+ SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "Set" ) , EmitTypeInfoSetter ( kv . Value . Name ) ) ,
69+ SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "NumberHandling" ) , SF . IdentifierName ( numberHandling ) )
70+ )
71+ ) ;
72+ } ) ;
6173 var dictionaryInitialize = SF . ObjectCreationExpression ( SF . ParseTypeName ( "global::System.Collections.Generic.Dictionary<int, global::Lagrange.Proto.Serialization.Metadata.ProtoFieldInfo>" ) )
6274 . WithArgumentList ( SF . ArgumentList ( ) )
6375 . WithInitializer ( SF . InitializerExpression ( SK . CollectionInitializerExpression ) . AddExpressions (
@@ -72,10 +84,11 @@ private MethodDeclarationSyntax EmitTypeInfoCreationMethod()
7284
7385 var lambda = SF . ParenthesizedLambdaExpression ( SF . ParameterList ( ) , SF . ObjectCreationExpression ( SF . ParseTypeName ( parser . Identifier ) ) . WithArgumentList ( SF . ArgumentList ( ) ) ) ;
7486 var objectCreatorAssignment = SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "ObjectCreator" ) , lambda ) ;
87+ var ignoreDefaultAssignment = SF . AssignmentExpression ( SK . SimpleAssignmentExpression , SF . IdentifierName ( "IgnoreDefaultFields" ) , SF . LiteralExpression ( parser . IgnoreDefaultFields ? SK . TrueLiteralExpression : SK . FalseLiteralExpression ) ) ;
7588
7689 var returnStatement = SF . ReturnStatement ( SF . ObjectCreationExpression ( SF . ParseTypeName ( _protoTypeInfoFullName ) )
7790 . WithArgumentList ( SF . ArgumentList ( ) )
78- . WithInitializer ( SF . InitializerExpression ( SK . ObjectInitializerExpression ) . AddExpressions ( fieldsAssignment , objectCreatorAssignment ) )
91+ . WithInitializer ( SF . InitializerExpression ( SK . ObjectInitializerExpression ) . AddExpressions ( fieldsAssignment , objectCreatorAssignment , ignoreDefaultAssignment ) )
7992 ) ;
8093
8194 return SF . MethodDeclaration ( SF . ParseTypeName ( _protoTypeInfoFullName ) , "CreateTypeInfo" )
0 commit comments