File: Language\Legacy\LanguageCharacteristics.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.
 
#nullable disable
 
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
 
namespace Microsoft.AspNetCore.Razor.Language.Legacy;
 
internal abstract class LanguageCharacteristics<TTokenizer>
    where TTokenizer : Tokenizer
{
    public abstract string GetSample(SyntaxKind type);
    public abstract TTokenizer CreateTokenizer(SeekableTextReader source);
    public abstract SyntaxKind FlipBracket(SyntaxKind bracket);
    public abstract SyntaxToken CreateMarkerToken();
 
    public virtual IEnumerable<SyntaxToken> TokenizeString(string content)
    {
        return TokenizeString(SourceLocation.Zero, content);
    }
 
    public virtual IEnumerable<SyntaxToken> TokenizeString(SourceLocation start, string input)
    {
        using (var reader = new SeekableTextReader(input, start.FilePath))
        {
            var tok = CreateTokenizer(reader);
            SyntaxToken token;
            while ((token = tok.NextToken()) != null)
            {
                yield return token;
            }
        }
    }
 
    public virtual bool IsWhitespace(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.Whitespace);
    }
 
    public virtual bool IsNewLine(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.NewLine);
    }
 
    public virtual bool IsIdentifier(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.Identifier);
    }
 
    public virtual bool IsKeyword(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.Keyword);
    }
 
    public virtual bool IsTransition(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.Transition);
    }
 
    public virtual bool IsCommentStart(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.CommentStart);
    }
 
    public virtual bool IsCommentStar(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.CommentStar);
    }
 
    public virtual bool IsCommentBody(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.CommentBody);
    }
 
    public virtual bool IsUnknown(SyntaxToken token)
    {
        return IsKnownTokenType(token, KnownTokenType.Unknown);
    }
 
    public virtual bool IsKnownTokenType(SyntaxToken token, KnownTokenType type)
    {
        return token != null && (token.Kind == GetKnownTokenType(type));
    }
 
    public virtual (SyntaxToken left, SyntaxToken right) SplitToken(SyntaxToken token, int splitAt, SyntaxKind leftType)
    {
        var left = CreateToken(token.Content.Substring(0, splitAt), leftType, Array.Empty<RazorDiagnostic>());
 
        SyntaxToken right = null;
        if (splitAt < token.Content.Length)
        {
            right = CreateToken(token.Content.Substring(splitAt), token.Kind, token.GetDiagnostics());
        }
 
        return (left, right);
    }
 
    public abstract SyntaxKind GetKnownTokenType(KnownTokenType type);
 
    public virtual bool KnowsTokenType(KnownTokenType type)
    {
        return type == KnownTokenType.Unknown || (GetKnownTokenType(type) != GetKnownTokenType(KnownTokenType.Unknown));
    }
 
    protected abstract SyntaxToken CreateToken(string content, SyntaxKind type, RazorDiagnostic[] errors);
}