1

Rascal m3 Java Abstract Syntax ツリーに修飾子ノードは存在しますか? 特定のメソッドがパブリック、プライベート、または保護されているかどうかを確認したい。

説明では、抽象データ型が宣言されていますが、アクセスしようとしたファイルには一致するものはありません。

他の ADT にも修飾子へのリンクはありません。修飾子を見つけようとするコードの下。

public void visitModifier(loc file){ Declaration decl = createAstFromFile(file, true); visit(decl){ case \private(): println("private"); case \public(): println("public"); case \protected(): println("protected"); } }

4

1 に答える 1

2

素晴らしい質問です。現在のバージョンでは、修飾子は宣言の注釈として保存されます。注釈は、デフォルトでは visit ステートメントによって訪問されないため、自分で射影する必要があります。

void visitModifier(loc file){
  Declaration decl = createAstFromFile(file, true);
  visit (decl){
    case Declaration d: 
       switch (d@modifiers?[]) { // get out the modifiers or generate empty list 
          case [*_,\public(),*_]   : println("public");
          case [*_,\private(),*_]  : println("private");
          case [*_,\protected(),*_]: println("protected");
          default                  : println("friendly");
        }
  }
}

修飾子のリストが生成されることに注意してください。そのため、andd@modifiersも検索できます。もちろん、リストマッチングなしでも実行できます。\static()\final()

void visitModifier2(loc file){
  Declaration decl = createAstFromFile(file, true);
  visit (decl){
    case Declaration d: {
       mods = d@modifiers?[];
       if (\public() <- mods) // or if (\public() in mods)
         println("public");
       else if (\private() <- mods)
         println("private");
       else if (\protected() <- mods)
         println("protected");
       else
         println("friendly");
    }
  }
}

または、次のようにリスト内のすべての修飾子を収集することもできます。

[ *(d@modifiers?[]) | /Declaration d := decl ]
于 2014-05-13T19:14:41.900 に答える