/
StatecMethod.m
123 lines (89 loc) · 2.94 KB
/
StatecMethod.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
//
// SFClassMethod.m
// Statec
//
// Created by Matt Mower on 30/01/2012.
// Copyright (c) 2012 SmartFish Software Ltd.. All rights reserved.
//
#import "StatecMethod.h"
@implementation StatecMethod
@synthesize scope = _scope;
@synthesize returnType = _returnType;
@synthesize selector = _selector;
@synthesize body = _body;
@synthesize arguments = _arguments;
- (id)init {
self = [super init];
if( self ) {
_arguments = [NSMutableArray array];
_body = [StatecStatementGroup group];
}
return self;
}
- (id)initWithScope:(StatecScope)scope returnType:(NSString *)returnType selector:(SEL)selector {
self = [self init];
if( self ) {
_scope = scope;
_returnType = returnType;
_selector = selector;
}
return self;
}
- (id)initWithScope:(StatecScope)scope returnType:(NSString *)returnType selectorFormat:(NSString *)format, ... {
va_list args;
va_start( args, format );
NSString *selectorString = (__bridge_transfer NSString *)CFStringCreateWithFormatAndArguments( kCFAllocatorDefault, NULL, (__bridge CFStringRef)format, args );
va_end( args );
return [self initWithScope:scope returnType:returnType selector:NSSelectorFromString(selectorString)];
}
- (void)addArgument:(StatecArgument *)argument {
[[self arguments] addObject:argument];
}
- (BOOL)isInstanceScope {
return (StatecInstanceScope & _scope) == StatecInstanceScope;
}
- (BOOL)isClassScope {
return ( StaticClassScope & _scope ) == StaticClassScope;
}
- (NSString *)scopeString {
if( [self isInstanceScope] ) {
return @"-";
} else {
return @"+";
}
}
- (NSString *)selectorString {
return NSStringFromSelector( [self selector] );
}
- (NSString *)signatuareString {
NSMutableString *content = [NSMutableString string];
[content appendString:[self scopeString]];
[content appendString:@" ("];
[content appendString:[self returnType]];
[content appendString:@")"];
NSRange range = [[self selectorString] rangeOfString:@":"];
if( range.location == NSNotFound ) {
[content appendString:[self selectorString]];
} else {
NSArray *selectorComponents = [[self selectorString] componentsSeparatedByString:@":"];
if( [[selectorComponents objectAtIndex:[selectorComponents count]-1] isEqualToString:@""] ) {
selectorComponents = [selectorComponents subarrayWithRange:NSMakeRange(0,[selectorComponents count]-1)];
}
int componentIndex = 0;
for( NSString *component in selectorComponents ) {
if( componentIndex > 0 ) {
[content appendString:@" "];
}
[content appendFormat:@"%@:%@",component,[[[self arguments] objectAtIndex:componentIndex] argumentString]];
componentIndex += 1;
}
}
return content;
}
- (NSString *)declarationString {
return [NSString stringWithFormat:@"%@;\n",[self signatuareString]];
}
- (NSString *)definitionString {
return [NSString stringWithFormat:@"%@ %@\n",[self signatuareString],[[self body] statementString]];
}
@end