forked from tomaz/appledoc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
InterfaceInfoBase.m
194 lines (162 loc) · 7.07 KB
/
InterfaceInfoBase.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
//
// InterfaceInfoBase.m
// appledoc
//
// Created by Tomaž Kragelj on 4/12/12.
// Copyright (c) 2012 Tomaz Kragelj. All rights reserved.
//
#import "Objects.h"
#import "StoreConstants.h"
#import "StoreRegistrations.h"
#import "ObjectLinkInfo.h"
#import "MethodGroupInfo.h"
#import "PropertyInfo.h"
#import "MethodInfo.h"
#import "InterfaceInfoBase.h"
@interface InterfaceInfoBase ()
@property (nonatomic, strong) NSMutableArray *interfaceMethodsAndPropertiesInRegistrationOrder; // only used for nicer debug output!
@end
#pragma mark -
@implementation InterfaceInfoBase
#pragma mark - Helper methods
- (NSMutableArray *)methodsArrayForType:(NSString *)type {
if (type == GBStoreTypes.classMethod)
return self.interfaceClassMethods;
else if (type == GBStoreTypes.instanceMethod)
return self.interfaceInstanceMethods;
return nil;
}
#pragma mark - Properties
- (NSMutableArray *)interfaceAdoptedProtocols {
if (_interfaceAdoptedProtocols) return _interfaceAdoptedProtocols;
LogDebug(@"Initializing adopted protocols array due to first access...");
_interfaceAdoptedProtocols = [[NSMutableArray alloc] init];
return _interfaceAdoptedProtocols;
}
- (NSMutableArray *)interfaceMethodGroups {
if (_interfaceMethodGroups) return _interfaceMethodGroups;
LogDebug(@"Initializing method groups array due to first access...");
_interfaceMethodGroups = [[NSMutableArray alloc] init];
return _interfaceMethodGroups;
}
- (NSMutableArray *)interfaceProperties {
if (_interfaceProperties) return _interfaceProperties;
LogDebug(@"Initializing properties array due to first access...");
_interfaceProperties = [[NSMutableArray alloc] init];
return _interfaceProperties;
}
- (NSMutableArray *)interfaceInstanceMethods {
if (_interfaceInstanceMethods) return _interfaceInstanceMethods;
LogDebug(@"Initializing instance methods array due to first access...");
_interfaceInstanceMethods = [[NSMutableArray alloc] init];
return _interfaceInstanceMethods;
}
- (NSMutableArray *)interfaceClassMethods {
if (_interfaceClassMethods) return _interfaceClassMethods;
LogDebug(@"Initializing class methods array due to first access...");
_interfaceClassMethods = [[NSMutableArray alloc] init];
return _interfaceClassMethods;
}
- (NSMutableArray *)interfaceMethodsAndPropertiesInRegistrationOrder {
if (_interfaceMethodsAndPropertiesInRegistrationOrder) return _interfaceMethodsAndPropertiesInRegistrationOrder;
LogDebug(@"Initializing methods and properties array due to first access...");
_interfaceMethodsAndPropertiesInRegistrationOrder = [[NSMutableArray alloc] init];
return _interfaceMethodsAndPropertiesInRegistrationOrder;
}
@end
#pragma mark -
@implementation InterfaceInfoBase (Registrations)
#pragma mark - Interface level registrations
- (void)appendAdoptedProtocolWithName:(NSString *)name {
LogVerbose(@"Appending adopted protocol %@...", name);
if ([self.interfaceAdoptedProtocols gb_containsObjectLinkInfoWithName:name]) {
LogDebug(@"%@ is already in the adopted protocols list, ignoring...", name);
return;
}
ObjectLinkInfo *data = [ObjectLinkInfo ObjectLinkInfoWithName:name];
[self.interfaceAdoptedProtocols addObject:data];
}
#pragma mark - Method groups
- (void)appendMethodGroupWithDescription:(NSString *)description {
LogVerbose(@"Starting method group...");
MethodGroupInfo *data = [MethodGroupInfo MethodGroupInfoWithName:description];
[self.interfaceMethodGroups addObject:data];
}
#pragma mark - Properties
- (void)beginPropertyDefinition {
LogVerbose(@"Starting property definition...");
PropertyInfo *info = [[PropertyInfo alloc] initWithRegistrar:self.objectRegistrar];
info.sourceToken = self.currentSourceInfo;
info.memberParent = self;
[[self.interfaceMethodGroups.lastObject methodGroupMethods] addObject:info];
[self.interfaceMethodsAndPropertiesInRegistrationOrder addObject:info];
[self.interfaceProperties addObject:info];
[self pushRegistrationObject:info];
}
#pragma mark - Methods
- (void)beginMethodDefinitionWithType:(NSString *)type {
LogVerbose(@"Starting %@ definition...", type);
NSMutableArray *methodsArray = [self methodsArrayForType:type];
if (!methodsArray) LogWarn(@"Unsupported method type %@!", type);
MethodInfo *info = [[MethodInfo alloc] initWithRegistrar:self.objectRegistrar];
info.sourceToken = self.currentSourceInfo;
info.methodType = type;
info.memberParent = self;
[[self.interfaceMethodGroups.lastObject methodGroupMethods] addObject:info];
[self.interfaceMethodsAndPropertiesInRegistrationOrder addObject:info];
[[self methodsArrayForType:type] addObject:info];
[self pushRegistrationObject:info];
}
#pragma mark - Finalizing registration for current object
- (void)cancelCurrentObject {
if ([self.currentRegistrationObject isKindOfClass:[PropertyInfo class]]) {
LogVerbose(@"Cancelling current property info!");
MethodGroupInfo *lastMethodGroup = [self.interfaceMethodGroups lastObject];
if ([lastMethodGroup.methodGroupMethods lastObject] == self.currentRegistrationObject) {
LogDebug(@"Removing property info from last method group!");
[lastMethodGroup.methodGroupMethods removeLastObject];
}
[self.interfaceProperties removeLastObject];
[self.interfaceMethodsAndPropertiesInRegistrationOrder removeLastObject];
} else if ([self.currentRegistrationObject isKindOfClass:[MethodInfo class]]) {
LogVerbose(@"Cancelling current method info!");
MethodGroupInfo *lastMethodGroup = [self.interfaceMethodGroups lastObject];
if ([lastMethodGroup.methodGroupMethods lastObject] == self.currentRegistrationObject) {
LogDebug(@"Removing method info from last method group!");
[lastMethodGroup.methodGroupMethods removeLastObject];
}
NSString *type = [self.currentRegistrationObject methodType];
NSMutableArray *methodsArray = [self methodsArrayForType:type];
if (!methodsArray) LogWarn(@"Unsupported method type %@!", type);
[methodsArray removeLastObject];
[self.interfaceMethodsAndPropertiesInRegistrationOrder removeLastObject];
} else {
LogWarn(@"Unknown context for cancel current object (%@)!", self.currentRegistrationObject);
}
}
@end
#pragma mark -
@implementation InterfaceInfoBase (Logging)
- (NSString *)description {
return [NSString gb_format:@"%lu properties, %lu interface methods, %lu class methods", self.interfaceProperties.count, self.interfaceInstanceMethods.count, self.interfaceClassMethods.count];
}
- (NSString *)debugDescription {
NSMutableString *result = [NSMutableString string];
if (_interfaceAdoptedProtocols && self.interfaceAdoptedProtocols.count > 0) {
[result appendString:@" <"];
[self.interfaceAdoptedProtocols enumerateObjectsUsingBlock:^(ObjectLinkInfo *data, NSUInteger idx, BOOL *stop) {
if (idx > 0) [result appendString:@","];
[result appendString:data.nameOfObject];
}];
[result appendString:@">"];
}
if (_interfaceMethodsAndPropertiesInRegistrationOrder && self.interfaceMethodsAndPropertiesInRegistrationOrder.count > 0) {
[result appendString:@"\n"];
[self.interfaceMethodsAndPropertiesInRegistrationOrder enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[result appendFormat:@"%@\n", [obj debugDescription]];
}];
}
[result appendString:@"@end"];
return result;
}
@end