Index: class-dump/src/CDOCProtocol.m |
=================================================================== |
--- class-dump/src/CDOCProtocol.m (revision 0) |
+++ class-dump/src/CDOCProtocol.m (revision 0) |
@@ -0,0 +1,264 @@ |
+// -*- mode: ObjC -*- |
+ |
+// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files. |
+// Copyright (C) 1997-1998, 2000-2001, 2004-2010 Steve Nygard. |
+ |
+#import "CDOCProtocol.h" |
+ |
+#import "NSArray-Extensions.h" |
+#import "NSError-CDExtensions.h" |
+#import "CDClassDump.h" |
+#import "CDOCMethod.h" |
+#import "CDOCSymtab.h" |
+#import "CDSymbolReferences.h" |
+#import "CDTypeParser.h" |
+#import "CDVisitor.h" |
+#import "CDOCProperty.h" |
+#import "CDMethodType.h" |
+#import "CDType.h" |
+#import "CDTypeController.h" |
+#import "CDVisitorPropertyState.h" |
+ |
+@implementation CDOCProtocol |
+ |
+- (id)init; |
+{ |
+ if ([super init] == nil) |
+ return nil; |
+ |
+ name = nil; |
+ protocols = [[NSMutableArray alloc] init]; |
+ classMethods = [[NSMutableArray alloc] init]; |
+ instanceMethods = [[NSMutableArray alloc] init]; |
+ optionalClassMethods = [[NSMutableArray alloc] init]; |
+ optionalInstanceMethods = [[NSMutableArray alloc] init]; |
+ properties = [[NSMutableArray alloc] init]; |
+ |
+ adoptedProtocolNames = [[NSMutableSet alloc] init]; |
+ |
+ return self; |
+} |
+ |
+- (void)dealloc; |
+{ |
+ [name release]; |
+ [protocols release]; |
+ [classMethods release]; |
+ [instanceMethods release]; |
+ [optionalClassMethods release]; |
+ [optionalInstanceMethods release]; |
+ [properties release]; |
+ |
+ [adoptedProtocolNames release]; |
+ |
+ [super dealloc]; |
+} |
+ |
+- (NSString *)name; |
+{ |
+ return name; |
+} |
+ |
+- (void)setName:(NSString *)newName; |
+{ |
+ if (newName == name) |
+ return; |
+ |
+ [name release]; |
+ name = [newName retain]; |
+} |
+ |
+- (NSArray *)protocols; |
+{ |
+ return protocols; |
+} |
+ |
+// This assumes that the protocol name doesn't change after it's been added to this. |
+- (void)addProtocol:(CDOCProtocol *)aProtocol; |
+{ |
+ if ([adoptedProtocolNames containsObject:[aProtocol name]] == NO) { |
+ [protocols addObject:aProtocol]; |
+ [adoptedProtocolNames addObject:[aProtocol name]]; |
+ } |
+} |
+ |
+- (void)removeProtocol:(CDOCProtocol *)aProtocol; |
+{ |
+ [adoptedProtocolNames removeObject:[aProtocol name]]; |
+ [protocols removeObject:aProtocol]; |
+} |
+ |
+- (NSArray *)classMethods; |
+{ |
+ return classMethods; |
+} |
+ |
+- (void)addClassMethod:(CDOCMethod *)method; |
+{ |
+ [classMethods addObject:method]; |
+} |
+ |
+- (NSArray *)instanceMethods; |
+{ |
+ return instanceMethods; |
+} |
+ |
+- (void)addInstanceMethod:(CDOCMethod *)method; |
+{ |
+ [instanceMethods addObject:method]; |
+} |
+ |
+- (NSArray *)optionalClassMethods; |
+{ |
+ return optionalClassMethods; |
+} |
+ |
+- (void)addOptionalClassMethod:(CDOCMethod *)method; |
+{ |
+ [optionalClassMethods addObject:method]; |
+} |
+ |
+- (NSArray *)optionalInstanceMethods; |
+{ |
+ return optionalInstanceMethods; |
+} |
+ |
+- (void)addOptionalInstanceMethod:(CDOCMethod *)method; |
+{ |
+ [optionalInstanceMethods addObject:method]; |
+} |
+ |
+- (NSArray *)properties; |
+{ |
+ return properties; |
+} |
+ |
+- (void)addProperty:(CDOCProperty *)property; |
+{ |
+ [properties addObject:property]; |
+} |
+ |
+- (BOOL)hasMethods; |
+{ |
+ return [classMethods count] > 0 || [instanceMethods count] > 0 || [optionalClassMethods count] > 0 || [optionalInstanceMethods count] > 0; |
+} |
+ |
+- (NSString *)description; |
+{ |
+ return [NSString stringWithFormat:@"<%@:%p> name: %@, protocols: %d, class methods: %d, instance methods: %d", |
+ NSStringFromClass([self class]), self, name, [protocols count], [classMethods count], [instanceMethods count]]; |
+} |
+ |
+- (void)registerTypesWithObject:(CDTypeController *)typeController phase:(NSUInteger)phase; |
+{ |
+ [self registerTypesFromMethods:classMethods withObject:typeController phase:phase]; |
+ [self registerTypesFromMethods:instanceMethods withObject:typeController phase:phase]; |
+ |
+ [self registerTypesFromMethods:optionalClassMethods withObject:typeController phase:phase]; |
+ [self registerTypesFromMethods:optionalInstanceMethods withObject:typeController phase:phase]; |
+} |
+ |
+- (void)registerTypesFromMethods:(NSArray *)methods withObject:(CDTypeController *)typeController phase:(NSUInteger)phase; |
+{ |
+ for (CDOCMethod *method in methods) { |
+ for (CDMethodType *methodType in [method parsedMethodTypes]) { |
+ [[methodType type] phase:phase registerTypesWithObject:typeController usedInMethod:YES]; |
+ } |
+ } |
+} |
+ |
+- (NSString *)sortableName; |
+{ |
+ return name; |
+} |
+ |
+- (NSComparisonResult)ascendingCompareByName:(CDOCProtocol *)otherProtocol; |
+{ |
+ return [[self sortableName] compare:[otherProtocol sortableName]]; |
+} |
+ |
+- (NSString *)findTag:(CDSymbolReferences *)symbolReferences; |
+{ |
+ NSMutableString *resultString = [NSMutableString string]; |
+ |
+ [resultString appendFormat:@"@protocol %@", name]; |
+ if ([protocols count] > 0) |
+ [resultString appendFormat:@" <%@>", [[protocols arrayByMappingSelector:@selector(name)] componentsJoinedByString:@", "]]; |
+ |
+ return resultString; |
+} |
+ |
+- (void)recursivelyVisit:(CDVisitor *)aVisitor; |
+{ |
+ CDVisitorPropertyState *propertyState; |
+ |
+ if ([[aVisitor classDump] shouldMatchRegex] && [[aVisitor classDump] regexMatchesString:[self name]] == NO) |
+ return; |
+ |
+ // Wonderful. Need to typecast because there's also -[NSHTTPCookie initWithProperties:] that takes a dictionary. |
+ propertyState = [(CDVisitorPropertyState *)[CDVisitorPropertyState alloc] initWithProperties:[self properties]]; |
+ |
+ [aVisitor willVisitProtocol:self]; |
+ |
+ //[aVisitor willVisitPropertiesOfProtocol:self]; |
+ //[self visitProperties:aVisitor]; |
+ //[aVisitor didVisitPropertiesOfProtocol:self]; |
+ |
+ [self visitMethods:aVisitor propertyState:propertyState]; |
+ |
+ // This shouldn't happen for protocols. @optional properties will generate optional instance methods, and we'll emit @property in the @optional section. |
+ // BTW, otool doesn't show optional methods. |
+ [aVisitor visitRemainingProperties:propertyState]; |
+ |
+ [aVisitor didVisitProtocol:self]; |
+ |
+ [propertyState release]; |
+} |
+ |
+- (void)visitMethods:(CDVisitor *)aVisitor propertyState:(CDVisitorPropertyState *)propertyState; |
+{ |
+ NSArray *methods; |
+ |
+ methods = classMethods; |
+ if ([[aVisitor classDump] shouldSortMethods]) |
+ methods = [methods sortedArrayUsingSelector:@selector(ascendingCompareByName:)]; |
+ for (CDOCMethod *method in methods) |
+ [aVisitor visitClassMethod:method]; |
+ |
+ methods = instanceMethods; |
+ if ([[aVisitor classDump] shouldSortMethods]) |
+ methods = [methods sortedArrayUsingSelector:@selector(ascendingCompareByName:)]; |
+ for (CDOCMethod *method in methods) |
+ [aVisitor visitInstanceMethod:method propertyState:propertyState]; |
+ |
+ if ([optionalClassMethods count] > 0 || [optionalInstanceMethods count] > 0) { |
+ [aVisitor willVisitOptionalMethods]; |
+ |
+ methods = optionalClassMethods; |
+ if ([[aVisitor classDump] shouldSortMethods]) |
+ methods = [methods sortedArrayUsingSelector:@selector(ascendingCompareByName:)]; |
+ for (CDOCMethod *method in methods) |
+ [aVisitor visitClassMethod:method]; |
+ |
+ methods = optionalInstanceMethods; |
+ if ([[aVisitor classDump] shouldSortMethods]) |
+ methods = [methods sortedArrayUsingSelector:@selector(ascendingCompareByName:)]; |
+ for (CDOCMethod *method in methods) |
+ [aVisitor visitInstanceMethod:method propertyState:propertyState]; |
+ |
+ [aVisitor didVisitOptionalMethods]; |
+ } |
+} |
+ |
+- (void)visitProperties:(CDVisitor *)aVisitor; |
+{ |
+ NSArray *array; |
+ |
+ array = properties; |
+ if ([[aVisitor classDump] shouldSortMethods]) |
+ array = [array sortedArrayUsingSelector:@selector(ascendingCompareByName:)]; |
+ for (CDOCProperty *property in array) |
+ [aVisitor visitProperty:property]; |
+} |
+ |
+@end |
Property changes on: class-dump/src/CDOCProtocol.m |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |