-
Notifications
You must be signed in to change notification settings - Fork 5
/
SCKProject.m
121 lines (97 loc) · 2.43 KB
/
SCKProject.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
#import "SCKProject.h"
#import "SCKSourceFile.h"
#import "SCKSourceCollection.h"
@implementation SCKProject
{
NSURL *directoryURL;
SCKSourceCollection *sourceCollection;
NSMutableArray *fileURLs;
id <SCKProjectContent> projectContent;
}
@synthesize directoryURL, fileURLs;
- (id) initWithDirectoryURL: (NSURL *)aURL
sourceCollection: (SCKSourceCollection *)aSourceCollection;
{
NILARG_EXCEPTION_TEST(aSourceCollection);
SUPERINIT;
ASSIGN(directoryURL, aURL);
ASSIGN(sourceCollection, aSourceCollection);
fileURLs = [NSMutableArray new];
projectContent = [SCKFileBrowsingProjectContent new];
return self;
}
- (void)addFileURL: (NSURL *)aURL
{
NILARG_EXCEPTION_TEST(aURL);
if ([fileURLs containsObject: aURL])
return;
[fileURLs addObject: aURL];
}
- (void)removeFileURL: (NSURL *)aURL
{
NILARG_EXCEPTION_TEST(aURL);
[fileURLs removeObject: aURL];
}
- (NSArray *)files
{
NSMutableArray *files = [NSMutableArray new];
for (NSURL *url in fileURLs)
{
NSString *resolvedFilePath = (directoryURL == nil ? [url path] :
[[directoryURL path] stringByAppendingPathComponent: [url relativePath]]);
SCKFile *file = [sourceCollection sourceFileForPath:
[resolvedFilePath stringByStandardizingPath]];
[files addObject: file];
}
return files;
}
- (NSArray *)programComponentsForKey: (NSString *)key
{
// NOTE: We could write...
//NSDictionary *componentsByName = [[[self files] mappedCollection] valueForKey: key];
//return [[[componentsByName mappedCollection] allValues] flattenedCollection];
NSMutableArray *components = [NSMutableArray new];
for (SCKSourceFile *file in [[self files]])
{
[components addObjectsFromArray: [[file valueForKey: key] allValues]];
}
return components;
}
- (NSArray *)classes
{
return [self programComponentsForKey: @"classes"];
}
- (NSArray *)functions
{
return [self programComponentsForKey: @"functions"];
}
- (NSArray *)globals
{
return [self programComponentsForKey: @"globals"];
}
- (void)setContentClass: (Class)aClass
{
INVALIDARG_EXCEPTION_TEST([aClass conformsToProtocol: @protocol(SCKProjectContent)]);
projectContent = [aClass new];
}
- (Class)contentClass
{
return [projectContent class];
}
- (id)content
{
return [projectContent content];
}
@end
@implementation SCKFileBrowsingProjectContent
- (id)content
{
return [self files];
}
@end
@implementation SCKSymbolBrowsingProjectContent
- (id)content
{
return A([self classes], [self functions], [self globals]);
}
@end