Skip to content

Commit b2e660e

Browse files
committed
Replace (most) concatenation and interpolation (in shipped code) with String.Format
1 parent 2267dc0 commit b2e660e

File tree

85 files changed

+985
-415
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+985
-415
lines changed

.editorconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,10 @@ dotnet_naming_style.begins_with_i.required_prefix = I
213213
dotnet_naming_style.begins_with_i.required_suffix =
214214
dotnet_naming_style.begins_with_i.word_separator =
215215
dotnet_naming_style.begins_with_i.capitalization = pascal_case
216+
217+
#### Code quality rules ####
218+
219+
# Analyzer severity
220+
221+
dotnet_diagnostic.CA1304.severity = error # Specify CultureInfo
222+
dotnet_diagnostic.CA1305.severity = error # Specify IFormatProvider

src/Directory.Build.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
<ContinuousIntegrationBuild Condition=" '$(GITHUB_ACTIONS)' == 'true' ">true</ContinuousIntegrationBuild>
77
<DebugType>embedded</DebugType>
88
<EmbedUntrackedSources>true</EmbedUntrackedSources>
9+
<EnableNETAnalyzers>true</EnableNETAnalyzers>
10+
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
911
<GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
1012
<GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
1113
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>

src/common/AssemblyExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#if NETFRAMEWORK || NETCOREAPP || NETSTANDARD2_0
22

33
using System;
4+
using System.Globalization;
45
using System.IO;
56
using System.Reflection;
67

@@ -19,7 +20,7 @@ public static string GetLocalCodeBase(string codeBase, char directorySeparator)
1920
return null;
2021

2122
if (!codeBase.StartsWith("file://", StringComparison.Ordinal))
22-
throw new ArgumentException($"Codebase '{codeBase}' is unsupported; must start with 'file://'.", nameof(codeBase));
23+
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Codebase '{0}' is unsupported; must start with 'file://'.", codeBase), nameof(codeBase));
2324

2425
// "file:///path" is a local path; "file://machine/path" is a UNC
2526
var localFile = codeBase.Length > 7 && codeBase[7] == '/';
@@ -30,7 +31,7 @@ public static string GetLocalCodeBase(string codeBase, char directorySeparator)
3031
if (localFile)
3132
return codeBase.Substring(7);
3233

33-
throw new ArgumentException($"UNC-style codebase '{codeBase}' is not supported on POSIX-style file systems.", nameof(codeBase));
34+
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "UNC-style codebase '{0}' is not supported on POSIX-style file systems.", codeBase), nameof(codeBase));
3435
}
3536

3637
// Windows-style directories
@@ -44,7 +45,7 @@ public static string GetLocalCodeBase(string codeBase, char directorySeparator)
4445
return codeBase.Substring(5);
4546
}
4647

47-
throw new ArgumentException($"Unknown directory separator '{directorySeparator}'; must be one of '/' or '\\'.", nameof(directorySeparator));
48+
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Unknown directory separator '{0}'; must be one of '/' or '\\'.", directorySeparator), nameof(directorySeparator));
4849
}
4950
}
5051

src/common/AssemblyResolution/AssemblyHelper_Desktop.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ Assembly LoadAssembly(AssemblyName assemblyName)
5555
if (internalDiagnosticsMessageSink != null)
5656
{
5757
if (result == null)
58-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[AssemblyHelper_Desktop.LoadAssembly] Resolution for '{assemblyName.Name}' failed, passed down to next resolver"));
58+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[AssemblyHelper_Desktop.LoadAssembly] Resolution for '{0}' failed, passed down to next resolver", assemblyName.Name));
5959
else
60-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[AssemblyHelper_Desktop.LoadAssembly] Resolved '{assemblyName.Name}' to '{resolvedAssemblyPath}'"));
60+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[AssemblyHelper_Desktop.LoadAssembly] Resolved '{0}' to '{1}'", assemblyName.Name, resolvedAssemblyPath));
6161
}
6262

6363
lookupCache[assemblyName.Name] = result;

src/common/AssemblyResolution/AssemblyHelper_NetCoreApp.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,23 @@ public AssemblyHelper(string assemblyFileName, IMessageSink internalDiagnosticsM
3030
if (!File.Exists(assemblyFileName))
3131
{
3232
if (internalDiagnosticsMessageSink != null)
33-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[AssemblyHelper_NetCoreApp..ctor] Assembly file not found: '{assemblyFileName}'"));
33+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[AssemblyHelper_NetCoreApp..ctor] Assembly file not found: '{0}'", assemblyFileName));
3434
return;
3535
}
3636

3737
var assembly = LoadFromAssemblyPath(assemblyFileName);
3838
if (assembly == null)
3939
{
4040
if (internalDiagnosticsMessageSink != null)
41-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[AssemblyHelper_NetCoreApp..ctor] Assembly file could not be loaded: '{assemblyFileName}'"));
41+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[AssemblyHelper_NetCoreApp..ctor] Assembly file could not be loaded: '{0}'", assemblyFileName));
4242
return;
4343
}
4444

4545
var dependencyContext = DependencyContext.Load(assembly);
4646
if (dependencyContext == null)
4747
{
4848
if (internalDiagnosticsMessageSink != null)
49-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[AssemblyHelper_NetCoreApp..ctor] Assembly file does not contain dependency manifest: '{assemblyFileName}'"));
49+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[AssemblyHelper_NetCoreApp..ctor] Assembly file does not contain dependency manifest: '{0}'", assemblyFileName));
5050
return;
5151
}
5252

src/common/AssemblyResolution/DependencyContextAssemblyCache.cs

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
using System;
44
using System.Collections.Generic;
5+
using System.Globalization;
56
using System.IO;
67
using System.Linq;
78
using System.Reflection;
@@ -52,12 +53,22 @@ public DependencyContextAssemblyCache(string assemblyFolder,
5253
assemblyResolver = new XunitPackageCompilationAssemblyResolver(internalDiagnosticsMessageSink, fileSystem);
5354

5455
if (internalDiagnosticsMessageSink != null)
55-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache..ctor] Runtime graph: [{string.Join(",", dependencyContext.RuntimeGraph.Select(x => $"'{x.Runtime}'"))}]"));
56+
internalDiagnosticsMessageSink.OnMessage(
57+
new _DiagnosticMessage(
58+
"[DependencyContextAssemblyCache..ctor] Runtime graph: [{0}]",
59+
string.Join(",", dependencyContext.RuntimeGraph.Select(x => string.Format(CultureInfo.CurrentCulture, "'{0}'", x.Runtime)))
60+
)
61+
);
5662

5763
var compatibleRuntimes = GetCompatibleRuntimes(dependencyContext);
5864

5965
if (internalDiagnosticsMessageSink != null)
60-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache..ctor] Compatible runtimes: [{string.Join(",", compatibleRuntimes.Select(x => $"'{x}'"))}]"));
66+
internalDiagnosticsMessageSink.OnMessage(
67+
new _DiagnosticMessage(
68+
"[DependencyContextAssemblyCache..ctor] Compatible runtimes: [{0}]",
69+
string.Join(",", compatibleRuntimes.Select(x => string.Format(CultureInfo.CurrentCulture, "'{0}'", x)))
70+
)
71+
);
6172

6273
managedAssemblyCache = new Dictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase);
6374
managedAssemblyMap =
@@ -71,7 +82,12 @@ public DependencyContextAssemblyCache(string assemblyFolder,
7182
.ToDictionaryIgnoringDuplicateKeys(tuple => tuple.Item1, tuple => tuple.Item2, StringComparer.OrdinalIgnoreCase);
7283

7384
if (internalDiagnosticsMessageSink != null)
74-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache..ctor] Managed assembly map: [{string.Join(",", managedAssemblyMap.Keys.Select(k => $"'{k}'").OrderBy(k => k, StringComparer.OrdinalIgnoreCase))}]"));
85+
internalDiagnosticsMessageSink.OnMessage(
86+
new _DiagnosticMessage(
87+
"[DependencyContextAssemblyCache..ctor] Managed assembly map: [{0}]",
88+
string.Join(",", managedAssemblyMap.Keys.Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)).OrderBy(k => k, StringComparer.OrdinalIgnoreCase))
89+
)
90+
);
7591

7692
unmanagedDllFormats = GetUnmanagedDllFormats().ToArray();
7793
unmanagedAssemblyCache = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@@ -85,7 +101,12 @@ public DependencyContextAssemblyCache(string assemblyFolder,
85101
.ToDictionaryIgnoringDuplicateKeys(tuple => tuple.Item1, tuple => tuple.Item2, StringComparer.OrdinalIgnoreCase);
86102

87103
if (internalDiagnosticsMessageSink != null)
88-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache..ctor] Unmanaged assembly map: [{string.Join(",", unmanagedAssemblyMap.Keys.Select(k => $"'{k}'").OrderBy(k => k, StringComparer.OrdinalIgnoreCase))}]"));
104+
internalDiagnosticsMessageSink.OnMessage(
105+
new _DiagnosticMessage(
106+
"[DependencyContextAssemblyCache..ctor] Unmanaged assembly map: [{0}]",
107+
string.Join(",", unmanagedAssemblyMap.Keys.Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)).OrderBy(k => k, StringComparer.OrdinalIgnoreCase))
108+
)
109+
);
89110
}
90111

91112
List<string> GetCompatibleRuntimes(DependencyContext dependencyContext)
@@ -128,7 +149,7 @@ string GetFallbackRuntime(string runtime)
128149
}
129150

130151
if (internalDiagnosticsMessageSink != null)
131-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.GetFallbackRuntime] Could not find runtime '{runtime}', falling back to '{result}'"));
152+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.GetFallbackRuntime] Could not find runtime '{0}', falling back to '{1}'", runtime, result));
132153

133154
return result;
134155
}
@@ -165,9 +186,9 @@ public Assembly LoadManagedDll(string assemblyName, Func<string, Assembly> manag
165186
if (internalDiagnosticsMessageSink != null)
166187
{
167188
if (result == null)
168-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.LoadManagedDll] Resolution for '{assemblyName}' failed, passed down to next resolver"));
189+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.LoadManagedDll] Resolution for '{0}' failed, passed down to next resolver", assemblyName));
169190
else
170-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.LoadManagedDll] Resolved '{assemblyName}' to '{resolvedAssemblyPath}'"));
191+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.LoadManagedDll] Resolved '{0}' to '{1}'", assemblyName, resolvedAssemblyPath));
171192
}
172193
}
173194

@@ -191,13 +212,13 @@ public IntPtr LoadUnmanagedLibrary(string unmanagedLibraryName, Func<string, Int
191212

192213
if (needDiagnostics && internalDiagnosticsMessageSink != null)
193214
if (result != default)
194-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolved '{unmanagedLibraryName}' to '{resolvedAssemblyPath}'"));
215+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolved '{0}' to '{1}'", unmanagedLibraryName, resolvedAssemblyPath));
195216
else
196217
{
197218
if (resolvedAssemblyPath != null)
198-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolving '{unmanagedLibraryName}', found assembly path '{resolvedAssemblyPath}' but the assembly would not load"));
219+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolving '{0}', found assembly path '{1}' but the assembly would not load", unmanagedLibraryName, resolvedAssemblyPath));
199220

200-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolution for '{unmanagedLibraryName}' failed, passed down to next resolver"));
221+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.LoadUnmanagedLibrary] Resolution for '{0}' failed, passed down to next resolver", unmanagedLibraryName));
201222
}
202223

203224
return result;
@@ -243,18 +264,30 @@ Tuple<string, Assembly> ResolveManagedAssembly(string assemblyName, Func<string,
243264
return Tuple.Create(resolvedAssemblyPath, assembly);
244265

245266
if (internalDiagnosticsMessageSink != null)
246-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found assembly path '{resolvedAssemblyPath}' but the assembly would not load"));
267+
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage("[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{0}', found assembly path '{1}' but the assembly would not load", assemblyName, resolvedAssemblyPath));
247268
}
248269
else
249270
{
250271
if (internalDiagnosticsMessageSink != null)
251-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found a resolved path, but could not map a filename in [{string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]"));
272+
internalDiagnosticsMessageSink.OnMessage(
273+
new _DiagnosticMessage(
274+
"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{0}', found a resolved path, but could not map a filename in [{1}]",
275+
assemblyName,
276+
string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)))
277+
)
278+
);
252279
}
253280
}
254281
else
255282
{
256283
if (internalDiagnosticsMessageSink != null)
257-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found in dependency map, but unable to resolve a path in [{string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]"));
284+
internalDiagnosticsMessageSink.OnMessage(
285+
new _DiagnosticMessage(
286+
"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{0}', found in dependency map, but unable to resolve a path in [{1}]",
287+
assemblyName,
288+
string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)))
289+
)
290+
);
258291
}
259292
}
260293

@@ -265,7 +298,7 @@ public string ResolveUnmanagedLibrary(string unmanagedLibraryName)
265298
{
266299
foreach (var format in unmanagedDllFormats)
267300
{
268-
var formattedUnmanagedDllName = string.Format(format, unmanagedLibraryName);
301+
var formattedUnmanagedDllName = string.Format(CultureInfo.InvariantCulture, format, unmanagedLibraryName);
269302

270303
if (unmanagedAssemblyMap.TryGetValue(formattedUnmanagedDllName, out var libraryTuple))
271304
{
@@ -281,12 +314,22 @@ public string ResolveUnmanagedLibrary(string unmanagedLibraryName)
281314
return Path.GetFullPath(resolvedAssemblyPath);
282315

283316
if (internalDiagnosticsMessageSink != null)
284-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveUnmanagedLibrary] Found a resolved path, but could not map a filename in [{string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]"));
317+
internalDiagnosticsMessageSink.OnMessage(
318+
new _DiagnosticMessage(
319+
"[DependencyContextAssemblyCache.ResolveUnmanagedLibrary] Found a resolved path, but could not map a filename in [{0}]",
320+
string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)))
321+
)
322+
);
285323
}
286324
else
287325
{
288326
if (internalDiagnosticsMessageSink != null)
289-
internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveUnmanagedLibrary] Found in dependency map, but unable to resolve a path in [{string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]"));
327+
internalDiagnosticsMessageSink.OnMessage(
328+
new _DiagnosticMessage(
329+
"[DependencyContextAssemblyCache.ResolveUnmanagedLibrary] Found in dependency map, but unable to resolve a path in [{0}]",
330+
string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => string.Format(CultureInfo.CurrentCulture, "'{0}'", k)))
331+
)
332+
);
290333
}
291334
}
292335
}

src/common/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions/RuntimeEnvironment.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#if NETFRAMEWORK || NETCOREAPP
55

66
using System;
7+
using System.Globalization;
78
using Internal.Microsoft.DotNet.PlatformAbstractions.Native;
89

910
namespace Internal.Microsoft.DotNet.PlatformAbstractions
@@ -88,7 +89,7 @@ private static string GetWindowsProductVersion()
8889
else if (ver.Major >= 10)
8990
{
9091
// Return the major version for use in RID computation without applying any cap.
91-
return ver.Major.ToString();
92+
return ver.Major.ToString(CultureInfo.InvariantCulture);
9293
}
9394
return string.Empty; // Unknown version
9495
}

0 commit comments

Comments
 (0)