diff --git a/src/libraries/Microsoft.Extensions.Logging.Abstractions/gen/LoggerMessageGenerator.Parser.cs b/src/libraries/Microsoft.Extensions.Logging.Abstractions/gen/LoggerMessageGenerator.Parser.cs index 6af2a7856ed41e..ba225a38ee27a9 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Abstractions/gen/LoggerMessageGenerator.Parser.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Abstractions/gen/LoggerMessageGenerator.Parser.cs @@ -248,6 +248,13 @@ public IReadOnlyList GetLogClasses(IEnumerable return success; } + /// + /// Validates that templates list does not contains templates with mixed casing like {hello} and {Hello} + /// + /// Value indicating lack of mixed casing within templates list + private static bool ValidateTemplatesCasingConsistency(List templates) + { + int count = templates.Count; + + for (int i = 1; i < count; i++) + { + string templateI = templates[i]; + + for (int j = 0; j < i; j++) + { + string templateJ = templates[j]; + + bool matchIgnoreCase = StringComparer.OrdinalIgnoreCase.Compare(templateI, templateJ) == 0; + bool matchExact = StringComparer.Ordinal.Compare(templateI, templateJ) == 0; + + if (matchIgnoreCase && !matchExact) + { + return false; + } + + } + } + + return true; + } + /// /// Searches for the next brace index in the message. /// diff --git a/src/libraries/Microsoft.Extensions.Logging.Abstractions/tests/Microsoft.Extensions.Logging.Generators.Tests/LoggerMessageGeneratorParserTests.cs b/src/libraries/Microsoft.Extensions.Logging.Abstractions/tests/Microsoft.Extensions.Logging.Generators.Tests/LoggerMessageGeneratorParserTests.cs index 83262d8451e028..7908dcfb47a888 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Abstractions/tests/Microsoft.Extensions.Logging.Generators.Tests/LoggerMessageGeneratorParserTests.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Abstractions/tests/Microsoft.Extensions.Logging.Generators.Tests/LoggerMessageGeneratorParserTests.cs @@ -283,6 +283,21 @@ partial class C Assert.Equal(DiagnosticDescriptors.ShouldntMentionLoggerInMessage.Id, diagnostics[1].Id); } + [Fact] + public async Task MixedCasing() + { + IReadOnlyList diagnostics = await RunGenerator(@" + partial class C + { + [LoggerMessage(EventId = 0, Level = LogLevel.Debug, Message = ""M1 {par1} {PAr1} {a}"")] + static partial void M1(ILogger logger, int par1, int a); + } + "); + + Assert.Single(diagnostics); + Assert.Equal(DiagnosticDescriptors.InconsistentTemplateCasing.Id, diagnostics[0].Id); + } + [Fact] public async Task DoubleLogLevel_InAttributeAndAsParameterButMissingInTemplate_ProducesDiagnostic() {