File: src\tools\illink\src\ILLink.Shared\DataFlow\DictionaryLattice.cs
Web Access
Project: src\src\tools\illink\src\ILLink.RoslynAnalyzer\ILLink.RoslynAnalyzer.csproj (ILLink.RoslynAnalyzer)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System;
 
// This is needed due to NativeAOT which doesn't enable nullable globally yet
#nullable enable
 
namespace ILLink.Shared.DataFlow
{
    // A lattice over dictionaries where the stored values are also from a lattice.
    public readonly struct DictionaryLattice<TKey, TValue, TValueLattice> : ILattice<DefaultValueDictionary<TKey, TValue>>
        where TKey : IEquatable<TKey>
        where TValue : IEquatable<TValue>
        where TValueLattice : ILattice<TValue>
    {
        public readonly TValueLattice ValueLattice;
 
        public DefaultValueDictionary<TKey, TValue> Top { get; }
 
        public DictionaryLattice(TValueLattice valueLattice)
        {
            ValueLattice = valueLattice;
            Top = new DefaultValueDictionary<TKey, TValue>(valueLattice.Top);
        }
 
        public DefaultValueDictionary<TKey, TValue> Meet(DefaultValueDictionary<TKey, TValue> left, DefaultValueDictionary<TKey, TValue> right)
        {
            var met = new DefaultValueDictionary<TKey, TValue>(left);
            foreach (var kvp in right)
            {
                TKey key = kvp.Key;
                TValue rightValue = kvp.Value;
                met.Set(key, ValueLattice.Meet(left.Get(key), rightValue));
            }
            return met;
        }
    }
}