File: Internal\GrammarBuilding\RuleRefElement.cs
Web Access
Project: src\src\runtime\src\libraries\System.Speech\src\System.Speech.csproj (System.Speech)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Speech.Internal.SrgsParser;

namespace System.Speech.Internal.GrammarBuilding
{
    [DebuggerDisplay("{DebugSummary}")]
    internal sealed class RuleRefElement : GrammarBuilderBase
    {
        #region Constructors

        internal RuleRefElement(RuleElement rule)
        {
            _rule = rule;
        }

        internal RuleRefElement(RuleElement rule, string? semanticKey)
        {
            _rule = rule;
            _semanticKey = semanticKey;
        }

        #endregion

        #region Public Methods
        public override bool Equals([NotNullWhen(true)] object? obj)
        {
            if (obj is not RuleRefElement refObj)
            {
                return false;
            }

            return _semanticKey == refObj._semanticKey && _rule.Equals(refObj._rule);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        #endregion

        #region Internal Methods

        internal void Add(GrammarBuilderBase item)
        {
            _rule.Add(item);
        }

        internal override GrammarBuilderBase Clone()
        {
            return new RuleRefElement(_rule, _semanticKey);
        }

        internal void CloneItems(RuleRefElement builders)
        {
            _rule.CloneItems(builders._rule);
        }

        internal override IElement CreateElement(IElementFactory elementFactory, IElement parent, IRule? rule, IdentifierCollection ruleIds)
        {
            // Create the new rule and add the reference to the item
            return elementFactory.CreateRuleRef(parent, new Uri("#" + Rule.RuleName, UriKind.Relative), _semanticKey, null);
        }

        #endregion

        #region Internal Properties

        internal RuleElement Rule
        {
            get
            {
                return _rule;
            }
        }

        internal override string DebugSummary
        {
            get
            {
                return "#" + Rule.Name + (_semanticKey != null ? ":" + _semanticKey : "");
            }
        }

        #endregion

        #region Private Fields

        private readonly RuleElement _rule;
        private readonly string? _semanticKey;

        #endregion
    }
}