Skip to content

Commit ef14209

Browse files
committed
Move diagnoser source generation to CodeGenerator.
1 parent 09680e2 commit ef14209

File tree

5 files changed

+49
-36
lines changed

5 files changed

+49
-36
lines changed

src/BenchmarkDotNet/Code/CodeGenerator.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Text;
88
using System.Threading.Tasks;
99
using BenchmarkDotNet.Characteristics;
10+
using BenchmarkDotNet.Diagnosers;
1011
using BenchmarkDotNet.Disassemblers;
1112
using BenchmarkDotNet.Environments;
1213
using BenchmarkDotNet.Extensions;
@@ -66,7 +67,7 @@ internal static string Generate(BuildPartition buildPartition)
6667
.Replace("$MeasureExtraStats$", buildInfo.Config.HasExtraStatsDiagnoser() ? "true" : "false")
6768
.Replace("$DisassemblerEntryMethodName$", DisassemblerConstants.DisassemblerEntryMethodName)
6869
.Replace("$WorkloadMethodCall$", provider.GetWorkloadMethodCall(passArguments))
69-
.Replace("$InProcessDiagnosers$", string.Join($",\n", buildInfo.CompositeInProcessDiagnoser.GetSourceCode(benchmark)))
70+
.Replace("$InProcessDiagnoserRouters$", GetInProcessDiagnoserRouters(buildInfo))
7071
.RemoveRedundantIfDefines(compilationId);
7172

7273
benchmarkTypeCode = Unroll(benchmarkTypeCode, benchmark.Job.ResolveValue(RunMode.UnrollFactorCharacteristic, EnvironmentResolver.Instance));
@@ -250,6 +251,31 @@ private static string GetEngineFactoryTypeName(BenchmarkCase benchmarkCase)
250251
return factoryType.GetCorrectCSharpTypeName();
251252
}
252253

254+
private static string GetInProcessDiagnoserRouters(BenchmarkBuildInfo buildInfo)
255+
{
256+
var sourceCodes = buildInfo.CompositeInProcessDiagnoser.InProcessDiagnosers
257+
.Select((d, i) => ToSourceCode(d, buildInfo.BenchmarkCase, i))
258+
.WhereNotNull();
259+
return string.Join($",\n", sourceCodes);
260+
261+
static string? ToSourceCode(IInProcessDiagnoser diagnoser, BenchmarkCase benchmarkCase, int index)
262+
{
263+
var (handlerType, serializedConfig) = diagnoser.GetSeparateProcessHandlerTypeAndSerializedConfig(benchmarkCase);
264+
if (handlerType is null)
265+
{
266+
return null;
267+
}
268+
string routerType = typeof(InProcessDiagnoserRouter).GetCorrectCSharpTypeName();
269+
return $$"""
270+
new {{routerType}}() {
271+
{{nameof(InProcessDiagnoserRouter.handler)}} = {{routerType}}.{{nameof(InProcessDiagnoserRouter.Init)}}(new {{handlerType.GetCorrectCSharpTypeName()}}(), {{SourceCodeHelper.ToSourceCode(serializedConfig)}}),
272+
{{nameof(InProcessDiagnoserRouter.index)}} = {{index}},
273+
{{nameof(InProcessDiagnoserRouter.runMode)}} = {{SourceCodeHelper.ToSourceCode(diagnoser.GetRunMode(benchmarkCase))}}
274+
}
275+
""";
276+
}
277+
}
278+
253279
private static string GetParameterModifier(ParameterInfo parameterInfo)
254280
{
255281
if (!parameterInfo.ParameterType.IsByRef)

src/BenchmarkDotNet/Diagnosers/CompositeDiagnoser.cs

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -63,40 +63,10 @@ public sealed class CompositeInProcessDiagnoser(IReadOnlyList<IInProcessDiagnose
6363
public const string HeaderKey = "// InProcessDiagnoser";
6464
public const string ResultsKey = $"{HeaderKey}Results";
6565

66-
public IEnumerable<string> GetSourceCode(BenchmarkCase benchmarkCase)
67-
=> inProcessDiagnosers
68-
.Select((d, i) => ToSourceCode(d, benchmarkCase, i))
69-
.WhereNotNull();
70-
71-
public IEnumerable<InProcessDiagnoserRouter> GetInProcessDiagnoserRouters(BenchmarkCase benchmarkCase)
72-
=> inProcessDiagnosers
73-
.Select((d, i) => new InProcessDiagnoserRouter()
74-
{
75-
index = i,
76-
runMode = d.GetRunMode(benchmarkCase),
77-
handler = d.GetSameProcessHandler(benchmarkCase)
78-
})
79-
.Where(r => r.handler != null);
66+
public IReadOnlyList<IInProcessDiagnoser> InProcessDiagnosers { get; } = inProcessDiagnosers;
8067

8168
public void DeserializeResults(int index, BenchmarkCase benchmarkCase, string results)
82-
=> inProcessDiagnosers[index].DeserializeResults(benchmarkCase, results);
83-
84-
private static string? ToSourceCode(IInProcessDiagnoser diagnoser, BenchmarkCase benchmarkCase, int index)
85-
{
86-
var (handlerType, serializedConfig) = diagnoser.GetSeparateProcessHandlerTypeAndSerializedConfig(benchmarkCase);
87-
if (handlerType is null)
88-
{
89-
return null;
90-
}
91-
string routerType = typeof(InProcessDiagnoserRouter).GetCorrectCSharpTypeName();
92-
return $$"""
93-
new {{routerType}}() {
94-
{{nameof(InProcessDiagnoserRouter.handler)}} = {{routerType}}.{{nameof(InProcessDiagnoserRouter.Init)}}(new {{handlerType.GetCorrectCSharpTypeName()}}(), {{SourceCodeHelper.ToSourceCode(serializedConfig)}}),
95-
{{nameof(InProcessDiagnoserRouter.index)}} = {{index}},
96-
{{nameof(InProcessDiagnoserRouter.runMode)}} = {{SourceCodeHelper.ToSourceCode(diagnoser.GetRunMode(benchmarkCase))}}
97-
}
98-
""";
99-
}
69+
=> InProcessDiagnosers[index].DeserializeResults(benchmarkCase, results);
10070
}
10171

10272
[UsedImplicitly]

src/BenchmarkDotNet/Templates/BenchmarkType.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
BenchmarkDotNet.Diagnosers.CompositeInProcessDiagnoserHandler compositeInProcessDiagnoserHandler = new BenchmarkDotNet.Diagnosers.CompositeInProcessDiagnoserHandler(
2525
new BenchmarkDotNet.Diagnosers.InProcessDiagnoserRouter[] {
26-
$InProcessDiagnosers$
26+
$InProcessDiagnoserRouters$
2727
},
2828
host,
2929
diagnoserRunMode,

src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Runnable/RunnableReuse.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,15 @@ public static (Job, EngineParameters, IEngineFactory) PrepareForRun<T>(T instanc
2929
return (null, null, null);
3030

3131
var compositeInProcessDiagnoserHandler = new CompositeInProcessDiagnoserHandler(
32-
[..parameters.CompositeInProcessDiagnoser.GetInProcessDiagnoserRouters(benchmarkCase)],
32+
parameters.CompositeInProcessDiagnoser.InProcessDiagnosers
33+
.Select((d, i) => new InProcessDiagnoserRouter()
34+
{
35+
index = i,
36+
runMode = d.GetRunMode(benchmarkCase),
37+
handler = d.GetSameProcessHandler(benchmarkCase)
38+
})
39+
.Where(r => r.handler != null)
40+
.ToArray(),
3341
host,
3442
parameters.DiagnoserRunMode,
3543
new InProcessDiagnoserActionArgs(instance)

src/BenchmarkDotNet/Toolchains/InProcess/NoEmit/InProcessNoEmitRunner.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
3+
using System.Linq;
34
using System.Reflection;
45
using BenchmarkDotNet.Engines;
56
using BenchmarkDotNet.Environments;
@@ -132,7 +133,15 @@ public static void RunCore(IHost host, ExecuteParameters parameters)
132133
host.WriteLine();
133134

134135
var compositeInProcessDiagnoserHandler = new Diagnosers.CompositeInProcessDiagnoserHandler(
135-
[..parameters.CompositeInProcessDiagnoser.GetInProcessDiagnoserRouters(benchmarkCase)],
136+
[..parameters.CompositeInProcessDiagnoser.InProcessDiagnosers
137+
.Select((d, i) => new Diagnosers.InProcessDiagnoserRouter()
138+
{
139+
index = i,
140+
runMode = d.GetRunMode(benchmarkCase),
141+
handler = d.GetSameProcessHandler(benchmarkCase)
142+
})
143+
.Where(r => r.handler != null)
144+
.ToArray()],
136145
host,
137146
parameters.DiagnoserRunMode,
138147
new Diagnosers.InProcessDiagnoserActionArgs(instance)

0 commit comments

Comments
 (0)