|
13 | 13 | using System.Collections; |
14 | 14 | using ZSpitz.Util; |
15 | 15 | using static ZSpitz.Util.Functions; |
| 16 | +using ExpressionTreeToString; |
16 | 17 |
|
17 | 18 | namespace ExpressionTreeVisualizer.Serialization { |
18 | 19 | [Serializable] |
@@ -64,16 +65,18 @@ public class ExpressionNodeData { |
64 | 65 | public string[] FactoryMethodNames => _factoryMethodNames; |
65 | 66 |
|
66 | 67 |
|
67 | | - internal ExpressionNodeData(object o, (string aggregatePath, string pathFromParent) path, VisualizerData visualizerData, Dictionary<string, (int start, int length)> pathSpans, bool isParameterDeclaration = false, PropertyInfo? pi = null, string? parentWatchExpression = null) : |
| 68 | + internal ExpressionNodeData(object o, (string aggregatePath, string pathFromParent) path, VisualizerData visualizerData, ValueExtractor valueExtractor, Dictionary<string, (int start, int length)> pathSpans, bool isParameterDeclaration = false, PropertyInfo? pi = null, string? parentWatchExpression = null) : |
68 | 69 | this( |
69 | 70 | o, path, |
70 | 71 | visualizerData.Config.Language, |
| 72 | + valueExtractor, |
71 | 73 | pathSpans, isParameterDeclaration, pi, parentWatchExpression |
72 | 74 | ) { } |
73 | 75 |
|
74 | 76 | private ExpressionNodeData( |
75 | 77 | object o, (string aggregatePath, string pathFromParent) path, |
76 | 78 | string language, |
| 79 | + ValueExtractor valueExtractor, |
77 | 80 | Dictionary<string, (int start, int length)> pathSpans, bool isParameterDeclaration = false, PropertyInfo? pi = null, string? parentWatchExpression = null |
78 | 81 | ) { |
79 | 82 | var (aggregatePath, pathFromParent) = path; |
@@ -107,32 +110,28 @@ private ExpressionNodeData( |
107 | 110 | Closure = expressionType.Name; |
108 | 111 | } |
109 | 112 |
|
110 | | - object? value = null; |
| 113 | + var (evaluated, value) = valueExtractor.GetValue(expr); |
| 114 | + if (evaluated) { |
| 115 | + StringValue = StringValue(value!, language); // TODO value is allowed to be null |
| 116 | + EnableValueInNewWindow = value is { } && value.GetType().InheritsFromOrImplementsAny(NodeTypes); |
| 117 | + } |
111 | 118 |
|
112 | 119 | // fill StringValue and EndNodeType properties, for expressions |
113 | 120 | switch (expr) { |
114 | 121 | case ConstantExpression cexpr when !cexpr.Type.IsClosureClass(): |
115 | | - value = cexpr.Value; |
116 | 122 | EndNodeType = Constant; |
117 | 123 | break; |
118 | 124 | case ParameterExpression pexpr1: |
119 | 125 | EndNodeType = Parameter; |
120 | 126 | break; |
121 | 127 | case Expression e1 when expr.IsClosedVariable(): |
122 | | - value = expr.ExtractValue(); |
123 | 128 | EndNodeType = ClosedVar; |
124 | 129 | break; |
125 | 130 | case DefaultExpression defexpr: |
126 | | - value = defexpr.ExtractValue(); |
127 | 131 | EndNodeType = Default; |
128 | 132 | break; |
129 | 133 | } |
130 | 134 |
|
131 | | - if (value != null) { |
132 | | - StringValue = StringValue(value, language); |
133 | | - EnableValueInNewWindow = value.GetType().InheritsFromOrImplementsAny(NodeTypes); |
134 | | - } |
135 | | - |
136 | 135 | break; |
137 | 136 | case MemberBinding mbind: |
138 | 137 | NodeType = mbind.BindingType.ToString(); |
@@ -197,7 +196,7 @@ private ExpressionNodeData( |
197 | 196 | .Where(x => x.x != null) |
198 | 197 | .SelectT((relativePath, o1, prp) => new ExpressionNodeData( |
199 | 198 | o1, (FullPath ?? "", relativePath), |
200 | | - language, pathSpans, |
| 199 | + language, valueExtractor, pathSpans, |
201 | 200 | false, prp, WatchExpressionFormatString)) |
202 | 201 | .ToList(); |
203 | 202 |
|
|
0 commit comments