File: BackEnd\BuildManager\GlobalPropertiesLookup.cs
Web Access
Project: ..\..\..\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;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Build.Collections;
 
namespace Microsoft.Build.Execution
{
    internal class GlobalPropertiesLookup : IReadOnlyDictionary<string, string?>
    {
        internal static IReadOnlyDictionary<string, string?> ToGlobalPropertiesLookup(
            PropertyDictionary<ProjectPropertyInstance>? backing)
        {
            if (backing == null)
            {
                return ImmutableDictionary<string, string?>.Empty;
            }
 
            return new GlobalPropertiesLookup(backing);
        }
 
        private GlobalPropertiesLookup(IDictionary<string, ProjectPropertyInstance> backingProperties)
        {
            _backingProperties = backingProperties;
        }
 
        private readonly IDictionary<string, ProjectPropertyInstance> _backingProperties;
 
        public IEnumerator<KeyValuePair<string, string?>> GetEnumerator()
            => _backingProperties
                .Select(p => new KeyValuePair<string, string?>(p.Key, ExtractEscapedValue(p.Value)))
                .GetEnumerator();
 
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
 
        public int Count => _backingProperties.Count;
        public bool ContainsKey(string key) => _backingProperties.ContainsKey(key);
 
        public bool TryGetValue(string key, out string? value)
        {
            if (_backingProperties.TryGetValue(key, out var property))
            {
                value = ExtractEscapedValue(property);
                return true;
            }
 
            value = null;
            return false;
        }
 
        public string? this[string key] => ExtractEscapedValue(_backingProperties[key]);
 
        public IEnumerable<string> Keys => _backingProperties.Keys;
        public IEnumerable<string?> Values => _backingProperties.Values.Select(ExtractEscapedValue);
 
        private static string? ExtractEscapedValue(ProjectPropertyInstance property) => ((IValued)property).EscapedValue;
    }
}