File: BoundTree\BoundPattern.cs
Web Access
Project: src\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp)
// 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.Diagnostics;
using Microsoft.CodeAnalysis.CSharp.Symbols;
 
namespace Microsoft.CodeAnalysis.CSharp
{
    internal partial class BoundPattern
    {
        /// <summary>
        /// Sets <paramref name="innerPattern"/> to the inner pattern after stripping off outer
        /// <see cref="BoundNegatedPattern"/>s, and returns true if the original pattern is a
        /// negated form of the inner pattern.
        /// </summary>
        internal bool IsNegated(out BoundPattern innerPattern)
        {
            innerPattern = this;
            bool negated = false;
 
            if (innerPattern is BoundNegatedPattern { IsUnionMatching: true })
            {
                // This node doesn't represent a negation at the top level, it really represents a negation
                // in a property sub-pattern. Therefore, doing a semantically equivalent unwrapping for such
                // BoundNegatedPattern isn't trivial since we need to preserve the "union matching" piece stored
                // in the node, probably by rewriting innerPattern.Negated.
                // Bottom line, this will not be a trivial unwrapping. Since the unwrapping is not necessary for
                // correctness, we simply don't do it.
                return negated;
            }
 
            while (innerPattern is BoundNegatedPattern negatedPattern)
            {
                Debug.Assert(!negatedPattern.IsUnionMatching);
                negated = !negated;
                innerPattern = negatedPattern.Negated;
            }
            return negated;
        }
 
        public virtual bool IsUnionMatching => false;
 
        private partial void Validate()
        {
            Debug.Assert(!IsUnionMatching || InputType is { IsSubjectForUnionMatching: true });
        }
    }
}