File: Helpers\ReflectionHelpers.cs
Web Access
Project: src\src\vstest\src\Microsoft.TestPlatform.AdapterUtilities\Microsoft.TestPlatform.AdapterUtilities.csproj (Microsoft.TestPlatform.AdapterUtilities)
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Globalization;
using System.Text;

using Microsoft.TestPlatform.AdapterUtilities.ManagedNameUtilities;

namespace Microsoft.TestPlatform.AdapterUtilities.Helpers;

internal static partial class ReflectionHelpers
{
    private static void AssertSupport<T>(T obj, string methodName, string className)
        where T : class
    {
        if (obj == null)
        {
            throw new NotImplementedException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.MethodNotImplementedOnPlatform, className, methodName));
        }
    }

    internal static string ParseEscapedString(string escapedString)
    {
        var stringBuilder = new StringBuilder();
        var end = 0;
        for (int i = 0; i < escapedString.Length; i++)
        {
            if (escapedString[i] == '\'')
            {
                stringBuilder.Append(escapedString, end, i - end);
                end = i = ParseEscapedStringSegment(escapedString, i + 1, stringBuilder);
            }
        }

        if (stringBuilder.Length == 0)
        {
            return escapedString;
        }

        if (end != 0 && end < escapedString.Length)
        {
            stringBuilder.Append(escapedString, end, escapedString.Length - end);
        }

        return stringBuilder.ToString();
    }

    // Unescapes a C# style escaped string.
    private static int ParseEscapedStringSegment(string escapedStringSegment, int pos, StringBuilder stringBuilder)
    {
        for (int i = pos; i < escapedStringSegment.Length; i++)
        {
            switch (escapedStringSegment[i])
            {
                case '\\':
                    if (escapedStringSegment[i + 1] == 'u')
                    {
                        char c;

                        try
                        {
                            var code = escapedStringSegment.Substring(i + 2, 4);
                            c = (char)Convert.ToInt32(code, 16);
                        }
                        catch
                        {
                            throw new InvalidManagedNameException(
                                string.Format(CultureInfo.CurrentCulture, Resources.Resources.ErrorInvalidSequenceAt, escapedStringSegment, i)
                            );
                        }

                        stringBuilder.Append(c);
                        i += 5;
                    }
                    else
                    {
                        stringBuilder.Append(escapedStringSegment[++i]);
                    }

                    break;

                case '\'':
                    return i + 1;

                default:
                    stringBuilder.Append(escapedStringSegment[i]);
                    break;
            }
        }

        string message = string.Format(CultureInfo.CurrentCulture, Resources.Resources.ErrorNoClosingQuote, escapedStringSegment);
        throw new InvalidManagedNameException(message);
    }
}