Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crashed when a property with class Keyword #637

Open
Sunny-zhao opened this issue Nov 21, 2018 · 5 comments
Open

Crashed when a property with class Keyword #637

Sunny-zhao opened this issue Nov 21, 2018 · 5 comments

Comments

@Sunny-zhao
Copy link

Define A property like
@Property (nonatomic, class, readonly) NSString *UUID;
In @implementation

  • (NSString *)UUID { return @"xxxx"; }

Oops, something went wrong...
AppledocException: Failed merging @Property xxxxxxxx.UUID to +[xxxxxxxx UUIDt]; method type doesn't match!
@ 0 CoreFoundation 0x00007fff3ed4d43d __exceptionPreprocess + 256
@ 1 libobjc.A.dylib 0x00007fff6ac5a720 objc_exception_throw + 48
@ 2 CoreFoundation 0x00007fff3ed6808e +[NSException raise:format:arguments:] + 98
@ 3 appledoc 0x0000000108f35153 appledoc + 57683
@ 4 appledoc 0x0000000108f4c5a0 appledoc + 152992
@ 5 appledoc 0x0000000108f4c808 appledoc + 153608
@ 6 appledoc 0x0000000108f49335 appledoc + 140085
@ 7 CoreFoundation 0x00007fff3ece29e4 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 219
@ 8 appledoc 0x0000000108f49111 appledoc + 139537
@ 9 appledoc 0x0000000108f4e1ef appledoc + 160239
@ 10 appledoc 0x0000000108f40831 appledoc + 104497
@ 11 appledoc 0x0000000108f38dc0 appledoc + 73152
@ 12 appledoc 0x0000000108f3d7a3 appledoc + 92067
@ 13 appledoc 0x0000000108f3b04e appledoc + 81998
@ 14 appledoc 0x0000000108f3816e appledoc + 69998
@ 15 appledoc 0x0000000108f35fa8 appledoc + 61352
@ 16 appledoc 0x0000000108f3767b appledoc + 67195
@ 17 appledoc 0x0000000108f372ed appledoc + 66285
@ 18 appledoc 0x0000000108f374c1 appledoc + 66753
@ 19 appledoc 0x0000000108f36eaf appledoc + 65199
@ 20 appledoc 0x0000000108f358be appledoc + 59582
@ 21 appledoc 0x0000000108f2a640 appledoc + 13888
@ 22 appledoc 0x0000000108f28df6 appledoc + 7670
@ 23 appledoc 0x0000000108f28f53 appledoc + 8019
@ 24 appledoc 0x0000000108f290e7 appledoc + 8423
@ 25 appledoc 0x0000000108f283ec appledoc + 5100

@bieberstein
Copy link

I'm having the same issue. Is there any update on this?

@ShenYj
Copy link

ShenYj commented Aug 12, 2020

the same.

@ShenYj
Copy link

ShenYj commented Aug 12, 2020

2018.11 ~ Now...

@ShenYj
Copy link

ShenYj commented Aug 25, 2020

/** Defines different method types. */
enum {
	GBMethodTypeClass,		//< Method data describes a class method.
	GBMethodTypeInstance,	//< Method data describes an instance method.
	GBMethodTypeProperty	//< Method data describes a property.
};
typedef NSUInteger GBMethodType;

crashed in 362 line: [NSException raise:@"Failed merging %@ to %@; method type doesn't match!", source, self];

- (BOOL)validateMergeWith:(GBMethodData *)source {
	// Validates merging with the given method. This method raises exception if merging is not allowed based on method types. It takes into account manual propery accessors and mutators! Note that in case class method is being matched with instance, we prevent merging - this is to allow same selectors (due to how we currently handle class/instance methods (i.e. don't distinguish between them when matching by selectors) we simply need to prevent merging taking place in such case).
	if (source.methodType != self.methodType) {
		GBMethodData *propertyData = nil;
		GBMethodData *manualData = nil;
		if (self.methodType == GBMethodTypeProperty && source.methodType == GBMethodTypeInstance) {
			propertyData = self;
			manualData = source;
		} else if (self.methodType == GBMethodTypeInstance && source.methodType == GBMethodTypeProperty) {
			propertyData = source;
			manualData = self;
		} else if (self.methodType == GBMethodTypeInstance && source.methodType == GBMethodTypeClass) {
			return NO;
		} else if (self.methodType == GBMethodTypeClass && source.methodType == GBMethodTypeInstance) {
			return NO;
		} else if (self.methodType == GBMethodTypeProperty && source.methodType == GBMethodTypeClass) {
			return NO;
		} else {
			[NSException raise:@"Failed merging %@ to %@; method type doesn't match!", source, self];
		}
		
		// We should allow if the getter or setter matches and if the getter name is shared to an instance method.
		if ([propertyData.propertyGetterSelector isEqualToString:manualData.methodSelector]) return YES;
		if ([propertyData.propertySetterSelector isEqualToString:manualData.methodSelector]) return YES;
		if (![propertyData.propertyType isEqualToString:manualData.methodReturnType]) return YES;
        [NSException raise:@"Failed merging %@ to %@; getter or setter doesn't match", source, self];
	} else {
		// If assertion from code below is present, it breaks cases where category declares a property which is also getter for a property from class declaration. See #184 https://github.com/tomaz/appledoc/issues/184 for details. I'm leaving the code commented for the moment to see if it also affects some other user (don't think so, but just in case).
		//NSParameterAssert([source.methodSelector isEqualToString:self.methodSelector]);
	}
	return YES;
}

@b9AobJ
Copy link

b9AobJ commented May 25, 2022

        else if (self.methodType == GBMethodTypeClass && source.methodType == GBMethodTypeProperty) {
            propertyData = source;
            manualData = self;
        }  else {
		[NSException raise:@"Failed merging %@ to %@; method type doesn't match!", source, self];
	}

can pass err but no support to docset content about class keyword property

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants