public int[] GetDimensions(EnvDTE.Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            int[] dims;
            switch (GetExpressionType(expression))
            {
            case ExpressionType.Matrix:
                dims = new int[2];
                EnvDTE.Expressions members = expression.DataMembers.Item("Item").DataMembers;
                dims[0] = ParseDimension(members.Item("NumRows").Value);
                dims[1] = ParseDimension(members.Item("NumCols").Value);
                break;

            case ExpressionType.Vector:
                dims    = new int[1];
                dims[0] = expression.DataMembers.Count - 1;
                break;

            default:
                throw new NotSupportedException(string.Format("'{0} is not supported.'", expression.Type));
            }
            return(dims);
        }
Example #2
0
        public Common.Expression GetEntry(params string[] entryNames)
        {
            var dte = ((DTE2)GetDTE());

            if (dte.Debugger.CurrentStackFrame == null) // Ensure that debugger is running
            {
                throw new Exception($"Could not find locals. Debugger is not running.");
            }

            EnvDTE.Expressions expressions = dte.Debugger.CurrentStackFrame.Locals;
            EnvDTE.Expression  entry       = null;

            int i = 0;

            while (i < entryNames.Length && TryGetEntryInternal(entryNames[i], expressions, out entry))
            {
                i++;
                expressions = entry.DataMembers;
            }

            if ((i == entryNames.Length) && (entry != null))
            {
                return(new Common.Expression(entry));
            }

            string localHierarchicalName = string.Join("->", entryNames);
            string allLocalsString       = string.Join("\n", GetAllLocals(dte.Debugger.CurrentStackFrame.Locals));

            throw new Exception($"\nCould not find the local named {localHierarchicalName}.\nAll available locals are: \n{allLocalsString}");
        }
        public int[] GetDimensions(EnvDTE.Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            ThreadHelper.ThrowIfNotOnUIThread();

            int[] dims;
            switch (GetExpressionType(expression))
            {
            case ExpressionType.Matrix:
                dims = new int[2];
                EnvDTE.Expressions members = expression.DataMembers.Item("Item").DataMembers;
                dims[0] = ParseDimension(members.Item("NumRows").Value);
                dims[1] = ParseDimension(members.Item("NumCols").Value);
                break;

            case ExpressionType.Vector:
                dims    = new int[1];
                dims[0] = expression.DataMembers.Count - 1;
                break;

            default:
                throw new NotSupportedException($"'{expression.Type} is not supported.'");
            }
            return(dims);
        }
Example #4
0
        private bool TryGetEntryInternal(string entryName, EnvDTE.Expressions expressions, out EnvDTE.Expression expression)
        {
            expression = expressions.Cast <EnvDTE.Expression>().FirstOrDefault(e => e.Name == entryName);
            if (expression != null)
            {
                return(true);
            }

            return(false);
        }
Example #5
0
        public int GetCount()
        {
            var dte = ((DTE2)GetDTE());

            if (dte.Debugger.CurrentStackFrame != null) // Ensure that debugger is running
            {
                EnvDTE.Expressions locals = dte.Debugger.CurrentStackFrame.Locals;
                return(locals.Count);
            }

            return(0);
        }
Example #6
0
        private EnvDTE.Expression GetEntryInternal(string entryName)
        {
            var dte = ((DTE2)GetDTE());

            if (dte.Debugger.CurrentStackFrame != null) // Ensure that debugger is running
            {
                EnvDTE.Expressions locals = dte.Debugger.CurrentStackFrame.Locals;
                return(GetEntryInternal(entryName, locals));
            }

            throw new Exception($"Could not find locals. Debugger is not running.");
        }
Example #7
0
        private EnvDTE.Expression GetEntryInternal(string entryName, EnvDTE.Expressions expressions)
        {
            var expressionCollection = expressions.Cast <EnvDTE.Expression>();
            var expressionMatched    = expressionCollection.FirstOrDefault(e => e.Name == entryName);

            if (expressionMatched != null)
            {
                return(expressionMatched);
            }

            string nestedExpressionNamesString = string.Join(",", expressionCollection.Select(e => e.Name));

            throw new Exception($"Could not find the local named {entryName}. Available locals are {nestedExpressionNamesString}.");
        }
Example #8
0
        private static IEnumerable <string> GetAllLocals(EnvDTE.Expressions expressions)
        {
            foreach (var expression in expressions.Cast <EnvDTE.Expression>())
            {
                var expressionName = expression.Name;
                yield return(expressionName);

                var nestedExpressions = expression.DataMembers;
                if (nestedExpressions != null)
                {
                    foreach (var nestedLocal in GetAllLocals(nestedExpressions))
                    {
                        yield return(string.Format("{0}->{1}", expressionName, nestedLocal));
                    }
                }
            }
        }
Example #9
0
        public Common.Expression GetEntry(string entryName)
        {
            var dte = ((DTE2)GetDTE());

            if (dte.Debugger.CurrentStackFrame != null) // Ensure that debugger is running
            {
                EnvDTE.Expressions locals = dte.Debugger.CurrentStackFrame.Locals;
                foreach (EnvDTE.Expression local in locals)
                {
                    if (local.Name == entryName)
                    {
                        return(new Common.Expression(local));
                    }
                }
            }

            throw new Exception($"Could not find the local named {entryName}.");
        }