首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从ObjCPropertyDecl获取类信息

从ObjCPropertyDecl获取类信息
EN

Stack Overflow用户
提问于 2016-05-20 22:39:24
回答 1查看 327关注 0票数 2

我在从clang ObjCPropertyDecl类型提取类信息时遇到了一些问题。

示例目标-C文件:

代码语言:javascript
运行
复制
#import <Foundation/Foundation.h>

@interface Test: NSObject

@property (nonatomic, strong, nullable) NSObject *test;
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;

@end

@implementation Test

@end

倾倒垃圾给了我这个:

代码语言:javascript
运行
复制
...
|-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和下面的代码:

代码语言:javascript
运行
复制
string propertyType = node->getType().getAsString();
// compare to "NSArray *"

请注意,上面代码示例中的nullable关键字和泛型都更改了限定类型(请参阅AST转储)。

我的问题是:是否有一种方法可以从ObjCPropertyDecl (例如NSArray *NSString * )获得目标-C类类型,而不需要任何额外的糖?

我尝试过getSplitDesugaredType();,这对于删除可空的部分很有效,但这并不能删除泛型。

编辑:

我目前的想法是,我可能能够从Type中获得SplitQualType,然后转换到ObjCObjectPointerType并得到ObjCObjectType,这可能有我想要的信息,但是,我明天将尝试实现它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-23 19:24:54

好的,在深入研究之后,我找到了一个可以接受的解决方案:

代码语言:javascript
运行
复制
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;返回:NSObject

@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;返回:NSArray

注意:这将只返回对象指针类型的值,标量值的属性(如NSInteger等)将返回空字符串。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37356853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档