Ejemplo n.º 1
0
        public static DbgLocalsValueNodeInfo[] ToLocalsValueNodeInfoArray(DbgLanguage language, DbgRuntime runtime, DbgEngineLocalsValueNodeInfo[] engineNodeInfos)
        {
            var infos = new DbgLocalsValueNodeInfo[engineNodeInfos.Length];
            var nodes = new DbgValueNode[engineNodeInfos.Length];

            for (int i = 0; i < nodes.Length; i++)
            {
                var node = new DbgValueNodeImpl(language, runtime, engineNodeInfos[i].ValueNode);
                nodes[i] = node;
                infos[i] = new DbgLocalsValueNodeInfo(engineNodeInfos[i].Kind, node);
            }
            runtime.CloseOnContinue(nodes);
            return(infos);
        }
        DbgLocalsValueNodeInfo[] GetSortedVariables(DbgEvaluationInfo evalInfo, DbgLocalsValueNodeInfo[] variables, DbgValueFormatterOptions nameFormatterOptions, CultureInfo?cultureInfo)
        {
            if (variables.Length <= 1)
            {
                return(variables);
            }

            var sortParameters = debuggerSettings.SortParameters;
            var sortLocals     = debuggerSettings.SortLocals;

            // If the default options are used, don't sort at all. Let the locals provider
            // decide how to sort them.
            if (!sortParameters && !sortLocals)
            {
                return(variables);
            }

            var output = new DbgStringBuilderTextWriter();

            if (debuggerSettings.GroupParametersAndLocalsTogether)
            {
                return(variables.OrderBy(a => GetName(evalInfo, output, a.ValueNode, nameFormatterOptions, cultureInfo), StringComparer.OrdinalIgnoreCase).ToArray());
            }
            else
            {
                var locals     = variables.Where(a => a.Kind == DbgLocalsValueNodeKind.Local).ToArray();
                var parameters = variables.Where(a => a.Kind == DbgLocalsValueNodeKind.Parameter).ToArray();
                var others     = variables.Where(a => a.Kind != DbgLocalsValueNodeKind.Local && a.Kind != DbgLocalsValueNodeKind.Parameter).ToArray();

                if (sortLocals && locals.Length > 1)
                {
                    locals = locals.OrderBy(a => GetName(evalInfo, output, a.ValueNode, nameFormatterOptions, cultureInfo), StringComparer.OrdinalIgnoreCase).ToArray();
                }
                if (sortParameters && parameters.Length > 1)
                {
                    parameters = parameters.OrderBy(a => GetName(evalInfo, output, a.ValueNode, nameFormatterOptions, cultureInfo), StringComparer.OrdinalIgnoreCase).ToArray();
                }
                if ((sortLocals || sortParameters) && others.Length > 1)
                {
                    others = others.OrderBy(a => GetName(evalInfo, output, a.ValueNode, nameFormatterOptions, cultureInfo), StringComparer.OrdinalIgnoreCase).ToArray();
                }

                var res = new DbgLocalsValueNodeInfo[locals.Length + parameters.Length + others.Length];
                int w   = 0;
                for (int i = 0; i < parameters.Length; i++)
                {
                    res[w++] = parameters[i];
                }
                for (int i = 0; i < locals.Length; i++)
                {
                    res[w++] = locals[i];
                }
                for (int i = 0; i < others.Length; i++)
                {
                    res[w++] = others[i];
                }
                if (w != res.Length)
                {
                    throw new InvalidOperationException();
                }
                return(res);
            }
        }