-
Notifications
You must be signed in to change notification settings - Fork 644
/
GBMethodData.m
95 lines (77 loc) · 3.21 KB
/
GBMethodData.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//
// GBMethodData.m
// appledoc
//
// Created by Tomaz Kragelj on 26.7.10.
// Copyright (C) 2010, Gentle Bytes. All rights reserved.
//
#import "GBMethodArgument.h"
#import "GBMethodData.h"
@interface GBMethodData ()
- (NSString *)selectorFromAssignedData;
@end
#pragma mark -
@implementation GBMethodData
#pragma mark Initialization & disposal
+ (id)methodDataWithType:(GBMethodType)type result:(NSArray *)result arguments:(NSArray *)arguments {
NSParameterAssert([arguments count] >= 1);
return [[[self alloc] initWithType:type attributes:nil result:result arguments:arguments] autorelease];
}
+ (id)propertyDataWithAttributes:(NSArray *)attributes components:(NSArray *)components {
NSParameterAssert([components count] >= 2); // At least one return and the name!
NSMutableArray *results = [NSMutableArray arrayWithArray:components];
[results removeLastObject]; // Remove ;
GBMethodArgument *argument = [GBMethodArgument methodArgumentWithName:[components lastObject]];
return [[[self alloc] initWithType:GBMethodTypeProperty attributes:attributes result:results arguments:[NSArray arrayWithObject:argument]] autorelease];
}
- (id)initWithType:(GBMethodType)type attributes:(NSArray *)attributes result:(NSArray *)result arguments:(NSArray *)arguments {
self = [super init];
if (self) {
_methodType = type;
_methodAttributes = attributes;
_methodResultTypes = [result retain];
_methodArguments = [arguments retain];
_methodSelector = [[self selectorFromAssignedData] retain];
}
return self;
}
#pragma mark Helper methods
- (NSString *)selectorFromAssignedData {
NSMutableString *result = [NSMutableString string];
NSString *delimiter = ([self.methodArguments count] > 1 || [[self.methodArguments lastObject] isTyped]) ? @":" : @"";
for (GBMethodArgument *argument in self.methodArguments) {
[result appendString:argument.argumentName];
[result appendString:delimiter];
}
return result;
}
#pragma mark Overidden methods
- (void)mergeDataFromObject:(id)source {
if (!source || source == self) return;
GBLogDebug(@"%@: Merging data from %@...", self, source);
NSParameterAssert([source methodType] == self.methodType);
NSParameterAssert([source methodAttributes] == self.methodAttributes || [[source methodAttributes] isEqualToArray:self.methodAttributes]); // allow nil!
NSParameterAssert([[source methodSelector] isEqualToString:self.methodSelector]);
NSParameterAssert([[source methodResultTypes] isEqualToArray:self.methodResultTypes]);
[super mergeDataFromObject:source];
}
- (NSString *)description {
if (self.parentObject) {
switch (self.methodType) {
case GBMethodTypeClass:
return [NSString stringWithFormat:@"+[%@ %@]", self.parentObject, self.methodSelector];
case GBMethodTypeInstance:
return [NSString stringWithFormat:@"-[%@ %@]", self.parentObject, self.methodSelector];
case GBMethodTypeProperty:
return [NSString stringWithFormat:@"%@.%@", self.parentObject, self.methodSelector];
}
}
return self.methodSelector;
}
#pragma mark Properties
@synthesize methodType = _methodType;
@synthesize methodAttributes = _methodAttributes;
@synthesize methodResultTypes = _methodResultTypes;
@synthesize methodArguments = _methodArguments;
@synthesize methodSelector = _methodSelector;
@end