从 ObjCPropertyDecl 获取 class 信息
Get class information from ObjCPropertyDecl
我在从 clang ObjCPropertyDecl
类型中提取 class 信息时遇到了一些问题。
示例 Objective-C 文件:
#import <Foundation/Foundation.h>
@interface Test: NSObject
@property (nonatomic, strong, nullable) NSObject *test;
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
@end
@implementation Test
@end
转储 ast 给了我这个:
...
|-ObjCInterfaceDecl 0x104bbf8e0 <test.m:7:1, line:12:2> line:7:12 Test
| |-super ObjCInterface 0x103962618 'NSObject'
| |-ObjCImplementation 0x104bbff40 'Test'
| |-ObjCPropertyDecl 0x104bbfa20 <line:9:1, col:51> col:51 test 'NSObject * _Nullable':'NSObject *' readwrite nonatomic strong
| |-ObjCPropertyDecl 0x104bbfbe0 <line:10:1, col:62> col:62 test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *' readwrite nonatomic strong
| |-ObjCMethodDecl 0x104bbfc50 <line:9:51> col:51 implicit - test 'NSObject * _Nullable':'NSObject *'
| |-ObjCMethodDecl 0x104bbfcd8 <col:51> col:51 implicit - setTest: 'void'
| | `-ParmVarDecl 0x104bbfd60 <col:51> col:51 test 'NSObject * _Nullable':'NSObject *'
| |-ObjCMethodDecl 0x104bbfdc8 <line:10:62> col:62 implicit - test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *'
| `-ObjCMethodDecl 0x104bbfe50 <col:62> col:62 implicit - setTest1: 'void'
| `-ParmVarDecl 0x104bbfed8 <col:62> col:62 test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *'
...
以前,我有一个 OCLint 规则依赖于检查类型以查看它是否是 NSArray
,所以我会使用 ASTVisitor
和此代码:
string propertyType = node->getType().getAsString();
// compare to "NSArray *"
请注意,上面代码示例中的 nullable
关键字和泛型都会更改限定类型(请参阅 AST 转储)。
我的问题是:有没有一种方法可以从 ObjCPropertyDecl
中仅获取 Objective-C class 类型,例如NSArray *
或 NSString *
没有任何额外的糖?
我试过 getSplitDesugaredType();
并且它适用于删除可为 null 的部分但不会删除泛型。
编辑:
我目前的想法是,我可以从 SplitQualType
中获取 Type
,然后转换为 ObjCObjectPointerType
并获取 ObjCObjectType
,这可能有我想要的信息,但我会在明天尝试实施。
好的,经过大量挖掘,我找到了一个可以接受的解决方案:
std::string propertyType(clang::ObjCPropertyDecl *d) {
QualType T = d->getType();
if (auto TypePtr = T.getTypePtr()) {
if (TypePtr->isObjCObjectPointerType()) {
if (auto InterfaceType = TypePtr->getAsObjCInterfacePointerType()) {
return InterfaceType->getObjectType()->getBaseType().getAsString();
}
}
}
return "";
}
示例:
@property (nonatomic, strong, nullable) NSObject *test;
Returns: NSObject
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
Returns: NSArray
注意:这只会 return 对象指针类型的值,NSInteger
等标量值的属性,return 空字符串。
我在从 clang ObjCPropertyDecl
类型中提取 class 信息时遇到了一些问题。
示例 Objective-C 文件:
#import <Foundation/Foundation.h>
@interface Test: NSObject
@property (nonatomic, strong, nullable) NSObject *test;
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
@end
@implementation Test
@end
转储 ast 给了我这个:
...
|-ObjCInterfaceDecl 0x104bbf8e0 <test.m:7:1, line:12:2> line:7:12 Test
| |-super ObjCInterface 0x103962618 'NSObject'
| |-ObjCImplementation 0x104bbff40 'Test'
| |-ObjCPropertyDecl 0x104bbfa20 <line:9:1, col:51> col:51 test 'NSObject * _Nullable':'NSObject *' readwrite nonatomic strong
| |-ObjCPropertyDecl 0x104bbfbe0 <line:10:1, col:62> col:62 test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *' readwrite nonatomic strong
| |-ObjCMethodDecl 0x104bbfc50 <line:9:51> col:51 implicit - test 'NSObject * _Nullable':'NSObject *'
| |-ObjCMethodDecl 0x104bbfcd8 <col:51> col:51 implicit - setTest: 'void'
| | `-ParmVarDecl 0x104bbfd60 <col:51> col:51 test 'NSObject * _Nullable':'NSObject *'
| |-ObjCMethodDecl 0x104bbfdc8 <line:10:62> col:62 implicit - test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *'
| `-ObjCMethodDecl 0x104bbfe50 <col:62> col:62 implicit - setTest1: 'void'
| `-ParmVarDecl 0x104bbfed8 <col:62> col:62 test1 'NSArray<NSObject *> * _Nullable':'NSArray<NSObject *> *'
...
以前,我有一个 OCLint 规则依赖于检查类型以查看它是否是 NSArray
,所以我会使用 ASTVisitor
和此代码:
string propertyType = node->getType().getAsString();
// compare to "NSArray *"
请注意,上面代码示例中的 nullable
关键字和泛型都会更改限定类型(请参阅 AST 转储)。
我的问题是:有没有一种方法可以从 ObjCPropertyDecl
中仅获取 Objective-C class 类型,例如NSArray *
或 NSString *
没有任何额外的糖?
我试过 getSplitDesugaredType();
并且它适用于删除可为 null 的部分但不会删除泛型。
编辑:
我目前的想法是,我可以从 SplitQualType
中获取 Type
,然后转换为 ObjCObjectPointerType
并获取 ObjCObjectType
,这可能有我想要的信息,但我会在明天尝试实施。
好的,经过大量挖掘,我找到了一个可以接受的解决方案:
std::string propertyType(clang::ObjCPropertyDecl *d) {
QualType T = d->getType();
if (auto TypePtr = T.getTypePtr()) {
if (TypePtr->isObjCObjectPointerType()) {
if (auto InterfaceType = TypePtr->getAsObjCInterfacePointerType()) {
return InterfaceType->getObjectType()->getBaseType().getAsString();
}
}
}
return "";
}
示例:
@property (nonatomic, strong, nullable) NSObject *test;
Returns: NSObject
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
Returns: NSArray
注意:这只会 return 对象指针类型的值,NSInteger
等标量值的属性,return 空字符串。