@@ -16,11 +16,12 @@ internal class Emitter
16
16
private const int MaxLoggerMessageDefineArguments = 6 ;
17
17
private const int DefaultStringBuilderCapacity = 1024 ;
18
18
19
- private readonly string _generatedCodeAttribute =
19
+ private static readonly string s_generatedCodeAttribute =
20
20
$ "global::System.CodeDom.Compiler.GeneratedCodeAttribute(" +
21
21
$ "\" { typeof ( Emitter ) . Assembly . GetName ( ) . Name } \" , " +
22
22
$ "\" { typeof ( Emitter ) . Assembly . GetName ( ) . Version } \" )";
23
23
private readonly StringBuilder _builder = new StringBuilder ( DefaultStringBuilderCapacity ) ;
24
+ private bool _needEnumerationHelper ;
24
25
25
26
public string Emit ( IReadOnlyList < LoggerClass > logClasses , CancellationToken cancellationToken )
26
27
{
@@ -34,6 +35,7 @@ public string Emit(IReadOnlyList<LoggerClass> logClasses, CancellationToken canc
34
35
GenType ( lc ) ;
35
36
}
36
37
38
+ GenEnumerationHelper ( ) ;
37
39
return _builder . ToString ( ) ;
38
40
}
39
41
@@ -47,10 +49,10 @@ private static bool UseLoggerMessageDefine(LoggerMethod lm)
47
49
if ( result )
48
50
{
49
51
// make sure the order of the templates matches the order of the logging method parameter
50
- int count = 0 ;
51
- foreach ( string t in lm . TemplateList )
52
+ for ( int i = 0 ; i < lm . TemplateList . Count ; i ++ )
52
53
{
53
- if ( ! t . Equals ( lm . TemplateParameters [ count ] . Name , StringComparison . OrdinalIgnoreCase ) )
54
+ string t = lm . TemplateList [ i ] ;
55
+ if ( ! t . Equals ( lm . TemplateParameters [ i ] . Name , StringComparison . OrdinalIgnoreCase ) )
54
56
{
55
57
// order doesn't match, can't use LoggerMessage.Define
56
58
return false ;
@@ -84,8 +86,6 @@ partial class {lc.Name} {lc.Constraints}
84
86
GenLogMethod ( lm ) ;
85
87
}
86
88
87
- GenEnumerationHelper ( lc ) ;
88
-
89
89
_builder . Append ( $@ "
90
90
}}" ) ;
91
91
@@ -99,7 +99,7 @@ partial class {lc.Name} {lc.Constraints}
99
99
private void GenStruct ( LoggerMethod lm )
100
100
{
101
101
_builder . AppendLine ( $@ "
102
- [{ _generatedCodeAttribute } ]
102
+ [{ s_generatedCodeAttribute } ]
103
103
private readonly struct __{ lm . Name } Struct : global::System.Collections.Generic.IReadOnlyList<global::System.Collections.Generic.KeyValuePair<string, object?>>
104
104
{{" ) ;
105
105
GenFields ( lm ) ;
@@ -193,7 +193,9 @@ private void GenVariableAssignments(LoggerMethod lm)
193
193
if ( lm . TemplateParameters [ index ] . IsEnumerable )
194
194
{
195
195
_builder . AppendLine ( $ " var { t . Key } = "
196
- + $ "__Enumerate((global::System.Collections.IEnumerable ?)this._{ lm . TemplateParameters [ index ] . Name } );") ;
196
+ + $ "global::__LoggerMessageGenerator.Enumerate((global::System.Collections.IEnumerable ?)this._{ lm . TemplateParameters [ index ] . Name } );") ;
197
+
198
+ _needEnumerationHelper = true ;
197
199
}
198
200
else
199
201
{
@@ -237,7 +239,7 @@ private void GenDefineTypes(LoggerMethod lm, bool brackets)
237
239
}
238
240
if ( brackets )
239
241
{
240
- _builder . Append ( "<" ) ;
242
+ _builder . Append ( '<' ) ;
241
243
}
242
244
243
245
bool firstItem = true ;
@@ -257,7 +259,7 @@ private void GenDefineTypes(LoggerMethod lm, bool brackets)
257
259
258
260
if ( brackets )
259
261
{
260
- _builder . Append ( ">" ) ;
262
+ _builder . Append ( '>' ) ;
261
263
}
262
264
else
263
265
{
@@ -322,15 +324,15 @@ private void GenHolder(LoggerMethod lm)
322
324
private void GenLogMethod ( LoggerMethod lm )
323
325
{
324
326
string level = GetLogLevel ( lm ) ;
325
- string extension = ( lm . IsExtensionMethod ? "this " : string . Empty ) ;
327
+ string extension = lm . IsExtensionMethod ? "this " : string . Empty ;
326
328
string eventName = string . IsNullOrWhiteSpace ( lm . EventName ) ? $ "nameof({ lm . Name } )" : $ "\" { lm . EventName } \" ";
327
329
string exceptionArg = GetException ( lm ) ;
328
330
string logger = GetLogger ( lm ) ;
329
331
330
332
if ( UseLoggerMessageDefine ( lm ) )
331
333
{
332
334
_builder . Append ( $@ "
333
- [{ _generatedCodeAttribute } ]
335
+ [{ s_generatedCodeAttribute } ]
334
336
private static readonly global::System.Action<global::Microsoft.Extensions.Logging.ILogger, " ) ;
335
337
336
338
GenDefineTypes ( lm , brackets : false ) ;
@@ -345,7 +347,7 @@ private void GenLogMethod(LoggerMethod lm)
345
347
}
346
348
347
349
_builder . Append ( $@ "
348
- [{ _generatedCodeAttribute } ]
350
+ [{ s_generatedCodeAttribute } ]
349
351
{ lm . Modifiers } void { lm . Name } ({ extension } " ) ;
350
352
351
353
GenParameters ( lm ) ;
@@ -443,63 +445,56 @@ static string GetLogLevel(LoggerMethod lm)
443
445
}
444
446
}
445
447
446
- private void GenEnumerationHelper ( LoggerClass lc )
448
+ private void GenEnumerationHelper ( )
447
449
{
448
- foreach ( LoggerMethod lm in lc . Methods )
450
+ if ( _needEnumerationHelper )
449
451
{
450
- if ( UseLoggerMessageDefine ( lm ) )
451
- {
452
- foreach ( LoggerParameter p in lm . TemplateParameters )
453
- {
454
- if ( p . IsEnumerable )
455
- {
456
452
_builder . Append ( $@ "
457
- [{ _generatedCodeAttribute } ]
458
- private static string __Enumerate(global::System.Collections.IEnumerable? enumerable)
453
+ [{ s_generatedCodeAttribute } ]
454
+ internal static class __LoggerMessageGenerator
455
+ {{
456
+ public static string Enumerate(global::System.Collections.IEnumerable? enumerable)
457
+ {{
458
+ if (enumerable == null)
459
459
{{
460
- if (enumerable == null)
461
- {{
462
- return ""(null)"";
463
- }}
460
+ return ""(null)"";
461
+ }}
464
462
465
- var sb = new global::System.Text.StringBuilder();
466
- _ = sb.Append('[');
463
+ var sb = new global::System.Text.StringBuilder();
464
+ _ = sb.Append('[');
467
465
468
- bool first = true;
469
- foreach (object e in enumerable)
466
+ bool first = true;
467
+ foreach (object e in enumerable)
468
+ {{
469
+ if (!first)
470
470
{{
471
- if (!first)
472
- {{
473
- _ = sb.Append("", "");
474
- }}
471
+ _ = sb.Append("", "");
472
+ }}
475
473
476
- if (e == null)
474
+ if (e == null)
475
+ {{
476
+ _ = sb.Append(""(null)"");
477
+ }}
478
+ else
479
+ {{
480
+ if (e is global::System.IFormattable fmt)
477
481
{{
478
- _ = sb.Append("" (null)"" );
482
+ _ = sb.Append(fmt.ToString (null, global::System.Globalization.CultureInfo.InvariantCulture) );
479
483
}}
480
484
else
481
485
{{
482
- if (e is global::System.IFormattable fmt)
483
- {{
484
- _ = sb.Append(fmt.ToString(null, global::System.Globalization.CultureInfo.InvariantCulture));
485
- }}
486
- else
487
- {{
488
- _ = sb.Append(e);
489
- }}
486
+ _ = sb.Append(e);
490
487
}}
491
-
492
- first = false;
493
488
}}
494
489
495
- _ = sb.Append(']');
496
-
497
- return sb.ToString();
490
+ first = false;
498
491
}}
499
- " ) ;
500
- }
501
- }
502
- }
492
+
493
+ _ = sb.Append(']');
494
+
495
+ return sb.ToString();
496
+ }}
497
+ }}" ) ;
503
498
}
504
499
}
505
500
}
0 commit comments