11using Microsoft . CodeAnalysis ;
2- using Microsoft . CodeAnalysis . CSharp ;
3- using Microsoft . CodeAnalysis . CSharp . Syntax ;
42using System . Text ;
53
64namespace EIV_Pack . Generator ;
@@ -24,13 +22,11 @@ internal static void Generate(GeneratorClass generatorClass, SourceProductionCon
2422 . Replace ( "<" , "_" )
2523 . Replace ( ">" , "_" ) ;
2624
27- var classOrStructOrRecord = ( typeSymbol . IsRecord , typeSymbol . IsValueType ) switch
28- {
29- ( true , true ) => "record struct" ,
30- ( true , false ) => "record" ,
31- ( false , true ) => "struct" ,
32- ( false , false ) => "class" ,
33- } ;
25+ var TypeName = typeSymbol . ToDisplayString ( SymbolDisplayFormat . MinimallyQualifiedFormat ) ;
26+
27+ var classOrStructOrRecord = HelperMethods . ValueName ( typeSymbol ) ;
28+
29+ string typeParameterStr = HelperMethods . GetTypeParameters ( typeSymbol ) ;
3430
3531 StringBuilder sb = new ( ) ;
3632 sb . AppendLine ( "// Generated with EIV_Pack.Generator." ) ;
@@ -44,26 +40,7 @@ internal static void Generate(GeneratorClass generatorClass, SourceProductionCon
4440 sb . AppendLine ( ) ;
4541 }
4642
47- List < string > names = [ ] ;
48- INamespaceSymbol namespaceSymbol = typeSymbol . ContainingNamespace ;
49- while ( namespaceSymbol != null )
50- {
51- if ( namespaceSymbol . Name . Contains ( "<global namespace>" ) )
52- break ;
53-
54- names . Add ( namespaceSymbol . Name ) ;
55- namespaceSymbol = namespaceSymbol . ContainingNamespace ;
56- }
57-
58- names . Reverse ( ) ;
59-
60- string namespaceStr = string . Empty ;
61-
62- if ( names . Count != 0 )
63- namespaceStr = string . Join ( "." , names ) ;
64-
65- if ( names . Count > 1 )
66- namespaceStr = namespaceStr . Substring ( 1 ) ;
43+ string namespaceStr = HelperMethods . GetNameSpace ( typeSymbol ) ;
6744
6845 if ( ! string . IsNullOrEmpty ( namespaceStr ) )
6946 {
@@ -79,7 +56,7 @@ internal static void Generate(GeneratorClass generatorClass, SourceProductionCon
7956 }
8057
8158 sb . AppendLine ( ) ;
82- sb . AppendLine ( $ "partial { classOrStructOrRecord } { typeSymbol . Name } : IPackable<{ typeSymbol . Name } >") ;
59+ sb . AppendLine ( $ "partial { classOrStructOrRecord } { TypeName } : IPackable<{ TypeName } >") ;
8360 sb . AppendLine ( "{" ) ;
8461
8562 if ( ! typeSymbol . GetMembers ( ) . Any ( x => x . IsStatic && x . Kind == SymbolKind . Method && x . Name == ".cctor" ) )
@@ -97,21 +74,21 @@ internal static void Generate(GeneratorClass generatorClass, SourceProductionCon
9774
9875 bool hasRegister = PreProcessing . HasRegisterFormatter ( typeSymbol ) ;
9976
100- string formatterName = generatorClass . IsNet8OrGreater ? $ "EIV_Formatter<{ typeSymbol . Name } >" : $ "{ typeSymbol . Name } _Formatter";
77+ string formatterName = generatorClass . IsNet8OrGreater ? $ "EIV_Formatter<{ TypeName } >" : $ "{ typeSymbol . Name } _Formatter{ typeParameterStr } ";
10178
10279 sb . AppendLine (
10380 $$ """
10481
10582 public static{{ ( hasRegister ? " new " : " " ) }} void RegisterFormatter()
10683 {
107- if (!FormatterProvider.IsRegistered<{{ typeSymbol . Name }} >())
84+ if (!FormatterProvider.IsRegistered<{{ TypeName }} >())
10885 {
109- FormatterProvider.Register<{{ typeSymbol . Name }} >(new {{ formatterName }} ());
86+ FormatterProvider.Register<{{ TypeName }} >(new {{ formatterName }} ());
11087 }
11188
112- if (!FormatterProvider.IsRegistered<{{ typeSymbol . Name }} []>())
89+ if (!FormatterProvider.IsRegistered<{{ TypeName }} []>())
11390 {
114- FormatterProvider.Register(new ArrayFormatter<{{ typeSymbol . Name }} >());
91+ FormatterProvider.Register(new ArrayFormatter<{{ TypeName }} >());
11592 }
11693 }
11794
@@ -147,16 +124,16 @@ internal static void Generate(GeneratorClass generatorClass, SourceProductionCon
147124 }
148125
149126 sb . AppendLine ( $$ """
150- sealed class {{ typeSymbol . Name }} _Formatter : BaseFormatter<{{ typeSymbol . Name }} >
127+ sealed class {{ typeSymbol . Name }} _Formatter{{ typeParameterStr }} : BaseFormatter<{{ TypeName }} >{{ string . Join ( " \n , " , HelperMethods . GetWhereClauses ( typeSymbol ) ) }}
151128 {
152- public override void Serialize(ref PackWriter writer, scoped ref readonly {{ typeSymbol . Name }} value)
129+ public override void Serialize(ref PackWriter writer, scoped ref readonly {{ TypeName }} value)
153130 {
154- {{ typeSymbol . Name }} .SerializePackable(ref writer, in value);
131+ {{ TypeName }} .SerializePackable(ref writer, in value);
155132 }
156133
157- public override void Deserialize(ref PackReader reader, scoped ref {{ typeSymbol . Name }} value)
134+ public override void Deserialize(ref PackReader reader, scoped ref {{ TypeName }} value)
158135 {
159- {{ typeSymbol . Name }} .DeserializePackable(ref reader, ref value);
136+ {{ TypeName }} .DeserializePackable(ref reader, ref value);
160137 }
161138 }
162139 """ ) ;
@@ -173,14 +150,15 @@ public override void Deserialize(ref PackReader reader, scoped ref {{typeSymbol.
173150
174151 internal static void GeneratePackable ( ref INamedTypeSymbol typeSymbol , ref StringBuilder sb , ref List < ISymbol > FieldAndParamList , ref List < ISymbol > initOnly , bool isNet8OrGreater )
175152 {
153+ var TypeName = typeSymbol . ToDisplayString ( SymbolDisplayFormat . MinimallyQualifiedFormat ) ;
176154 var nullable = ! typeSymbol . IsValueType && isNet8OrGreater ? "?" : string . Empty ;
177155 var exceptInit = FieldAndParamList . Except ( initOnly ) ;
178156 bool hasInitOnly = initOnly . Count > 0 ;
179157 string ending = hasInitOnly ? string . Empty : ";" ;
180158
181159 sb . AppendLine ( $ "\t const int EIV_PACK_FieldAndParamCount = { FieldAndParamList . Count } ;") ;
182160 sb . AppendLine ( ) ;
183- sb . AppendLine ( $ "\t public static void DeserializePackable(ref PackReader reader, scoped ref { typeSymbol . Name } { nullable } value)") ;
161+ sb . AppendLine ( $ "\t public static void DeserializePackable(ref PackReader reader, scoped ref { TypeName } { nullable } value)") ;
184162 sb . AppendLine ( "\t {" ) ;
185163 if ( FieldAndParamList . Count <= 255 )
186164 sb . AppendLine ( $ "\t \t if (!reader.TryReadSmallHeader(out byte header) || header != EIV_PACK_FieldAndParamCount)") ;
@@ -219,7 +197,7 @@ internal static void GeneratePackable(ref INamedTypeSymbol typeSymbol, ref Strin
219197
220198 sb . AppendLine ( "\t }" ) ;
221199 sb . AppendLine ( ) ;
222- sb . AppendLine ( $ "\t public static void SerializePackable(ref PackWriter writer, scoped ref readonly { typeSymbol . Name } { nullable } value)") ;
200+ sb . AppendLine ( $ "\t public static void SerializePackable(ref PackWriter writer, scoped ref readonly { TypeName } { nullable } value)") ;
223201 sb . AppendLine ( "\t {" ) ;
224202
225203 string useSmall = FieldAndParamList . Count <= 255 ? "Small" : string . Empty ;
0 commit comments