-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathVbArrayLoader.cs
More file actions
130 lines (99 loc) · 4.72 KB
/
Copy pathVbArrayLoader.cs
File metadata and controls
130 lines (99 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Linq;
using ArrayVisualizerExt.TypeParsers;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
namespace ArrayVisualizerExt.ArrayLoaders
{
internal class VbArrayLoader : IArrayLoader
{
#region IArrayLoader Members
public char LeftBracket => '(';
public char RightBracket => ')';
public bool IsExpressionArrayType(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(nameof(expression));
ThreadHelper.ThrowIfNotOnUIThread();
var expressionType = expression.Type == "System.Array" ? expression.Value : expression.Type;
expressionType = Helper.RemoveBrackets(expressionType);
return expressionType.EndsWith(")") && (expressionType.EndsWith("()") || expressionType.EndsWith("(,)") ||
expressionType.EndsWith("(,,)") ||
expressionType.EndsWith("(,,,)"));
}
public string GetDisplayName(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(nameof(expression));
ThreadHelper.ThrowIfNotOnUIThread();
if (expression.Type == "System.Array")
return GetDisplayName(expression.DataMembers.Item(1));
string expType = expression.Type;
expType = expType.Substring(0, expType.IndexOf(LeftBracket));
expType = expType + LeftBracket + string.Join(",", GetDimensions(expression)) + RightBracket;
return expType;
}
public IEnumerable<ExpressionInfo> GetArrays(string section, Expression expression, ParsersCollection parsers,
int sectionCode)
{
ThreadHelper.ThrowIfNotOnUIThread();
if (expression.Value == "Nothing" || expression.DataMembers.Count == 0)
yield break;
foreach (ITypeParser parser in parsers.Where(p => p.IsExpressionTypeSupported(expression)))
{
yield return new ExpressionInfo(expression.Name, section, parser.GetDisplayName(expression), expression,
sectionCode);
break;
}
if (expression.Name == "Me")
foreach (Expression subExpression in expression.DataMembers)
foreach (ExpressionInfo item in GetArrays("Me.", subExpression, parsers, -1))
yield return item;
}
public int GetMembersCount(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(nameof(expression));
ThreadHelper.ThrowIfNotOnUIThread();
if (expression.Type == "System.Array")
return GetMembersCount(expression.DataMembers.Item(1));
return expression.DataMembers.Count;
}
public int[] GetDimensions(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(nameof(expression));
ThreadHelper.ThrowIfNotOnUIThread();
if (expression.Type == "System.Array")
return GetDimensions(expression.DataMembers.Item(1));
int last = expression.DataMembers.Count;
string dims = expression.DataMembers.Item(last).Name;
dims = dims.Substring(dims.IndexOf(LeftBracket) + 1);
dims = dims.Substring(0, dims.IndexOf(RightBracket));
int[] dimenstions = dims.Split(',').Select(x => ParseDimension(x.Trim()) + 1).ToArray();
return dimenstions;
}
public int ParseDimension(string dimensionString)
{
if (string.IsNullOrEmpty(dimensionString))
throw new ArgumentNullException(nameof(dimensionString));
return dimensionString.StartsWith("&H") ? int.Parse(dimensionString.Substring(2), System.Globalization.NumberStyles.HexNumber) : int.Parse(dimensionString);
}
public object[] GetValues(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(nameof(expression));
ThreadHelper.ThrowIfNotOnUIThread();
if (expression.Type == "System.Array")
return GetValues(expression.DataMembers.Item(1));
object[] values;
if (expression.DataMembers.Item(1).Type.IndexOf(LeftBracket) != -1)
values = expression.DataMembers.Cast<Expression>().ToArray();
else
values = expression.DataMembers.Cast<Expression>().Select(e => e.Value).ToArray();
return values;
}
#endregion
}
}