File: EditAndContinueCapabilitiesParser.cs
Web Access
Project: src\src\runtime\src\tools\hotreload-delta-gen\Microsoft.DotNet.HotReload.Utils.Generator\Microsoft.DotNet.HotReload.Utils.Generator.csproj (Microsoft.DotNet.HotReload.Utils.Generator)
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace Microsoft.DotNet.HotReload.Utils.Generator;

public static class EditAndContinueCapabilitiesParser {

    public readonly struct Token {
        public readonly string Value {get; init;}
    }
    static public readonly Regex capabilitiesTokenizer = new (@"^\s*(?:(\S+)\s+)*(\S+)?$", RegexOptions.CultureInvariant);
    public static IEnumerable<Token> Tokenize (string capabilities)
    {
        Match match = capabilitiesTokenizer.Match (capabilities);
        if (!match.Success)
            yield break;
        foreach (Capture c in match.Groups[1].Captures) {
                    yield return new Token { Value = c.Value };
        }
        foreach (Capture c in match.Groups[2].Captures) {
            yield return new Token { Value = c.Value };
        }
    }

    public static IEnumerable<Token> Tokenize (IEnumerable<string> capabilities)
    {
        foreach (var cap in capabilities) {
            foreach (var token in Tokenize(cap))
                yield return token;
        }
    }

    internal static (IEnumerable<EnC.EditAndContinueCapabilities> capabilities, IEnumerable<string> unknowns) Parse (IEnumerable<Token> tokens)
    {
        List<string> unknowns = new();
        List<EnC.EditAndContinueCapabilities> capabilities = new();
        foreach (var tok in tokens)
        {
            if (ParseToken (tok, out var cap)) {
                capabilities.Add (cap);
            } else {
                unknowns.Add (tok.Value);
            }
        }
        return (capabilities, unknowns);
    }

    internal static (IEnumerable<EnC.EditAndContinueCapabilities> capabilities, IEnumerable<string> unknowns) Parse (string capabilities)
    {
        return Parse(Tokenize(capabilities));
    }

    internal static (IEnumerable<EnC.EditAndContinueCapabilities> capabilities, IEnumerable<string> unknowns) Parse (IEnumerable<string> capabilities)
    {
        return Parse(Tokenize(capabilities));
    }

    internal static bool ParseToken (Token token, out EnC.EditAndContinueCapabilities res) =>
        Enum.TryParse<EnC.EditAndContinueCapabilities>(token.Value, ignoreCase: true, out res);

}