素晴らしい質問です。現在のバージョンでは、修飾子は宣言の注釈として保存されます。注釈は、デフォルトでは 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 ]