2016-05-20 12 views
1

クラス情報をクラス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

答えて

0

OK]をクリックして、後に多くの周り掘り、私はこれに受け入れ可能な解決策を見つけました:これはオブジェクトポイントの値のみを返しますスカラー値のプロパティ、NSIntegerなどの空の文字列を返します。

関連する問題