|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
namespace Roslyn.Utilities
{
internal static class CompilerOptionParseUtilities
{
internal const string CachePathEnvironmentVariable = "ROSLYN_CACHE_PATH";
internal const string UseGlobalCacheFeatureFlag = "use-global-cache";
/// <summary>
/// Parse the value provided to an MSBuild Feature option into a list of entries. This will
/// leave name=value in their raw form.
/// </summary>
public static IList<string> ParseFeatureFromMSBuild(string? features)
{
if (RoslynString.IsNullOrEmpty(features))
{
return new List<string>(capacity: 0);
}
return features.Split(new[] { ';', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
public static void ParseFeatures(IDictionary<string, string> builder, List<string> values)
{
foreach (var commaFeatures in values)
{
foreach (var feature in commaFeatures.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
ParseFeatureCore(builder, feature);
}
}
}
internal static void PrependFeatureFlagFromEnvironment(List<string> arguments, Action<string>? log = null)
{
if (Environment.GetEnvironmentVariable(CachePathEnvironmentVariable) is not { Length: > 0 } cachePath)
{
return;
}
if (cachePath[0] != '"')
{
cachePath = $"\"{cachePath}\"";
}
log?.Invoke($"Normalizing {CachePathEnvironmentVariable} to /features:{UseGlobalCacheFeatureFlag}={cachePath}");
arguments.Insert(0, $"/features:{UseGlobalCacheFeatureFlag}={cachePath}");
}
private static void ParseFeatureCore(IDictionary<string, string> builder, string feature)
{
int equals = feature.IndexOf('=');
if (equals > 0)
{
string name = feature.Substring(0, equals);
string value = feature.Substring(equals + 1).Trim('"');
builder[name] = value;
}
else
{
builder[feature] = "true";
}
}
}
}
|