Move the generation of recursive value descriptions into VariableNode.
authorRobert Sesek <rsesek@bluestatic.org>
Sun, 12 Apr 2020 21:22:46 +0000 (17:22 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 12 Apr 2020 21:22:46 +0000 (17:22 -0400)
Moving it out of NSXMLElementAdditions means that it's possible to
detect when all of a node's children are not loaded.

Source/DebuggerController.m
Source/NSXMLElementAdditions.m
Source/VariableNode.m

index ab13ce9fab2c2f6abf6b6e88a6df1704c0b9355f..057cce62d630a087dcad8ba686dd97cc46434633 100644 (file)
@@ -25,7 +25,6 @@
 #import "EvalController.h"
 #import "FileAccessController.h"
 #import "PreferenceNames.h"
-#import "NSXMLElementAdditions.h"
 #import "StackFrame.h"
 
 @interface DebuggerController (Private)
index ab1adc3706936780b6720fc4354626389f772b6f..e63c3733969fc762fefb9d6a14b54542321e1dbd 100644 (file)
 
 #import "AppDelegate.h"
 
-@interface NSXMLElement (GDBpAdditions_Private)
-- (NSString*)internalName;
-- (NSString*)internalBase64DecodedValue;
-- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder
-                              depth:(NSUInteger)depth;
-@end
-
 @implementation NSXMLElement (GDBpAdditions)
 
 /**
 }
 
 /**
- * Returns the "name" attribute.
- */
-- (NSString*)internalName
-{
-  return [[self attributeForName:@"name"] stringValue];
-}
-
-/**
- * Does the actual work of decoding base64.
+ * Returns the value of the property
  */
-- (NSString*)internalBase64DecodedValue
+- (NSString*)base64DecodedValue
 {
   // The value of the node is base64 encoded.
   if ([[[self attributeForName:@"encoding"] stringValue] isEqualToString:@"base64"]) {
   }
 
   // The value is just a normal string.
-  return [self stringValue];  
-}
+  if (![self isLeaf])
+    return [self stringValue];
 
-/**
- * Returns the value of the property
- */
-- (NSString*)base64DecodedValue
-{
-  if (![self isLeaf]) {
-    // For non-leaf nodes, display the object structure by recursively printing
-    // the base64-decoded values.
-    NSMutableString* mutableString = [[NSMutableString alloc] initWithString:@"(\n"];
-    [self recursiveBase64DecodedValue:mutableString depth:1];
-    [mutableString appendString:@")"];
-    return mutableString;
-  }
-
-  return [self internalBase64DecodedValue];  
-}
-
-/**
- * Recursively builds a print_r()-style output by attaching the data to
- * |stringBuilder| with indent level specified by |depth|.
- */
-- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder
-                              depth:(NSUInteger)depth
-{
-  // Create the indention string for this level.
-  NSString* indent = [@"" stringByPaddingToLength:depth withString:@"\t" startingAtIndex:0];
-
-  if ([self isLeaf]) {
-    // If this is a leaf node, simply append the key=>value pair.
-    [stringBuilder appendFormat:@"%@%@\t=>\t%@\n", indent, [self internalName], [self internalBase64DecodedValue]];
-  } else {
-    // If this node has children, increase the depth and recurse.
-    [stringBuilder appendFormat:@"%@%@\t=>\t(\n", indent, [self internalName]];
-    for (NSXMLElement* elm in [self children]) {
-      [elm recursiveBase64DecodedValue:stringBuilder depth:depth + 1];
-    }
-    [stringBuilder appendFormat:@"%@)\n", indent];
-  }
+  return nil;
 }
 
 @end
index 97d0e43bcd4a941b3fece2ad154e27ea3d678c20..eeac24a37f091b36fbe23c74c3b7ebb12461b541 100644 (file)
@@ -20,6 +20,7 @@
 
 @implementation VariableNode {
   NSMutableArray* _children;
+  NSString* _nodeValue;
 }
 
 - (id)initWithXMLNode:(NSXMLElement*)node {
@@ -28,7 +29,7 @@
     _fullName   = [[[node attributeForName:@"fullname"] stringValue] copy];
     _className  = [[[node attributeForName:@"classname"] stringValue] copy];
     _type       = [[[node attributeForName:@"type"] stringValue] copy];
-    _value      = [[node base64DecodedValue] copy];
+    _nodeValue  = [[node base64DecodedValue] copy];
     _children   = [[NSMutableArray alloc] init];
     if ([node children]) {
       [self setChildrenFromXMLChildren:[node children]];
   return [NSString stringWithFormat:@"<VariableNode %p : %@>", self, self.fullName];
 }
 
+- (NSString*)value {
+  if (!self.isLeaf) {
+    if (self.childCount != self.children.count) {
+      return @"…";
+    }
+    // For non-leaf nodes, display the object structure by recursively printing
+    // the base64-decoded values.
+    NSMutableString* mutableString = [[NSMutableString alloc] initWithString:@"(\n"];
+    for (VariableNode* child in self.children) {
+      [self recusivelyFormatNode:child appendTo:mutableString depth:1];
+    }
+    [mutableString appendString:@")"];
+
+    return mutableString;
+  }
+
+  return _nodeValue;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+#pragma mark Private
+
+/**
+ * Recursively builds a print_r()-style output by attaching the data to
+ * |stringBuilder| with indent level specified by |depth|.
+ */
+- (void)recusivelyFormatNode:(VariableNode*)node
+                    appendTo:(NSMutableString*)stringBuilder
+                       depth:(NSUInteger)depth
+{
+  // Create the indention string for this level.
+  NSString* indent = [@"" stringByPaddingToLength:depth withString:@"\t" startingAtIndex:0];
+
+  if (node.isLeaf) {
+    // If this is a leaf node, simply append the key=>value pair.
+    [stringBuilder appendFormat:@"%@%@\t=>\t%@\n", indent, node.name, node->_nodeValue];
+  } else {
+    // If this node has children, increase the depth and recurse.
+    [stringBuilder appendFormat:@"%@%@\t=>\t(\n", indent, node.name];
+    for (VariableNode* child in node.children) {
+      [self recusivelyFormatNode:child appendTo:stringBuilder depth:depth + 1];
+    }
+    [stringBuilder appendFormat:@"%@)\n", indent];
+  }
+}
+
 @end