File: Language\Intermediate\ComponentTypeArgumentIntermediateNode.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.
 
namespace Microsoft.AspNetCore.Razor.Language.Intermediate;
 
public sealed class ComponentTypeArgumentIntermediateNode(
    BoundAttributeDescriptor boundAttribute, CSharpIntermediateToken value) : IntermediateNode
{
    public BoundAttributeDescriptor BoundAttribute { get; } = boundAttribute;
    public TagHelperDescriptor TagHelper => BoundAttribute.Parent;
 
    public string TypeParameterName => BoundAttribute.Name;
 
    public CSharpIntermediateToken Value { get; } = value;
 
    public override IntermediateNodeCollection Children { get; } = [value];
 
    public ComponentTypeArgumentIntermediateNode(TagHelperPropertyIntermediateNode node)
        : this(node.BoundAttribute, GetValue(node))
    {
        Source = node.Source;
        AddDiagnosticsFromNode(node);
    }
 
    private static CSharpIntermediateToken GetValue(TagHelperPropertyIntermediateNode node)
        => node.Children switch
        {
            [CSharpIntermediateToken t] => t,
            [CSharpExpressionIntermediateNode { Children: [CSharpIntermediateToken t] }] => t,
            // Handle the case where the value was lowered as HTML content (from the unresolved tag helper pipeline).
            [HtmlContentIntermediateNode { Children: [HtmlIntermediateToken t] }] => t.IsLazy
                ? IntermediateNodeFactory.CSharpToken(
                    arg: t,
                    contentFactory: static token => token.Content,
                    source: t.Source)
                : new CSharpIntermediateToken(t.Content, t.Source),
            _ => Assumed.Unreachable<CSharpIntermediateToken>()
        };
 
    public override void Accept(IntermediateNodeVisitor visitor)
        => visitor.VisitComponentTypeArgument(this);
 
    public override void FormatNode(IntermediateNodeFormatter formatter)
    {
        formatter.WriteContent(TypeParameterName);
 
        formatter.WriteProperty(nameof(BoundAttribute), BoundAttribute.DisplayName);
        formatter.WriteProperty(nameof(TagHelper), TagHelper.DisplayName);
    }
}