クラス情報をクラスObjCPropertyDecl
から抜き出すのに問題があります。ObjCPropertyDeclからクラス情報を取得
例のObjective-Cファイル:私はそれがあったかどうかを確認するためにタイプをチェックしに頼っOCLintルールを持っていた、以前
...
|-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 *> *'
...
:ASTのダンプ
#import <Foundation/Foundation.h>
@interface Test: NSObject
@property (nonatomic, strong, nullable) NSObject *test;
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
@end
@implementation Test
@end
は私にこれを提供します
string propertyType = node->getType().getAsString();
// compare to "NSArray *"
注:NSArray
ので、私はASTVisitor
と、このコードを使用すると思います上記のコードサンプルのnullable
キーワードとジェネリックスの両方が修飾型を変更します(ASTダンプを参照)。
私の質問は:ObjCPropertyDecl
からObjective-Cクラスタイプのみを取得できる方法はありますか? NSArray *
またはNSString *
余分な砂糖は一切ありませんか?
私はgetSplitDesugaredType();
を試しましたが、それはヌル可能な部分を削除するのには効果的ですが、ジェネリックは削除されません。
編集:
私の現在の考えは、私はその後、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;
戻り値:NSObject
@property (nonatomic, strong, nullable) NSArray<NSObject *> *test1;
戻り値:NSArray
注