| File: Language\Legacy\SpanEditHandlerBuilder.cs | Web Access |
| Project: src\roslyn\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; } }