6

Objective-C のメソッド呼び出しにパラメーターのクラス名を抽出しようとしています。私が解析しているコードは次のとおりです。

- (void)testAddConcreteDataModel:(DFDemoDataModelOne*)helpmeh {
    [self.dataModels addObject:helpmeh];
}

必要な結果は、「DFDemoDataModelOne」である helpmeh のクラスのタイプです。

これまでのところ、出力する次のコードがあります。"[(DFDataModelContainer).dataModels addObject:helpmeh]"

    if (cursor.kind == CXCursor_ObjCMessageExpr) {
        __block NSString* memberName = nil;
        __block NSString* ownerClassName = nil;
        __block NSString* methodName = [NSString stringWithUTF8String:clang_getCString(clang_getCursorDisplayName(cursor))];

        clang_visitChildrenWithBlock(cursor, ^enum CXChildVisitResult(CXCursor cursor, CXCursor parent) {
            if (cursor.kind == CXCursor_MemberRefExpr) {
                memberName = [NSString stringWithUTF8String:clang_getCString(clang_getCursorDisplayName(cursor))];
                ownerClassName = [NSString stringWithUTF8String:clang_getCString(clang_getCursorDisplayName(clang_getCursorSemanticParent(clang_getCursorReferenced(cursor))))];
            } else {
                if (memberName) {
                    NSString* param = [NSString stringWithUTF8String:clang_getCString(clang_getCursorDisplayName(cursor))];
                    NSLog(@"[(%@).%@ %@%@]", ownerClassName, memberName, methodName, param);
                    clang_visitChildrenWithBlock(cursor, ^enum CXChildVisitResult(CXCursor cursor, CXCursor parent) {

                         // test
                         if ([param isEqualToString:@"helpmeh"] && cursor.kind == CXCursor_DeclRefExpr) {
                            // found the interesting part.. what now?
                         }
                         return CXChildVisit_Recurse;
                     }
                }
            }
            return CXChildVisit_Continue;
        }
    }

カーソルから情報を抽出する方法について少し迷っています-クラスをASTダンプすると、必要な情報がすべてそこにあることがわかります(最後の行を参照):

|-ObjCMethodDecl 0x112790f90 <line:32:1, line:34:1> - testAddConcreteDataModel: 'void'
  | |-ImplicitParamDecl 0x112791960 <<invalid sloc>> self 'DFDataModelContainer *const __strong'
  | |-ImplicitParamDecl 0x1127919c0 <<invalid sloc>> _cmd 'SEL':'SEL *'
  | |-ParmVarDecl 0x112791040 <line:32:35, col:55> helpmeh 'DFDemoDataModelOne *__strong'
  | `-CompoundStmt 0x112791bf0 <col:63, line:34:1>
  |   `-ExprWithCleanups 0x112791bd8 <line:33:5, col:39> 'void'
  |     `-ObjCMessageExpr 0x112791ba0 <col:5, col:39> 'void' selector=addObject:
  |       |-PseudoObjectExpr 0x112791b48 <col:6, col:11> 'NSMutableArray *'
  |       | |-ObjCPropertyRefExpr 0x112791ad0 <col:6, col:11> '<pseudo-object type>' lvalue objcproperty Kind=PropertyRef Property="dataModels" Messaging=Getter
  |       | | `-OpaqueValueExpr 0x112791ab0 <col:6> 'DFDataModelContainer *'
  |       | |   `-ImplicitCastExpr 0x112791a40 <col:6> 'DFDataModelContainer *' <LValueToRValue>
  |       | |     `-DeclRefExpr 0x112791a18 <col:6> 'DFDataModelContainer *const __strong' lvalue ImplicitParam 0x112791960 'self' 'DFDataModelContainer *const __strong'
  |       | |-OpaqueValueExpr 0x112791ab0 <col:6> 'DFDataModelContainer *'
  |       | | `-ImplicitCastExpr 0x112791a40 <col:6> 'DFDataModelContainer *' <LValueToRValue>
  |       | |   `-DeclRefExpr 0x112791a18 <col:6> 'DFDataModelContainer *const __strong' lvalue ImplicitParam 0x112791960 'self' 'DFDataModelContainer *const __strong'
  |       | `-ImplicitCastExpr 0x112791b30 <col:11> 'NSMutableArray *' <ARCReclaimReturnedObject>
  |       |   `-ObjCMessageExpr 0x112791b00 <col:11> 'NSMutableArray *' selector=dataModels
  |       |     `-OpaqueValueExpr 0x112791ab0 <col:6> 'DFDataModelContainer *'
  |       |       `-ImplicitCastExpr 0x112791a40 <col:6> 'DFDataModelContainer *' <LValueToRValue>
  |       |         `-DeclRefExpr 0x112791a18 <col:6> 'DFDataModelContainer *const __strong' lvalue ImplicitParam 0x112791960 'self' 'DFDataModelContainer *const __strong'
  |       `-ImplicitCastExpr 0x112791b88 <col:32> 'id':'id' <BitCast>
  |         `-ImplicitCastExpr 0x112791b70 <col:32> 'DFDemoDataModelOne *' <LValueToRValue>
  |           `-DeclRefExpr 0x112791a88 <col:32> 'DFDemoDataModelOne *__strong' lvalue ParmVar 0x112791040 'helpmeh' 'DFDemoDataModelOne *__strong'

どんなポインタでも大歓迎です!

4

2 に答える 2

4

clang_getCursorSemanticParent関数を調べてみましたか?

ObjC コードについてはお手伝いできませんが、一般的な考え方は次のようになります。

  1. clang_getCursorSemanticParentクラス宣言のカーソルを取得するための呼び出し
  2. clang_getCursorSpellingクラス宣言カーソルでorを呼び出しclang_getCursorDisplayNameて、クラス名を取得します
于 2013-07-20T21:12:28.623 に答える