@@ -33,8 +33,18 @@ public string Language {
3333 set => this . NotifyChanged ( ref _language , value , args => PropertyChanged ? . Invoke ( this , args ) ) ;
3434 }
3535
36+ public string Path { get ; set ; }
37+
3638 [ field: NonSerialized ]
3739 public event PropertyChangedEventHandler PropertyChanged ;
40+
41+ public VisualizerDataOptions ( VisualizerDataOptions options = null ) {
42+ if ( options != null ) {
43+ _formatter = options . Formatter ;
44+ _language = options . Language ;
45+ Path = options . Path ;
46+ }
47+ }
3848 }
3949
4050 [ Serializable ]
@@ -70,6 +80,9 @@ public VisualizerData() { }
7080
7181 public VisualizerData ( object o , VisualizerDataOptions options = null ) {
7282 Options = options ?? new VisualizerDataOptions ( ) ;
83+ if ( ! options . Path . IsNullOrWhitespace ( ) ) {
84+ o = ( ResolvePath ( o , options . Path ) as Expression ) . ExtractValue ( ) ;
85+ }
7386 Source = WriterBase . Create ( o , Options . Formatter , Options . Language , out var pathSpans ) . ToString ( ) ;
7487 PathSpans = pathSpans ;
7588 CollectedEndNodes = new List < ExpressionNodeData > ( ) ;
@@ -130,6 +143,7 @@ public class ExpressionNodeData : INotifyPropertyChanged {
130143 private List < ( string @namespace , string typename ) > _baseTypes ;
131144 public List < ( string @namespace , string typename ) > BaseTypes => _baseTypes ;
132145 public string WatchExpressionFormatString { get ; set ; }
146+ public bool EnableValueInNewWindow { get ; set ; }
133147
134148 public EndNodeData EndNodeData => new EndNodeData {
135149 Closure = Closure ,
@@ -180,17 +194,19 @@ internal ExpressionNodeData(object o, (string aggregatePath, string pathFromPare
180194 break ;
181195 }
182196
197+ object value = null ;
198+
183199 // fill StringValue and EndNodeType properties, for expressions
184200 switch ( expr ) {
185201 case ConstantExpression cexpr when ! cexpr . Type . IsClosureClass ( ) :
186- StringValue = StringValue ( cexpr . Value , language ) ;
202+ value = cexpr . Value ;
187203 EndNodeType = Constant ;
188204 break ;
189205 case ParameterExpression pexpr1 :
190206 EndNodeType = Parameter ;
191207 break ;
192208 case Expression e1 when expr . IsClosedVariable ( ) :
193- StringValue = StringValue ( expr . ExtractValue ( ) , language ) ;
209+ value = expr . ExtractValue ( ) ;
194210 EndNodeType = ClosedVar ;
195211 break ;
196212 case DefaultExpression defexpr :
@@ -199,6 +215,11 @@ internal ExpressionNodeData(object o, (string aggregatePath, string pathFromPare
199215 }
200216 if ( EndNodeType != null ) { visualizerData . CollectedEndNodes . Add ( this ) ; }
201217
218+ if ( value != null ) {
219+ StringValue = StringValue ( value , language ) ;
220+ EnableValueInNewWindow = value . GetType ( ) . InheritsFromOrImplementsAny ( NodeTypes ) ;
221+ }
222+
202223 break ;
203224 case MemberBinding mbind :
204225 NodeType = mbind . BindingType . ToString ( ) ;
@@ -222,7 +243,7 @@ internal ExpressionNodeData(object o, (string aggregatePath, string pathFromPare
222243 WatchExpressionFormatString = "{0}" ;
223244 } else if ( pi != null ) {
224245 var watchPathFromParent = PathFromParent ;
225- if ( visualizerData . Options . Language == CSharp ) {
246+ if ( visualizerData . Options . Language == CSharp ) {
226247 WatchExpressionFormatString = $ "(({ pi . DeclaringType . FullName } ){ parentWatchExpression } ).{ watchPathFromParent } ";
227248 } else { //VisualBasic
228249 watchPathFromParent = watchPathFromParent . Replace ( "[" , "(" ) . Replace ( "]" , ")" ) ;
@@ -257,12 +278,14 @@ internal ExpressionNodeData(object o, (string aggregatePath, string pathFromPare
257278 // populate URLs
258279 if ( pi != null ) {
259280 ParentProperty = ( pi . DeclaringType . Namespace , pi . DeclaringType . Name , pi . Name ) ;
260- }
281+ }
261282
262283 if ( ! baseTypes . TryGetValue ( o . GetType ( ) , out _baseTypes ) ) {
263284 _baseTypes = o . GetType ( ) . BaseTypes ( true , true ) . Where ( x => x != typeof ( object ) && x . IsPublic ) . Select ( x => ( x . Namespace , x . Name ) ) . Distinct ( ) . ToList ( ) ;
264285 baseTypes [ o . GetType ( ) ] = _baseTypes ;
265286 }
287+
288+
266289 }
267290
268291 private static List < ( Type , string [ ] ) > preferredPropertyOrders = new List < ( Type , string [ ] ) > {
@@ -313,6 +336,3 @@ public enum EndNodeTypes {
313336 Default
314337 }
315338}
316-
317-
318- // TODO write method to load span into this ExpressionNodeData
0 commit comments