internal static bool TryParseVariableName(string name, bool caseSensitive, out PseudoVariableKind kind, out string id, out int index)
        {
            if (!name.StartsWith("$", StringComparison.Ordinal))
            {
                kind  = PseudoVariableKind.DeclaredLocal;
                id    = name;
                index = -1;
                return(true);
            }

            var comparison = caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;

            if (string.Equals(name, "$exception", comparison))
            {
                kind  = PseudoVariableKind.Exception;
                id    = name;
                index = 0;
                return(true);
            }
            else if (string.Equals(name, "$stowedexception", comparison))
            {
                kind  = PseudoVariableKind.StowedException;
                id    = name;
                index = 0;
                return(true);
            }
            // Allow lowercase version of $ReturnValue, even with case-sensitive match.
            else if (name.StartsWith("$ReturnValue", comparison) ||
                     (caseSensitive && name.StartsWith("$returnvalue", comparison)))
            {
                var suffix = name.Substring(12);
                index = 0;
                if ((suffix.Length == 0) || int.TryParse(suffix, NumberStyles.None, CultureInfo.InvariantCulture, out index))
                {
                    Debug.Assert(index >= 0);
                    kind = PseudoVariableKind.ReturnValue;
                    id   = name;
                    return(true);
                }
            }
            else
            {
                // Check for object id: "[$][1-9][0-9]*"
                var suffix = name.Substring(1);
                // Leading zeros are not supported.
                if (!suffix.StartsWith("0", comparison) && int.TryParse(suffix, NumberStyles.None, CultureInfo.InvariantCulture, out index))
                {
                    Debug.Assert(index >= 0);
                    kind = PseudoVariableKind.ObjectId;
                    id   = suffix;
                    return(true);
                }
            }

            kind  = PseudoVariableKind.None;
            index = -1;
            id    = null;
            return(false);
        }
        internal static bool TryParseVariableName(string name, bool caseSensitive, out PseudoVariableKind kind, out string id, out int index)
        {
            if (!name.StartsWith("$", StringComparison.Ordinal))
            {
                kind = PseudoVariableKind.DeclaredLocal;
                id = name;
                index = -1;
                return true;
            }

            var comparison = caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase;
            if (string.Equals(name, "$exception", comparison))
            {
                kind = PseudoVariableKind.Exception;
                id = name;
                index = 0;
                return true;
            }
            else if (string.Equals(name, "$stowedexception", comparison))
            {
                kind = PseudoVariableKind.StowedException;
                id = name;
                index = 0;
                return true;
            }
            // Allow lowercase version of $ReturnValue, even with case-sensitive match.
            else if (name.StartsWith("$ReturnValue", comparison) ||
                (caseSensitive && name.StartsWith("$returnvalue", comparison)))
            {
                var suffix = name.Substring(12);
                index = 0;
                if ((suffix.Length == 0) || int.TryParse(suffix, NumberStyles.None, CultureInfo.InvariantCulture, out index))
                {
                    Debug.Assert(index >= 0);
                    kind = PseudoVariableKind.ReturnValue;
                    id = name;
                    return true;
                }
            }
            else
            {
                // Check for object id: "[$][1-9][0-9]*"
                var suffix = name.Substring(1);
                // Leading zeros are not supported.
                if (!suffix.StartsWith("0", comparison) && int.TryParse(suffix, NumberStyles.None, CultureInfo.InvariantCulture, out index))
                {
                    Debug.Assert(index >= 0);
                    kind = PseudoVariableKind.ObjectId;
                    id = suffix;
                    return true;
                }
            }

            kind = PseudoVariableKind.None;
            index = -1;
            id = null;
            return false;
        }
 internal static string GetTypeName(InspectionContext context, PseudoVariableKind kind, string id, int index)
 {
     switch (kind)
     {
         case PseudoVariableKind.Exception:
             return context.GetExceptionTypeName();
         case PseudoVariableKind.StowedException:
             return context.GetStowedExceptionTypeName();
         case PseudoVariableKind.ReturnValue:
             return context.GetReturnValueTypeName(index);
         case PseudoVariableKind.ObjectId:
         case PseudoVariableKind.DeclaredLocal:
             return context.GetObjectTypeNameById(id);
         default:
             throw ExceptionUtilities.UnexpectedValue(kind);
     }
 }
        internal static string GetTypeName(InspectionContext context, PseudoVariableKind kind, string id, int index)
        {
            switch (kind)
            {
            case PseudoVariableKind.Exception:
                return(context.GetExceptionTypeName());

            case PseudoVariableKind.StowedException:
                return(context.GetStowedExceptionTypeName());

            case PseudoVariableKind.ReturnValue:
                return(context.GetReturnValueTypeName(index));

            case PseudoVariableKind.ObjectId:
            case PseudoVariableKind.DeclaredLocal:
                return(context.GetObjectTypeNameById(id));

            default:
                throw ExceptionUtilities.UnexpectedValue(kind);
            }
        }