blob: 4329dc63d592169e3022fb678e98e5dd661e5e3c [file] [log] [blame]
// -*- 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 "CDSymbolReferences.h"
@implementation CDSymbolReferences
- (id)init;
{
if ([super init] == nil)
return nil;
frameworkNamesByClassName = nil;
frameworkNamesByProtocolName = nil;
classes = [[NSMutableSet alloc] init];
protocols = [[NSMutableSet alloc] init];
return self;
}
- (void)dealloc;
{
[frameworkNamesByClassName release];
[frameworkNamesByProtocolName release];
[classes release];
[protocols release];
[super dealloc];
}
- (void)setFrameworkNamesByClassName:(NSDictionary *)newValue;
{
if (newValue == frameworkNamesByClassName)
return;
[frameworkNamesByClassName release];
frameworkNamesByClassName = [newValue retain];
}
- (void)setFrameworkNamesByProtocolName:(NSDictionary *)newValue;
{
if (newValue == frameworkNamesByProtocolName)
return;
[frameworkNamesByProtocolName release];
frameworkNamesByProtocolName = [newValue retain];
}
- (NSString *)frameworkForClassName:(NSString *)aClassName;
{
return [frameworkNamesByClassName objectForKey:aClassName];
}
- (NSString *)frameworkForProtocolName:(NSString *)aProtocolName;
{
return [frameworkNamesByProtocolName objectForKey:aProtocolName];
}
- (NSArray *)classes;
{
return [[classes allObjects] sortedArrayUsingSelector:@selector(compare:)];
}
- (void)addClassName:(NSString *)aClassName;
{
[classes addObject:aClassName];
}
- (void)removeClassName:(NSString *)aClassName;
{
if (aClassName != nil)
[classes removeObject:aClassName];
}
- (NSArray *)protocols;
{
return [[protocols allObjects] sortedArrayUsingSelector:@selector(compare:)];
}
- (void)addProtocolName:(NSString *)aProtocolName;
{
[protocols addObject:aProtocolName];
}
- (void)addProtocolNamesFromArray:(NSArray *)protocolNames;
{
[protocols addObjectsFromArray:protocolNames];
}
- (NSString *)description;
{
return [NSString stringWithFormat:@"<%@:%p> frameworkNamesByClassName: %@, frameworkNamesByProtocolName: %@, classes: %@, protocols: %@",
NSStringFromClass([self class]), self,
frameworkNamesByClassName, frameworkNamesByProtocolName,
[self classes], [self protocols]];
}
- (void)_appendToString:(NSMutableString *)resultString;
{
NSArray *names;
names = [self protocols];
for (NSString *name in names) {
NSString *str;
str = [self importStringForProtocolName:name];
if (str != nil)
[resultString appendString:str];
}
if ([names count] > 0)
[resultString appendString:@"\n"];
names = [self classes];
if ([names count] > 0) {
[resultString appendFormat:@"@class %@;\n\n", [names componentsJoinedByString:@", "]];
}
}
- (NSString *)referenceString;
{
NSMutableString *referenceString;
referenceString = [[[NSMutableString alloc] init] autorelease];
[self _appendToString:referenceString];
if ([referenceString length] == 0)
return nil;
return referenceString;
}
- (void)removeAllReferences;
{
[classes removeAllObjects];
[protocols removeAllObjects];
}
- (NSString *)importStringForClassName:(NSString *)aClassName;
{
if (aClassName != nil) {
NSString *framework;
framework = [self frameworkForClassName:aClassName];
if (framework == nil)
return [NSString stringWithFormat:@"#import \"%@.h\"\n", aClassName];
else
return [NSString stringWithFormat:@"#import <%@/%@.h>\n", framework, aClassName];
}
return nil;
}
- (NSString *)importStringForProtocolName:(NSString *)aProtocolName;
{
if (aProtocolName != nil) {
NSString *framework;
framework = [self frameworkForClassName:aProtocolName];
if (framework == nil)
return [NSString stringWithFormat:@"#import \"%@-Protocol.h\"\n", aProtocolName];
else
return [NSString stringWithFormat:@"#import <%@/%@-Protocol.h>\n", framework, aProtocolName];
}
return nil;
}
@end