diff --git a/src/TraceParserGen.Tests/ParserGenerationTests.cs b/src/TraceParserGen.Tests/ParserGenerationTests.cs index 7d76117b1..cd185795b 100644 --- a/src/TraceParserGen.Tests/ParserGenerationTests.cs +++ b/src/TraceParserGen.Tests/ParserGenerationTests.cs @@ -911,5 +911,19 @@ public void VersionedEvent_EnumerateTemplatesHasEntryPerVersion() } #endregion + + #region Leading digit provider name tests + + [Fact] + public void LeadingDigitProvider_ClassNamePrefixedWithUnderscore() + { + string content = GenerateParserFromManifest("LeadingDigitProvider.manifest.xml"); + + // Provider "3Scale-ETW-Provider" → ToCSharpName → "_3ScaleETWProvider" + // C# identifiers cannot start with a digit, so an underscore is prepended. + Assert.Contains("public sealed class _3ScaleETWProviderTraceEventParser : TraceEventParser", content); + } + + #endregion } } diff --git a/src/TraceParserGen.Tests/inputs/LeadingDigitProvider.manifest.xml b/src/TraceParserGen.Tests/inputs/LeadingDigitProvider.manifest.xml new file mode 100644 index 000000000..cf76393a8 --- /dev/null +++ b/src/TraceParserGen.Tests/inputs/LeadingDigitProvider.manifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/TraceParserGen/TraceParserGen.cs b/src/TraceParserGen/TraceParserGen.cs index eb266a266..5a99fe329 100644 --- a/src/TraceParserGen/TraceParserGen.cs +++ b/src/TraceParserGen/TraceParserGen.cs @@ -1006,6 +1006,13 @@ public static string ToCSharpName(string input) validName.Append(c); } + + // C# identifiers cannot start with a digit - prefix with underscore if needed. + if (validName.Length > 0 && Char.IsDigit(validName[0])) + { + validName.Insert(0, '_'); + } + return validName.ToString(); }