From 46efc78e925ddfc5f566cf61b4350fea711a68f3 Mon Sep 17 00:00:00 2001 From: Jan Jones Date: Wed, 1 Oct 2025 12:03:10 +0200 Subject: [PATCH 1/2] Allow empty file-level directive values --- .../Run/VirtualProjectBuildingCommand.cs | 12 ++++- .../Convert/DotnetProjectConvertTests.cs | 44 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs index 6997b8052a0c..a8105509dd52 100644 --- a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs +++ b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs @@ -1738,12 +1738,20 @@ private static (string, string?)? ParseOptionalTwoParts(in ParseContext context, return context.Diagnostics.AddError<(string, string?)?>(context.SourceFile, context.Info.Span, string.Format(CliCommandStrings.InvalidDirectiveName, directiveKind, separator)); } - var secondPart = i < 0 ? [] : context.DirectiveText.AsSpan((i + 1)..).TrimStart(); - if (i < 0 || secondPart.IsWhiteSpace()) + if (i < 0) { return (firstPart.ToString(), null); } + var secondPart = context.DirectiveText.AsSpan((i + 1)..).TrimStart(); + if (secondPart.IsWhiteSpace()) + { + Debug.Assert(secondPart.Length == 0, + "We have trimmed the second part, so if it's white space, it should be actually empty."); + + return (firstPart.ToString(), string.Empty); + } + return (firstPart.ToString(), secondPart.ToString()); } diff --git a/test/dotnet.Tests/CommandTests/Project/Convert/DotnetProjectConvertTests.cs b/test/dotnet.Tests/CommandTests/Project/Convert/DotnetProjectConvertTests.cs index 27bf71fa48dc..faaba8746189 100644 --- a/test/dotnet.Tests/CommandTests/Project/Convert/DotnetProjectConvertTests.cs +++ b/test/dotnet.Tests/CommandTests/Project/Convert/DotnetProjectConvertTests.cs @@ -889,6 +889,50 @@ public void Directives_EmptyName( expectedWildcardPattern: RunFileTests.DirectiveError("/app/Program.cs", 1, CliCommandStrings.MissingDirectiveName, directive)); } + [Theory] + [InlineData("")] + [InlineData(" ")] + public void Directives_EmptyValue(string value) + { + VerifyConversion( + inputCSharp: $""" + #:property TargetFramework={value} + #:property Prop1={value} + #:sdk First@{value} + #:sdk Second@{value} + #:package P1@{value} + """, + expectedProject: """ + + + + + + Exe + enable + enable + true + true + + + + + + + + + + + """, + expectedCSharp: ""); + + VerifyConversionThrows( + inputCSharp: $""" + #:project{value} + """, + expectedWildcardPattern: RunFileTests.DirectiveError("/app/Program.cs", 1, CliCommandStrings.MissingDirectiveName, "project")); + } + [Fact] public void Directives_MissingPropertyValue() { From 9635141863099c23647e4596f0ffd7942a6e4cb7 Mon Sep 17 00:00:00 2001 From: Jan Jones Date: Tue, 7 Oct 2025 10:55:36 +0200 Subject: [PATCH 2/2] Clarify separator index variable name --- .../dotnet/Commands/Run/VirtualProjectBuildingCommand.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs index a8105509dd52..3efd5305ae2a 100644 --- a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs +++ b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs @@ -1723,8 +1723,8 @@ public readonly struct ParseContext private static (string, string?)? ParseOptionalTwoParts(in ParseContext context, char separator) { - var i = context.DirectiveText.IndexOf(separator, StringComparison.Ordinal); - var firstPart = (i < 0 ? context.DirectiveText : context.DirectiveText.AsSpan(..i)).TrimEnd(); + var separatorIndex = context.DirectiveText.IndexOf(separator, StringComparison.Ordinal); + var firstPart = (separatorIndex < 0 ? context.DirectiveText : context.DirectiveText.AsSpan(..separatorIndex)).TrimEnd(); string directiveKind = context.DirectiveKind; if (firstPart.IsWhiteSpace()) @@ -1738,12 +1738,12 @@ private static (string, string?)? ParseOptionalTwoParts(in ParseContext context, return context.Diagnostics.AddError<(string, string?)?>(context.SourceFile, context.Info.Span, string.Format(CliCommandStrings.InvalidDirectiveName, directiveKind, separator)); } - if (i < 0) + if (separatorIndex < 0) { return (firstPart.ToString(), null); } - var secondPart = context.DirectiveText.AsSpan((i + 1)..).TrimStart(); + var secondPart = context.DirectiveText.AsSpan((separatorIndex + 1)..).TrimStart(); if (secondPart.IsWhiteSpace()) { Debug.Assert(secondPart.Length == 0,