-
-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathGenericLoggerScopeExtensionsEmitter.cs
More file actions
76 lines (59 loc) · 2.98 KB
/
GenericLoggerScopeExtensionsEmitter.cs
File metadata and controls
76 lines (59 loc) · 2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System.CodeDom.Compiler;
using Microsoft.Extensions.Logging;
using static AutoLoggerMessageGenerator.Constants;
namespace AutoLoggerMessageGenerator.Emitters;
/// Generates the <see cref="GenericLoggerScopeExtensions"/> class.
/// Provides type-specific logging method overrides to avoid boxing.
/// The <see cref="GenericLoggerScopeExtensions"/> class is pre-generated and saved in the solution
/// to prevent excessive code duplication when multiple projects use the same library
/// To run this emitter you need to run LoggerScopeExtensionEmitterTests and take it from the snapshot
internal static class GenericLoggerScopeExtensionsEmitter
{
public const string ClassName = "GenericLoggerScopeExtensions";
public static string Emit()
{
using var sb = new IndentedTextWriter(new StringWriter());
sb.WriteLine(GeneratedFileHeader);
sb.WriteLine(JetBrainsAnnotationsImport);
sb.WriteLine();
sb.WriteLine($"namespace {DefaultLoggingNamespace}");
sb.WriteLine('{');
sb.Indent++;
sb.WriteLine(Constants.GeneratedCodeAttribute);
sb.WriteLine(EditorNotBrowsableAttribute);
sb.WriteLine(DebuggerStepThroughAttribute);
sb.WriteLine(ExcludeFromCoverageAttribute);
sb.WriteLine($"public static class {ClassName}");
sb.WriteLine('{');
sb.Indent++;
for (int i = 1; i <= MaxLogParameters; i++)
{
var parameters = Enumerable.Range(0, i).ToArray();
var genericTypesDefinition = string.Join(", ", parameters.Select(ix => $"T{ix}"));
genericTypesDefinition = string.IsNullOrEmpty(genericTypesDefinition)
? string.Empty
: $"<{genericTypesDefinition}>";
var genericParametersDefinition =
string.Join(", ", parameters.Select(ix => $"T{ix} {ParameterName}{ix}"));
genericParametersDefinition = string.IsNullOrEmpty(genericParametersDefinition)
? string.Empty
: $", {genericParametersDefinition}";
var objectParameters = string.Join(", ", parameters.Select(ix => $"{ParameterName}{ix}"));
objectParameters = string.IsNullOrEmpty(objectParameters)
? string.Empty
: $", new object?[] {{ {objectParameters} }}";
sb.WriteLine($"public static IDisposable? BeginScope{genericTypesDefinition}(this ILogger {LoggerParameterName}, {MessageTemplateDecorator} string {MessageParameterName}{genericParametersDefinition})");
sb.WriteLine('{');
sb.Indent++;
sb.WriteLine($"return {DefaultLoggingNamespace}.{nameof(LoggerExtensions)}.{nameof(LoggerExtensions.BeginScope)}({LoggerParameterName}, {MessageParameterName}{objectParameters});");
sb.Indent--;
sb.WriteLine('}');
sb.WriteLine();
}
sb.Indent--;
sb.WriteLine('}');
sb.Indent--;
sb.WriteLine('}');
return sb.InnerWriter.ToString()!;
}
}