File: Language\TagHelperDescriptorBuilder_Pooling.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;
using Microsoft.AspNetCore.Razor.PooledObjects;
using Microsoft.Extensions.ObjectPool;
 
namespace Microsoft.AspNetCore.Razor.Language;
 
public partial class TagHelperDescriptorBuilder
{
    private static readonly ObjectPool<TagHelperDescriptorBuilder> s_pool =
        DefaultPool.Create(static () => new TagHelperDescriptorBuilder());
 
    internal static TagHelperDescriptorBuilder GetInstance(string name, string assemblyName)
        => GetInstance(TagHelperKind.ITagHelper, name, assemblyName);
 
    internal static TagHelperDescriptorBuilder GetInstance(TagHelperKind kind, string name, string assemblyName)
    {
        var builder = s_pool.Get();
 
        builder._kind = kind;
        builder._name = name ?? throw new ArgumentNullException(nameof(name));
        builder._assemblyName = assemblyName ?? throw new ArgumentNullException(nameof(assemblyName));
 
        return builder;
    }
 
    private protected override void Reset()
    {
        _flags = 0;
        _kind = 0;
        _name = null;
        _assemblyName = null;
        _typeNameObject = default;
        _documentationObject = default;
        _metadataObject = null;
 
        RuntimeKind = 0;
 
        DisplayName = null;
        TagOutputHint = null;
        CaseSensitive = false;
 
        AllowedChildTags.Clear();
        BoundAttributes.Clear();
        TagMatchingRules.Clear();
    }
 
    /// <summary>
    ///  Retrieves a pooled <see cref="TagHelperDescriptorBuilder"/> instance.
    /// </summary>
    /// <remarks>
    ///  The <see cref="PooledBuilder"/> returned by this method should be disposed
    ///  to return the <see cref="TagHelperDescriptorBuilder"/> to its pool.
    ///  The correct way to achieve this is with a using statement:
    ///
    /// <code>
    ///  using var _ = TagHelperDescriptorBuilder.GetPooledInstance(..., out var builder);
    /// </code>
    /// 
    ///  Once disposed, the builder can no longer be used.
    /// </remarks>
    public static PooledBuilder GetPooledInstance(
        TagHelperKind kind, string name, string assemblyName,
        out TagHelperDescriptorBuilder builder)
    {
        var defaultBuilder = GetInstance(kind, name, assemblyName);
        builder = defaultBuilder;
        return new(defaultBuilder);
    }
 
    /// <summary>
    ///  Retrieves a pooled <see cref="TagHelperDescriptorBuilder"/> instance.
    /// </summary>
    /// <remarks>
    ///  The <see cref="PooledBuilder"/> returned by this method should be disposed
    ///  to return the <see cref="TagHelperDescriptorBuilder"/> to its pool.
    ///  The correct way to achieve this is with a using statement:
    ///
    /// <code>
    ///  using var _ = TagHelperDescriptorBuilder.GetPooledInstance(..., out var builder);
    /// </code>
    /// 
    ///  Once disposed, the builder can no longer be used.
    /// </remarks>
    public static PooledBuilder GetPooledInstance(
        string name, string assemblyName,
        out TagHelperDescriptorBuilder builder)
    {
        var defaultBuilder = GetInstance(name, assemblyName);
        builder = defaultBuilder;
        return new(defaultBuilder);
    }
}