diff --git a/src/BuiltInTools/dotnet-watch/CommandLine/CommandLineOptions.cs b/src/BuiltInTools/dotnet-watch/CommandLine/CommandLineOptions.cs index 85ecb916213e..fcdcf705378d 100644 --- a/src/BuiltInTools/dotnet-watch/CommandLine/CommandLineOptions.cs +++ b/src/BuiltInTools/dotnet-watch/CommandLine/CommandLineOptions.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Collections.Immutable; using System.CommandLine; using System.CommandLine.Parsing; using System.Data; @@ -17,8 +16,6 @@ internal sealed class CommandLineOptions { public const string DefaultCommand = "run"; - private static readonly ImmutableArray s_binaryLogOptionNames = ["-bl", "/bl", "-binaryLogger", "--binaryLogger", "/binaryLogger"]; - public bool List { get; init; } public required GlobalOptions GlobalOptions { get; init; } @@ -157,17 +154,14 @@ internal sealed class CommandLineOptions } } - var commandArguments = GetCommandArguments(parseResult, watchOptions, explicitCommand, out var binLogToken, out var binLogPath); + var commandArguments = GetCommandArguments(parseResult, watchOptions, explicitCommand); // We assume that forwarded options, if any, are intended for dotnet build. var buildArguments = buildOptions.Select(option => ((IForwardedOption)option).GetForwardingFunction()(parseResult)).SelectMany(args => args).ToList(); - if (binLogToken != null) - { - buildArguments.Add(binLogToken); - } - var targetFrameworkOption = (Option?)buildOptions.SingleOrDefault(option => option.Name == "--framework"); + var binaryLoggerOption = (Option?)buildOptions.SingleOrDefault(option => option.Name == "--binaryLogger"); + var binaryLoggerOptions = binaryLoggerOption != null ? parseResult.GetValue(binaryLoggerOption) : null; return new() { @@ -178,7 +172,7 @@ internal sealed class CommandLineOptions NoHotReload = parseResult.GetValue(noHotReloadOption), NonInteractive = parseResult.GetValue(NonInteractiveOption), Verbose = parseResult.GetValue(verboseOption), - BinaryLogPath = ParseBinaryLogFilePath(binLogPath), + BinaryLogPath = GetBinaryLogFilePath(binaryLoggerOptions), }, CommandArguments = commandArguments, @@ -193,35 +187,31 @@ internal sealed class CommandLineOptions } /// - /// Parses the value of msbuild option `-binaryLogger[:[LogFile=]output.binlog[;ProjectImports={None,Embed,ZipFile}]]`. - /// Emulates https://github.com/dotnet/msbuild/blob/7f69ea906c29f2478cc05423484ad185de66e124/src/Build/Logging/BinaryLogger/BinaryLogger.cs#L481. - /// See https://github.com/dotnet/msbuild/issues/12256 + /// Gets the binary log file path from the binary logger options. /// - internal static string? ParseBinaryLogFilePath(string? value) - => value switch + internal static string? GetBinaryLogFilePath(BinaryLoggerParameters? parameters) + { + if (parameters == null) { - null => null, - _ => (from parameter in value.Split(';', StringSplitOptions.RemoveEmptyEntries) - where !string.Equals(parameter, "ProjectImports=None", StringComparison.OrdinalIgnoreCase) && - !string.Equals(parameter, "ProjectImports=Embed", StringComparison.OrdinalIgnoreCase) && - !string.Equals(parameter, "ProjectImports=ZipFile", StringComparison.OrdinalIgnoreCase) && - !string.Equals(parameter, "OmitInitialInfo", StringComparison.OrdinalIgnoreCase) - let path = (parameter.StartsWith("LogFile=", StringComparison.OrdinalIgnoreCase) ? parameter["LogFile=".Length..] : parameter).Trim('"') - let pathWithExtension = path.EndsWith(".binlog", StringComparison.OrdinalIgnoreCase) ? path : $"{path}.binlog" - select pathWithExtension) - .LastOrDefault("msbuild.binlog") - }; + return null; + } + + if (!string.IsNullOrEmpty(parameters.LogFile)) + { + return parameters.LogFile.EndsWith(".binlog", StringComparison.OrdinalIgnoreCase) + ? parameters.LogFile + : $"{parameters.LogFile}.binlog"; + } + + return "msbuild.binlog"; + } private static IReadOnlyList GetCommandArguments( ParseResult parseResult, IReadOnlyList