8
8
using BenchmarkDotNet . Extensions ;
9
9
using BenchmarkDotNet . Jobs ;
10
10
11
+ #nullable enable
12
+
11
13
namespace BenchmarkDotNet . Toolchains
12
14
{
13
15
internal static class AppConfigGenerator
@@ -26,42 +28,56 @@ internal static class AppConfigGenerator
26
28
27
29
internal static void Generate ( Job job , TextReader source , TextWriter destination , IResolver resolver )
28
30
{
29
- using ( var xmlReader = XmlReader . Create ( source ) )
30
- {
31
- var xmlDocument = new XmlDocument ( ) ;
31
+ var xmlDocument = new XmlDocument ( ) ;
32
+
33
+ XmlNode configurationElement ;
32
34
33
- var configurationElement = GetOrCreateConfigurationElement ( xmlDocument , xmlReader ) ;
35
+ if ( source == TextReader . Null )
36
+ {
37
+ // Create a new configuration node.
38
+ configurationElement = xmlDocument . CreateNode ( XmlNodeType . Element , "configuration" , string . Empty ) ;
39
+ xmlDocument . AppendChild ( configurationElement ) ;
40
+ }
41
+ else
42
+ {
43
+ // Try to get configuration node from specified TextReader.
44
+ using var xmlReader = XmlReader . Create ( source ) ;
45
+ configurationElement = GetOrCreateConfigurationElement ( xmlDocument , xmlReader ) ;
46
+ }
34
47
35
- var runtimeElement = GetOrCreateRuntimeElement ( xmlDocument , configurationElement ) ;
48
+ var runtimeElement = GetOrCreateRuntimeElement ( xmlDocument , configurationElement ) ;
36
49
37
- ClearStartupSettingsForCustomClr ( configurationElement , job . Environment . Runtime ) ;
38
- ClearAllRuntimeSettingsThatCanBeSetOnlyByJobConfiguration ( runtimeElement ) ;
50
+ ClearStartupSettingsForCustomClr ( configurationElement , job . Environment . Runtime ) ;
51
+ ClearAllRuntimeSettingsThatCanBeSetOnlyByJobConfiguration ( runtimeElement ) ;
39
52
40
- GenerateJitSettings ( xmlDocument , runtimeElement , job . Environment ) ;
41
- GenerateGCSettings ( xmlDocument , runtimeElement , job . Environment . Gc , resolver ) ;
53
+ GenerateJitSettings ( xmlDocument , runtimeElement , job . Environment ) ;
54
+ GenerateGCSettings ( xmlDocument , runtimeElement , job . Environment . Gc , resolver ) ;
42
55
43
- xmlDocument . Save ( destination ) ;
44
- }
56
+ xmlDocument . Save ( destination ) ;
45
57
}
46
58
47
59
private static XmlNode GetOrCreateConfigurationElement ( XmlDocument xmlDocument , XmlReader xmlReader )
48
60
{
49
61
try
50
62
{
51
63
xmlDocument . Load ( xmlReader ) ;
52
-
53
- return xmlDocument . SelectSingleNode ( "/configuration" ) ;
64
+ var configurationNode = xmlDocument . SelectSingleNode ( "/configuration" ) ;
65
+ if ( configurationNode != null )
66
+ return configurationNode ;
54
67
}
55
- catch // empty document
68
+ catch ( XmlException )
56
69
{
57
- return xmlDocument . AppendChild ( xmlDocument . CreateNode ( XmlNodeType . Element , "configuration" , string . Empty ) ) ;
70
+ // Failed to load XML content.
58
71
}
72
+
73
+ // If the XML is invalid or configuration node is not exists. Create a new configuration element
74
+ return xmlDocument . AppendChild ( xmlDocument . CreateNode ( XmlNodeType . Element , "configuration" , string . Empty ) ) ! ;
59
75
}
60
76
61
77
private static XmlNode GetOrCreateRuntimeElement ( XmlDocument xmlDocument , XmlNode configurationElement )
62
78
{
63
79
return configurationElement . SelectSingleNode ( "runtime" )
64
- ?? configurationElement . AppendChild ( xmlDocument . CreateNode ( XmlNodeType . Element , "runtime" , string . Empty ) ) ;
80
+ ?? configurationElement . AppendChild ( xmlDocument . CreateNode ( XmlNodeType . Element , "runtime" , string . Empty ) ) ! ;
65
81
}
66
82
67
83
private static void ClearAllRuntimeSettingsThatCanBeSetOnlyByJobConfiguration ( XmlNode runtimeElement )
@@ -75,7 +91,7 @@ private static void ClearAllRuntimeSettingsThatCanBeSetOnlyByJobConfiguration(Xm
75
91
}
76
92
}
77
93
78
- private static void ClearStartupSettingsForCustomClr ( XmlNode configurationElement , Runtime runtime )
94
+ private static void ClearStartupSettingsForCustomClr ( XmlNode configurationElement , Runtime ? runtime )
79
95
{
80
96
if ( ! ( runtime is ClrRuntime clrRuntime ) || string . IsNullOrEmpty ( clrRuntime . Version ) )
81
97
return ;
0 commit comments