From 246d3eba3c80f16811bc2f366f2ed3e71f6b803a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 13:10:37 +0000 Subject: [PATCH 1/3] Initial plan From bf5b98716b4795e6b8c572d7ed4c4f6caae31516 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 13:21:17 +0000 Subject: [PATCH 2/3] Recognize C# `record` as a type in CreateCSharpManifestResourceName Agent-Logs-Url: https://github.com/dotnet/msbuild/sessions/5094be19-c00d-4a83-84cb-a703a31a7db8 Co-authored-by: OvesN <150850103+OvesN@users.noreply.github.com> --- src/Shared/LanguageParser/CSharptokenEnumerator.cs | 1 + src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs | 12 ++++++++++++ src/Tasks/CSharpParserUtilities.cs | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) 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..7ef6934de43 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 Record(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) From b751e91e40d8f2e4120ad74626e5c763bb681c8e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 13:21:56 +0000 Subject: [PATCH 3/3] Rename test method to RecordTypeResolution per code review Agent-Logs-Url: https://github.com/dotnet/msbuild/sessions/5094be19-c00d-4a83-84cb-a703a31a7db8 Co-authored-by: OvesN <150850103+OvesN@users.noreply.github.com> --- src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs b/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs index 7ef6934de43..3771e410c0b 100644 --- a/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs +++ b/src/Tasks.UnitTests/CSharpParserUtilitites_Tests.cs @@ -411,7 +411,7 @@ public void Regress_Mutation_SingleLineCommentsShouldBeIgnored(string fileConten [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 Record(string fileContents, string expected) + public void RecordTypeResolution(string fileContents, string expected) { AssertParse(fileContents, expected); }