diff --git a/src/Shared/LanguageParser/CSharptokenEnumerator.cs b/src/Shared/LanguageParser/CSharptokenEnumerator.cs index c9937439716..e74bf5bf9a4 100644 --- a/src/Shared/LanguageParser/CSharptokenEnumerator.cs +++ b/src/Shared/LanguageParser/CSharptokenEnumerator.cs @@ -300,6 +300,7 @@ internal override bool FindNextToken() "is", "lock", "long", "namespace", "new", "object", "operator", "out", "override", "params", "private", "protected", "public", "readonly", + "record", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", "struct", "switch", "this", "throw", "try", diff --git a/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs b/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs index ffcc07f3f19..3771e410c0b 100644 --- a/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs +++ b/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs @@ -404,6 +404,18 @@ public void Regress_Mutation_SingleLineCommentsShouldBeIgnored(string fileConten AssertParse(fileContents, "n2.c"); } + [Theory] + [InlineData("namespace MyNamespace { record MyRecord(string Name); }", "MyNamespace.MyRecord")] + [InlineData("namespace MyNamespace; record MyRecord(string Name);", "MyNamespace.MyRecord")] + [InlineData("record MyRecord(string Name);", "MyRecord")] + [InlineData("namespace MyNamespace { public sealed record MyRecord { } }", "MyNamespace.MyRecord")] + [InlineData("namespace MyNamespace { public record class MyRecord { } }", "MyNamespace.MyRecord")] + [InlineData("namespace MyNamespace { record MyRecord(string Name); public static class Extensions { } }", "MyNamespace.MyRecord")] + public void RecordTypeResolution(string fileContents, string expected) + { + AssertParse(fileContents, expected); + } + /* * Method: AssertParse * diff --git a/src/Tasks/CSharpParserUtilities.cs b/src/Tasks/CSharpParserUtilities.cs index 22ce44a2e8d..4ec7c603521 100644 --- a/src/Tasks/CSharpParserUtilities.cs +++ b/src/Tasks/CSharpParserUtilities.cs @@ -58,7 +58,7 @@ private static ExtractedClassName Extract(CSharpTokenizer tokens) result.IsInsideConditionalBlock = true; } } - else if (t.InnerText == "class") + else if (t.InnerText == "class" || t.InnerText == "record") { state.ResolvingClass = true; if (state.InsideConditionalDirective)