源码

首页 » 归档 » 源码 » Clang 之旅–实现一个自定义检查规范的 Clang 插件

Clang 之旅–实现一个自定义检查规范的 Clang 插件

Clang 之旅系列文章:
Clang 之旅--使用 Xcode 开发 Clang 插件
Clang 之旅--[翻译]添加自定义的 attribute
Clang 之旅--实现一个自定义检查规范的 Clang 插件

前言

在 Clang 之旅系列文章开篇的时候,我说到过自己接触 Clang 的直接原因就是想实现一个自定义的检查需求:是否有办法在编译阶段检查某个方法的参数与返回值的类型相同,如果类型不一致的话能抛出编译错误的提示。现在我已经根据自己的需求完成了这个插件,这篇文章会讲解这个插件的实现思路,对应的代码在这里:https://github.com/VernonVan/SameTypeClangPlugin

具化需求

首先我先将需求具化一下,之前说的比较宽泛。

试想我们有这么一个函数modelOfClass:

- (__kindof NSObject *)modelOfClass:(Class)modelClass 
{ if ([modelClass isKindOfClass:[NSString class]]) { return [[NSString alloc] init];
    } else if ([modelClass isKindOfClass:[NSArray class]]) { return [[NSArray alloc] init];
    } return nil;
}

modelOfClass接受一个Class类型的参数,然后会根据Class对应的类进行不同的操作,最终返回处理好的Class对应类的实例对象。我们用__kindof NSObject *返回值类型来保证返回的一定是NSObject或者其子类,能保证的也只有这样而已。但是,存在这样一种错误的调用方式,但是却能通过编译:

@property (nonatomic, strong) NSString *myString; @property (nonatomic, strong) NSArray *myArray;

- (void)someMethod
{ self.myString = [self modelOfClass:[NSString class]]; self.myArray = [self modelOfClass:[NSString class]];
}

可以发现,someMethod中有两行modelOfClass的函数调用。第一行调用是正确的,NSString *类型的属性myString调用时传入的是[NSString class];第二行调用是错误的,NSArray *类型的属性myArray调用时传入的是[NSString class]。也就是说,在 Objective-C 语言中,并没有一种办法能够检查函数调用时参数类型和返回值类型是完全一致的。

这个需求是从我所在公司的项目中抽象简化出来的,大家看不出来这个函数究竟是用来干什么的,可能会觉得这个需求并不常见,没有什么通用性。但是这篇文章希望读者看了之后能以小见大,举一反三,更重要的是学到怎么样使用通用的方式,根据自己的需求实现自定义检查规范的 Clang 插件。

最终效果

我们来看看最终实现的效果:

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/clang-zhilv-shixianyigezidingyijianchaguifande-clang-chajian.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:4月 20, 2018 at 04:08 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复