EN JP CN

例 3:クラスとメンバーのリスト作成

例 3:クラスとメンバーのリスト作成

この例では、セマンティックスツリーを使用して、対象となるノードが属するクラスのすべてのメンバーを探します。見つかったら、この時点ではログだけしてプレースホルダーを返します。

新しいテストケースコードの作成

まず、testcase.cc コードを次のように変更します。

 class CFoo
 {
 public:
   CFoo() { init(); }
   CFoo(int x) { init(x); }
   void init(int x = 0, const char* y = 0);
  
 private:
   int m_x;
   const char* m_y;
 };
  
 void CFoo::init(int x, const char* y)
 {
   m_x = x;
   m_y = y;
 }


クラスのチェックの追加

次にチェッカーパターンを変更して、チェッカーが 'init' 関数の関数定義だけに呼び出されるようにします。関数名をログするだけであるため、単純なカスタム述語の関数タイプに切り替え、これを listClassInfo() と呼ぶことにします。

<error id="EX.FIRST" enabled="true" severity="3"
  title="Function Definition" message="Called.">
  <pattern> 
    // FuncDef [ getName() = ‘init’] [
    listClassInfo() ]  
  </pattern>
</error>      

次に、外側のスコープまでセマンテックスツリーをナビゲートして、このスコープがクラスであることを検証し、ビルドログにクラス名をログするカスタム述語を作成します。

 #include <stdio.h>
 #include <XPath_plugins.h>
 #include <ktcAPI.h>
   
 int listClassInfo(ktc_tree_t node)
 {      
   ktc_semanticInfo_t si = ktc_getSemanticInfo(node);
   if( ktc_sema_isFunction(si) )
   {
     ktc_semanticInfo_t ci = ktc_sema_getScope(si);
     if( ci && ktc_sema_isClass(ci) )
       fprintf(stderr, "Class name: %s\n", ktc_sema_getIdentifier(ci));
   }
  
   return 1;
 }
  
 HOOKS_SET_START
   XPath_register_int_hook("listClassInfo", listClassInfo);
 HOOKS_SET_END

このチェッカーを新しいテストケースに実行すると、ビルドログには以下の行が含まれます。

Class name: CFoo

クラスメンバーのリストの追加

メンバー関数の定義からその周辺クラスのスコープまで説明しました。次にすべてのクラスメンバーをリストし、それをログします。ktc API は、クラスまたはいずれかのスコープのすべてのメンバーに、繰り返し適用されるシンプルな手段を提供します。これは前回のコードを変更して使用することができます。

 #include <stdio.h>
 #include <XPath_plugins.h>
 #include <ktcAPI.h>
  
 void logger(ktc_semanticInfo_t mi)
 {
   fprintf(stderr, "\tMember: %s\n", ktc_sema_getQualifiedName(mi));
 }
  
 int listClassInfo(ktc_tree_t node)
 {      
   ktc_semanticInfo_t si = ktc_getSemanticInfo(node);
   if( ktc_sema_isFunction(si) )
   {
     ktc_semanticInfo_t ci = ktc_sema_getScope(si);
     if( ci && ktc_sema_isClass(ci) )
     {
       fprintf(stderr, "Class name: %s\n", ktc_sema_getIdentifier(ci));
       ktc_sema_forAllClassDeclarations(ci, logger);
     }
   }
        
   return 1;
 }
  
 HOOKS_SET_START
   XPath_register_int_hook("listClassInfo", listClassInfo);
 HOOKS_SET_END

チェッカーを実行すると、ビルドログに以下のエントリが表示されます。

Class name: CFoo
        Member: CFoo::#destructor
        Member: CFoo::m_x
        Member: CFoo::m_y
        Member: CFoo::#constructor
        Member: CFoo::#constructor
        Member: CFoo::init
        Member: CFoo::init

logger 関数のフィルター処理

チェッカーは、メソッドまたは変数であるとにかかわらず、クラスメンバーの各宣言または定義をログします。メンバー変数に絞り込むには、logger() 関数にフィルターを追加します。

 void logger(ktc_semanticInfo_t mi)
 {
   if( ktc_sema_isVariable(mi) )
     fprintf(stderr, "\tMember: %s\n", ktc_sema_getQualifiedName(mi));
 }


ビルドログに以下が含まれるようになります。

Class name: CFoo
        Member: CFoo::m_x
        Member: CFoo::m_y