У меня возникли проблемы с извлечением информации о классе из clang ObjCPropertyDecl
.Получить информацию о классе от ObjCPropertyDecl
Пример 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).
Мой вопрос: есть ли способ получить только тип класса Objective-C от ObjCPropertyDecl
, например. NSArray *
или NSString *
без какого-либо дополнительного сахара?
Я пробовал getSplitDesugaredType();
, и это хорошо работает для удаления элементов с нулевым значением, но не удаляет дженерики.
Edit:
Мой текущий мышления является то, что я мог бы быть в состоянии получить Type
от SplitQualType
затем отливали в ObjCObjectPointerType
и получить ObjCObjectType
и что может иметь информацию, которую я хочу, но я постараюсь реализации, что завтра.