1

Rascal m3 Java 抽象语法树中的修饰符节点是否存在?我想检查某个方法是公共的、私有的还是受保护的。

在描述中,声明了一个抽象数据类型,但是在我尝试访问的任何文件中,都没有找到匹配项。

在其他 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

很好的问题。在当前版本中,修饰符存储为声明上的注释。默认情况下,访问语句不会访问注释,因此您必须自己将它们投影出来:

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 ]
于 2014-05-13T19:14:41.900 回答