| File: BackEnd\Components\Caching\ConfigCacheWithOverride.cs | Web Access |
| Project: src\msbuild\src\Build\Microsoft.Build.csproj (Microsoft.Build) |
// 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; using System.Collections.Generic; using Microsoft.Build.BackEnd; #nullable disable namespace Microsoft.Build.Execution { internal class ConfigCacheWithOverride : IConfigCache { private readonly IConfigCache _override; public ConfigCache CurrentCache { get; } public ConfigCacheWithOverride(IConfigCache @override) { _override = @override; CurrentCache = new ConfigCache(); } public void InitializeComponent(IBuildComponentHost host) { CurrentCache.InitializeComponent(host); } public void ShutdownComponent() { CurrentCache.ShutdownComponent(); } public IEnumerator<BuildRequestConfiguration> GetEnumerator() { return CurrentCache.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Translate(ITranslator translator) => Assumed.Unreachable(); public BuildRequestConfiguration this[int configId] { get { if (HasConfigurationInOverrideCache(configId)) { #if DEBUG Assumed.False(CurrentCache.HasConfiguration(configId), "caches should not overlap"); #endif return _override[configId]; } else { return CurrentCache[configId]; } } } public void AddConfiguration(BuildRequestConfiguration config) { CurrentCache.AddConfiguration(config); } public BuildRequestConfiguration GetMatchingConfiguration(BuildRequestConfiguration config) { var overrideConfig = _override.GetMatchingConfiguration(config); if (overrideConfig != null) { #if DEBUG Assumed.Null(CurrentCache.GetMatchingConfiguration(config), "caches should not overlap"); #endif return overrideConfig; } else { return CurrentCache.GetMatchingConfiguration(config); } } public BuildRequestConfiguration GetMatchingConfiguration(ConfigurationMetadata configMetadata) { var overrideConfig = _override.GetMatchingConfiguration(configMetadata); if (overrideConfig != null) { #if DEBUG Assumed.Null(CurrentCache.GetMatchingConfiguration(configMetadata), "caches should not overlap"); #endif return overrideConfig; } else { return CurrentCache.GetMatchingConfiguration(configMetadata); } } public BuildRequestConfiguration GetMatchingConfiguration(ConfigurationMetadata configMetadata, ConfigCreateCallback callback, bool loadProject) { return _override.GetMatchingConfiguration(configMetadata, callback, loadProject) ?? CurrentCache.GetMatchingConfiguration(configMetadata, callback, loadProject); } public bool HasConfiguration(int configId) { bool overrideHasConfiguration = HasConfigurationInOverrideCache(configId); if (overrideHasConfiguration) { #if DEBUG Assumed.False(CurrentCache.HasConfiguration(configId), "caches should not overlap"); #endif return overrideHasConfiguration; } return overrideHasConfiguration || CurrentCache.HasConfiguration(configId); } public bool HasConfigurationInOverrideCache(int configId) { return _override.HasConfiguration(configId); } public void ClearConfigurations() { CurrentCache.ClearConfigurations(); } public List<int> ClearNonExplicitlyLoadedConfigurations() { return CurrentCache.ClearNonExplicitlyLoadedConfigurations(); } public bool IsConfigCacheSizeLargerThanThreshold() { return CurrentCache.IsConfigCacheSizeLargerThanThreshold(); } public bool WriteConfigurationsToDisk() { return CurrentCache.WriteConfigurationsToDisk(); } } }