mirror of
https://github.com/gnustep/apps-gorm.git
synced 2025-04-23 06:20:47 +00:00
Add capability to handle parsing category from source, fix memory issues
This commit is contained in:
parent
b43f7542cb
commit
8c821843d1
4 changed files with 120 additions and 81 deletions
|
@ -885,7 +885,7 @@ NSImage *browserImage = nil;
|
|||
*/
|
||||
- (id) loadClass: (id)sender
|
||||
{
|
||||
NSArray *fileTypes = [NSArray arrayWithObjects: @"h", @"H", nil];
|
||||
NSArray *fileTypes = [NSArray arrayWithObjects: @"h", @"H", @"m", @"mm", nil];
|
||||
NSOpenPanel *oPanel = [NSOpenPanel openPanel];
|
||||
int result;
|
||||
|
||||
|
@ -922,7 +922,7 @@ NSImage *browserImage = nil;
|
|||
message,
|
||||
nil, nil, nil);
|
||||
}
|
||||
NS_ENDHANDLER
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
|
||||
return nil;
|
||||
|
|
|
@ -1869,7 +1869,7 @@
|
|||
|
||||
- (BOOL) parseHeader: (NSString *)headerPath
|
||||
{
|
||||
OCHeaderParser *ochp = AUTORELEASE([[OCHeaderParser alloc] initWithContentsOfFile: headerPath]);
|
||||
OCHeaderParser *ochp = [[OCHeaderParser alloc] initWithContentsOfFile: headerPath];
|
||||
BOOL result = NO;
|
||||
|
||||
if(ochp != nil)
|
||||
|
@ -1886,7 +1886,7 @@
|
|||
NSArray *methods = [cls methods];
|
||||
NSArray *ivars = [cls ivars];
|
||||
NSArray *properties = [cls properties];
|
||||
NSString *superClass = [cls superClassName];
|
||||
NSString *superClass = [cls superClassName]; // == nil) ? @"NSObject":[cls superClassName];
|
||||
NSString *className = [cls className];
|
||||
NSEnumerator *ien = [ivars objectEnumerator];
|
||||
NSEnumerator *men = [methods objectEnumerator];
|
||||
|
@ -1971,13 +1971,25 @@
|
|||
withOutlets: outlets];
|
||||
}
|
||||
}
|
||||
else if([cls isCategory] && [self isKnownClass: className])
|
||||
else if([cls isCategory])
|
||||
{
|
||||
[self addActions: actions forClassNamed: className];
|
||||
if ([self isKnownClass: className])
|
||||
{
|
||||
[self addActions: actions forClassNamed: className];
|
||||
[self addActions: outlets forClassNamed: className];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self addClassNamed: className
|
||||
withSuperClassNamed: @"NSObject"
|
||||
withActions: actions
|
||||
withOutlets: outlets];
|
||||
}
|
||||
}
|
||||
else if(superClass != nil && [self isKnownClass: superClass] == NO)
|
||||
{
|
||||
result = NO;
|
||||
RELEASE(ochp);
|
||||
[NSException raise: NSGenericException
|
||||
format: @"The superclass %@ of class %@ is not known, please parse it.",
|
||||
superClass, className];
|
||||
|
@ -1986,6 +1998,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
RELEASE(ochp);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
_ivars = [[NSMutableArray alloc] init];
|
||||
_properties = [[NSMutableArray alloc] init];
|
||||
_protocols = [[NSMutableArray alloc] init];
|
||||
_superClassName = nil;
|
||||
ASSIGN(_classString, string);
|
||||
}
|
||||
return self;
|
||||
|
@ -151,89 +152,113 @@
|
|||
|
||||
// get the interface line... look ahead...
|
||||
[self _strip];
|
||||
NSLog(@"_classString = %@", _classString);
|
||||
scanner = [NSScanner scannerWithString: _classString];
|
||||
if (lookAhead(_classString, @"{"))
|
||||
{
|
||||
[scanner scanUpToString: @"@interface" intoString: NULL];
|
||||
[scanner scanUpToString: @"{" intoString: &interfaceLine];
|
||||
iscan = [NSScanner scannerWithString: interfaceLine]; // reset scanner...
|
||||
}
|
||||
else // if there is no "{", then there are no ivars...
|
||||
{
|
||||
[scanner scanUpToString: @"@interface" intoString: NULL];
|
||||
[scanner scanUpToCharactersFromSet: pmcs intoString: &interfaceLine];
|
||||
iscan = [NSScanner scannerWithString: interfaceLine]; // reset scanner...
|
||||
}
|
||||
|
||||
// look ahead...
|
||||
if (lookAhead(interfaceLine, @":"))
|
||||
{
|
||||
NSString *cn = nil, *scn = nil;
|
||||
|
||||
[iscan scanUpToAndIncludingString: @"@interface" intoString: NULL];
|
||||
[iscan scanUpToString: @":" intoString: &cn];
|
||||
_className = [cn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_className);
|
||||
[iscan scanString: @":" intoString: NULL];
|
||||
[iscan scanUpToCharactersFromSet: wsnl intoString: &scn];
|
||||
_superClassName = [scn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_superClassName);
|
||||
}
|
||||
else // category...
|
||||
if (lookAhead(_classString, @"@implementation"))
|
||||
{
|
||||
NSString *cn = nil;
|
||||
|
||||
[iscan scanUpToAndIncludingString: @"@interface" intoString: NULL];
|
||||
[iscan scanUpToCharactersFromSet: wsnl intoString: &cn];
|
||||
|
||||
[scanner scanUpToAndIncludingString: @"@implementation" intoString: NULL];
|
||||
[scanner scanUpToCharactersFromSet: wsnl intoString: &cn];
|
||||
_className = [cn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_className);
|
||||
|
||||
// check to see if it's a category on an existing interface...
|
||||
if (lookAhead(interfaceLine,@"("))
|
||||
NSLog(@"className = %@", _className);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lookAhead(_classString, @"{"))
|
||||
{
|
||||
_isCategory = YES;
|
||||
[scanner scanUpToString: @"@interface" intoString: NULL];
|
||||
[scanner scanUpToString: @"{" intoString: &interfaceLine];
|
||||
iscan = [NSScanner scannerWithString: interfaceLine]; // reset scanner...
|
||||
}
|
||||
else // if there is no "{", then there are no ivars...
|
||||
{
|
||||
[scanner scanUpToString: @"@interface" intoString: NULL];
|
||||
[scanner scanUpToCharactersFromSet: pmcs intoString: &interfaceLine];
|
||||
iscan = [NSScanner scannerWithString: interfaceLine]; // reset scanner...
|
||||
}
|
||||
|
||||
// look ahead...
|
||||
if (lookAhead(interfaceLine, @":"))
|
||||
{
|
||||
NSString *cn = nil, *scn = nil;
|
||||
|
||||
[iscan scanUpToAndIncludingString: @"@interface" intoString: NULL];
|
||||
[iscan scanUpToString: @":" intoString: &cn];
|
||||
_className = [cn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_className);
|
||||
[iscan scanString: @":" intoString: NULL];
|
||||
[iscan scanUpToCharactersFromSet: wsnl intoString: &scn];
|
||||
[self setSuperClassName: [scn stringByTrimmingCharactersInSet: wsnl]];
|
||||
}
|
||||
else // category...
|
||||
{
|
||||
NSString *cn = nil;
|
||||
|
||||
[iscan scanUpToAndIncludingString: @"@interface" intoString: NULL];
|
||||
[iscan scanUpToCharactersFromSet: wsnl intoString: &cn];
|
||||
_className = [cn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_className);
|
||||
|
||||
// check to see if it's a category on an existing interface...
|
||||
if (lookAhead(interfaceLine,@"("))
|
||||
{
|
||||
_isCategory = YES;
|
||||
}
|
||||
}
|
||||
|
||||
if (_isCategory == NO)
|
||||
{
|
||||
NSScanner *ivarScan = nil;
|
||||
|
||||
// put the ivars into a a string...
|
||||
[scanner scanUpToAndIncludingString: @"{" intoString: NULL];
|
||||
[scanner scanUpToString: @"}" intoString: &ivarsString];
|
||||
[scanner scanString: @"}" intoString: NULL];
|
||||
|
||||
if (ivarsString != nil)
|
||||
{
|
||||
// scan each ivar...
|
||||
ivarScan = [NSScanner scannerWithString: ivarsString];
|
||||
while(![ivarScan isAtEnd])
|
||||
{
|
||||
NSString *ivarLine = nil;
|
||||
OCIVarDecl *ivarDecl = nil;
|
||||
|
||||
[ivarScan scanUpToString: @";" intoString: &ivarLine];
|
||||
[ivarScan scanString: @";" intoString: NULL];
|
||||
ivarDecl = AUTORELEASE([[OCIVarDecl alloc] initWithString: ivarLine]);
|
||||
[ivarDecl parse];
|
||||
[_ivars addObjectsFromArray: [ivarDecl ivars]];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NSString *cn = nil;
|
||||
NSScanner *cs = [NSScanner scannerWithString: _classString];
|
||||
|
||||
[cs scanUpToAndIncludingString: @"@interface" intoString: NULL];
|
||||
[cs scanUpToCharactersFromSet: wsnl intoString: &cn];
|
||||
_className = [cn stringByTrimmingCharactersInSet: wsnl];
|
||||
RETAIN(_className);
|
||||
NSLog(@"className = %@", _className);
|
||||
}
|
||||
|
||||
// put the methods into a string...
|
||||
if (ivarsString != nil)
|
||||
{
|
||||
[scanner scanUpToString: @"@end" intoString: &methodsString];
|
||||
}
|
||||
else //
|
||||
{
|
||||
scanner = [NSScanner scannerWithString: _classString];
|
||||
[scanner scanUpToAndIncludingString: interfaceLine intoString: NULL];
|
||||
[scanner scanUpToString: @"@end" intoString: &methodsString];
|
||||
}
|
||||
}
|
||||
|
||||
if (_isCategory == NO)
|
||||
{
|
||||
NSScanner *ivarScan = nil;
|
||||
|
||||
// put the ivars into a a string...
|
||||
[scanner scanUpToAndIncludingString: @"{" intoString: NULL];
|
||||
[scanner scanUpToString: @"}" intoString: &ivarsString];
|
||||
[scanner scanString: @"}" intoString: NULL];
|
||||
|
||||
if (ivarsString != nil)
|
||||
{
|
||||
// scan each ivar...
|
||||
ivarScan = [NSScanner scannerWithString: ivarsString];
|
||||
while(![ivarScan isAtEnd])
|
||||
{
|
||||
NSString *ivarLine = nil;
|
||||
OCIVarDecl *ivarDecl = nil;
|
||||
|
||||
[ivarScan scanUpToString: @";" intoString: &ivarLine];
|
||||
[ivarScan scanString: @";" intoString: NULL];
|
||||
ivarDecl = AUTORELEASE([[OCIVarDecl alloc] initWithString: ivarLine]);
|
||||
[ivarDecl parse];
|
||||
[_ivars addObjectsFromArray: [ivarDecl ivars]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// put the methods into a string...
|
||||
if (ivarsString != nil)
|
||||
{
|
||||
[scanner scanUpToString: @"@end" intoString: &methodsString];
|
||||
}
|
||||
else //
|
||||
{
|
||||
scanner = [NSScanner scannerWithString: _classString];
|
||||
[scanner scanUpToAndIncludingString: interfaceLine intoString: NULL];
|
||||
[scanner scanUpToString: @"@end" intoString: &methodsString];
|
||||
}
|
||||
|
||||
if (_classString != nil)
|
||||
{
|
||||
NSScanner *propertiesScan = [NSScanner scannerWithString: _classString];
|
||||
|
|
|
@ -166,9 +166,10 @@
|
|||
|
||||
if(classString != nil && [classString length] != 0)
|
||||
{
|
||||
cls = AUTORELEASE([[OCClass alloc] initWithString: classString]);
|
||||
cls = [[OCClass alloc] initWithString: classString];
|
||||
[cls parse];
|
||||
[classes addObject: cls];
|
||||
RELEASE(cls);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue