File: Language\RequiredAttributeDescriptor.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.CodeAnalysis.Razor.Compiler\src\Microsoft.CodeAnalysis.Razor.Compiler.csproj (Microsoft.CodeAnalysis.Razor.Compiler)
// 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.Immutable;
using System.Diagnostics;
using Microsoft.AspNetCore.Razor.Utilities;
 
namespace Microsoft.AspNetCore.Razor.Language;
 
public sealed class RequiredAttributeDescriptor : TagHelperObject<RequiredAttributeDescriptor>
{
    private readonly RequiredAttributeDescriptorFlags _flags;
    private TagMatchingRuleDescriptor? _parent;
    private string? _displayName;
 
    internal RequiredAttributeDescriptorFlags Flags => _flags;
 
    public string Name { get; }
    public RequiredAttributeNameComparison NameComparison { get; }
    public string? Value { get; }
    public RequiredAttributeValueComparison ValueComparison { get; }
    public string DisplayName => _displayName ??= GetDisplayName(Name, NameComparison);
 
    public bool CaseSensitive => _flags.IsFlagSet(RequiredAttributeDescriptorFlags.CaseSensitive);
    public bool IsDirectiveAttribute => _flags.IsFlagSet(RequiredAttributeDescriptorFlags.IsDirectiveAttribute);
 
    internal RequiredAttributeDescriptor(
        RequiredAttributeDescriptorFlags flags,
        string name,
        RequiredAttributeNameComparison nameComparison,
        string? value,
        RequiredAttributeValueComparison valueComparison,
        ImmutableArray<RazorDiagnostic> diagnostics)
        : base(diagnostics)
    {
        _flags = flags;
        Name = name;
        NameComparison = nameComparison;
        Value = value;
        ValueComparison = valueComparison;
    }
 
    private protected override void BuildChecksum(in Checksum.Builder builder)
    {
        builder.Append((int)Flags);
        builder.Append(Name);
        builder.Append((int)NameComparison);
        builder.Append(Value);
        builder.Append((int)ValueComparison);
    }
 
    public TagMatchingRuleDescriptor Parent
        => _parent ?? ThrowHelper.ThrowInvalidOperationException<TagMatchingRuleDescriptor>(Resources.Parent_has_not_been_set);
 
    internal void SetParent(TagMatchingRuleDescriptor parent)
    {
        Debug.Assert(parent != null);
        Debug.Assert(_parent == null);
 
        _parent = parent;
    }
 
    public override string ToString()
    {
        return DisplayName;
    }
 
    internal static string GetDisplayName(string name, RequiredAttributeNameComparison nameComparison)
        => nameComparison == RequiredAttributeNameComparison.PrefixMatch
        ? name + "..."
        : name;
}