File: Language\Legacy\SpanEditHandlerBuilder.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 System.Collections.Generic;
using System.Diagnostics;
using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
 
namespace Microsoft.AspNetCore.Razor.Language.Legacy;
 
internal sealed class SpanEditHandlerBuilder
{
    private static readonly Func<string, IEnumerable<SyntaxToken>> DefaultTokenizer = SpanEditHandler.NoTokenizer;
    private static readonly SpanEditHandler DefaultEditHandler = SpanEditHandler.GetDefault(AcceptedCharactersInternal.Any);
 
    private readonly Func<string, IEnumerable<SyntaxToken>>? _defaultLanguageTokenizer;
    private readonly SpanEditHandler? _defaultLanguageEditHandler;
 
    private SpanEditHandler? _currentInstance;
    private Func<string, IEnumerable<SyntaxToken>>? _tokenizer;
    private Func<AcceptedCharactersInternal, Func<string, IEnumerable<SyntaxToken>>, SpanEditHandler>? _factory;
 
    public SpanEditHandlerBuilder(Func<string, IEnumerable<SyntaxToken>>? defaultLanguageTokenizer)
    {
        _defaultLanguageTokenizer = defaultLanguageTokenizer;
        if (_defaultLanguageTokenizer is not null)
        {
            _defaultLanguageEditHandler = SpanEditHandler.CreateDefault(_defaultLanguageTokenizer, AcceptedCharactersInternal.Any);
        }
        Reset();
    }
 
    public Func<string, IEnumerable<SyntaxToken>>? Tokenizer
    {
        get => _tokenizer;
        set
        {
            if (_tokenizer != value)
            {
                _tokenizer = value;
                _currentInstance = null;
            }
        }
    }
 
    public Func<AcceptedCharactersInternal, Func<string, IEnumerable<SyntaxToken>>, SpanEditHandler>? Factory
    {
        get => _factory;
        set
        {
            if (_factory != value)
            {
                _factory = value;
                _currentInstance = null;
            }
        }
    }
 
    public SpanEditHandler Build(AcceptedCharactersInternal acceptedCharacters)
    {
        Debug.Assert(_currentInstance is null || _currentInstance.Tokenizer == Tokenizer);
        return _currentInstance ??= CreateHandler();
 
        SpanEditHandler CreateHandler()
        {
            if (Factory is not null)
            {
                return Factory(acceptedCharacters, Tokenizer ?? DefaultTokenizer);
            }
 
            if (acceptedCharacters == AcceptedCharactersInternal.Any)
            {
                if (Tokenizer is null)
                {
                    return DefaultEditHandler;
                }
                else if (Tokenizer == _defaultLanguageTokenizer)
                {
                    Debug.Assert(_defaultLanguageEditHandler is not null);
                    return _defaultLanguageEditHandler!;
                }
            }
 
            return new SpanEditHandler
            {
                AcceptedCharacters = acceptedCharacters,
                Tokenizer = Tokenizer ?? DefaultTokenizer
            };
        }
    }
 
    public void Reset()
    {
        Tokenizer = null;
        Factory = null;
        _currentInstance = null;
    }
}