Skip to content

Commit

Permalink
Fixed undocumented methods and properties parsing. Closes tomaz#57.
Browse files Browse the repository at this point in the history
The problem was in cases like this:

	/** comment */
	@Property (attributes) id commentedProperty;

	- (void)uncommentedMethod;

After working on workaround for tomaz#43 (commit 4262bb8) forgot to reset comments when parsing methods and properties. Although above case worked properly in case of two methods (in fact there was a unit test specific for that situation and it passed), it didn't work if uncommented method (or property) followed commented property. This is correctly handled now, so it should work for both cases (added another unit test to cover above situation).

Thanks to "BloodDragon" for pointing this one out.
  • Loading branch information
tomaz committed Jan 29, 2011
1 parent cb7f36c commit 1bf7946
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 7 deletions.
21 changes: 17 additions & 4 deletions Parsing/GBObjectiveCParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ - (BOOL)matchNextObject;
- (BOOL)matchObjectDefinition;
- (BOOL)matchObjectDeclaration;
- (BOOL)matchMethodDataForProvider:(GBMethodsProvider *)provider from:(NSString *)start to:(NSString *)end required:(BOOL)required;
- (void)registerComment:(GBComment *)comment toObject:(GBModelBase *)object;
- (void)registerLastCommentToObject:(GBModelBase *)object;
- (void)registerSourceInfoFromCurrentTokenToObject:(GBModelBase *)object;
- (NSString *)sectionNameFromComment:(GBComment *)comment;
Expand Down Expand Up @@ -218,10 +219,15 @@ - (BOOL)matchMethodDefinitionForProvider:(GBMethodsProvider *)provider required:
- (BOOL)matchPropertyDefinitionForProvider:(GBMethodsProvider *)provider required:(BOOL)required {
GBComment *comment = [self.tokenizer lastComment];
NSString *sectionName = [self sectionNameFromComment:[self.tokenizer previousComment]];
__block BOOL firstToken = YES;
__block BOOL result = NO;
__block GBSourceInfo *filedata = nil;
[self.tokenizer consumeFrom:@"@property" to:@";" usingBlock:^(PKToken *token, BOOL *consume, BOOL *stop) {
if (!filedata) filedata = [self.tokenizer sourceInfoForToken:token];
if (firstToken) {
[self.tokenizer resetComments];
firstToken = NO;
}

// Get attributes.
NSMutableArray *propertyAttributes = [NSMutableArray array];
Expand Down Expand Up @@ -261,7 +267,7 @@ - (BOOL)matchPropertyDefinitionForProvider:(GBMethodsProvider *)provider require
// Register property.
GBMethodData *propertyData = [GBMethodData propertyDataWithAttributes:propertyAttributes components:propertyComponents];
GBLogDebug(@"Matched property definition %@.", propertyData);
[propertyData setComment:comment];
[self registerComment:comment toObject:propertyData];
[propertyData registerSourceInfo:filedata];
[propertyData setIsRequired:required];
[provider registerSectionIfNameIsValid:sectionName];
Expand Down Expand Up @@ -426,6 +432,7 @@ - (BOOL)matchMethodDataForProvider:(GBMethodsProvider *)provider from:(NSString
// In order to provide at least some assurance the minus or plus actually starts the method, we validate next token is opening parenthesis. Very simple so might need some refinement...
if (assertMethod) {
if (![token matches:@"("]) {
[self.tokenizer resetComments];
*stop = YES;
return;
}
Expand Down Expand Up @@ -517,8 +524,8 @@ - (BOOL)matchMethodDataForProvider:(GBMethodsProvider *)provider from:(NSString
// Create method instance and register it.
GBMethodData *methodData = [GBMethodData methodDataWithType:methodType result:methodResult arguments:methodArgs];
GBLogDebug(@"Matched method %@%@.", start, methodData);
[methodData registerSourceInfo:filedata];
[methodData setComment:comment];
[self registerComment:comment toObject:methodData];
[methodData registerSourceInfo:filedata];
[methodData setIsRequired:required];
[provider registerSectionIfNameIsValid:sectionName];
[provider registerMethod:methodData];
Expand All @@ -530,10 +537,16 @@ - (BOOL)matchMethodDataForProvider:(GBMethodsProvider *)provider from:(NSString
}

- (void)registerLastCommentToObject:(GBModelBase *)object {
[object setComment:[self.tokenizer lastComment]];
[self registerComment:[self.tokenizer lastComment] toObject:object];
[self.tokenizer resetComments];
}

- (void)registerComment:(GBComment *)comment toObject:(GBModelBase *)object {
[object setComment:comment];
if (comment) GBLogDebug(@"Assigned comment '%@' to '%@'...", [comment.stringValue normalizedDescription], object);
//[self.tokenizer resetComments];
}

- (void)registerSourceInfoFromCurrentTokenToObject:(GBModelBase *)object {
GBSourceInfo *info = [self.tokenizer sourceInfoForCurrentToken];
[object registerSourceInfo:info];
Expand Down
5 changes: 3 additions & 2 deletions Parsing/GBTokenizer.m
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,9 @@ - (NSString *)commentValueFromString:(NSString *)value {
}

- (void)resetComments {
[self.lastCommentBuilder setString:@"" ];
[self.previousCommentBuilder setString:@"" ];
GBLogDebug(@"Resetting comments...");
[self.lastCommentBuilder setString:@""];
[self.previousCommentBuilder setString:@""];
}

- (GBComment *)lastComment {
Expand Down
15 changes: 14 additions & 1 deletion Testing/GBObjectiveCParser-MethodsParsingTesting.m
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionComment {
assertThat([[(GBModelBase *)[methods objectAtIndex:1] comment] stringValue], is(@"Comment2"));
}

- (void)testParseObjectsFromString_shouldProperlyResetComments {
- (void)testParseObjectsFromString_shouldProperlyResetMethodComments {
// setup
GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
GBStore *store = [[GBStore alloc] init];
Expand All @@ -476,6 +476,19 @@ - (void)testParseObjectsFromString_shouldProperlyResetComments {
assertThat([(GBModelBase *)[methods objectAtIndex:1] comment], is(nil));
}

- (void)testParseObjectsFromString_shouldProperlyResetPropertyComments {
// setup
GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
GBStore *store = [[GBStore alloc] init];
// execute
[parser parseObjectsFromString:@"@interface MyClass /** Comment1 */ @property (readonly) id value; +(void)method2; @end" sourceFile:@"filename.h" toStore:store];
// verify
GBClassData *class = [[store classes] anyObject];
NSArray *methods = [[class methods] methods];
assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
assertThat([(GBModelBase *)[methods objectAtIndex:1] comment], is(nil));
}

- (void)testParseObjectsFromString_shouldRegisterMethodDeclarationComment {
// setup
GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
Expand Down

0 comments on commit 1bf7946

Please sign in to comment.