很好的问题。在当前版本中,修饰符存储为声明上的注释。默认情况下,访问语句不会访问注释,因此您必须自己将它们投影出来:
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");
}
}
}
请注意,它d@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 ]