From ed323576273c1688bcd1cd62657adc8ea459fc57 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sun, 12 Apr 2020 17:22:46 -0400 Subject: [PATCH] Move the generation of recursive value descriptions into VariableNode. 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 | 1 - Source/NSXMLElementAdditions.m | 62 +++------------------------------- Source/VariableNode.m | 49 ++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 59 deletions(-) diff --git a/Source/DebuggerController.m b/Source/DebuggerController.m index ab13ce9..057cce6 100644 --- a/Source/DebuggerController.m +++ b/Source/DebuggerController.m @@ -25,7 +25,6 @@ #import "EvalController.h" #import "FileAccessController.h" #import "PreferenceNames.h" -#import "NSXMLElementAdditions.h" #import "StackFrame.h" @interface DebuggerController (Private) diff --git a/Source/NSXMLElementAdditions.m b/Source/NSXMLElementAdditions.m index ab1adc3..e63c373 100644 --- a/Source/NSXMLElementAdditions.m +++ b/Source/NSXMLElementAdditions.m @@ -18,13 +18,6 @@ #import "AppDelegate.h" -@interface NSXMLElement (GDBpAdditions_Private) -- (NSString*)internalName; -- (NSString*)internalBase64DecodedValue; -- (void)recursiveBase64DecodedValue:(NSMutableString*)stringBuilder - depth:(NSUInteger)depth; -@end - @implementation NSXMLElement (GDBpAdditions) /** @@ -36,17 +29,9 @@ } /** - * 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"]) { @@ -60,47 +45,10 @@ } // 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 diff --git a/Source/VariableNode.m b/Source/VariableNode.m index 97d0e43..eeac24a 100644 --- a/Source/VariableNode.m +++ b/Source/VariableNode.m @@ -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]]; @@ -73,4 +74,50 @@ return [NSString stringWithFormat:@"", 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 -- 2.22.5