从Eclipse的JDT访问者模式

时间:2017-01-05 16:02:44

标签: java abstract-syntax-tree eclipse-jdt visitor-pattern

所以我正在使用Eclipse的JDT API并尝试构建一个小应用程序。但是,我从被访问节点提取数据时陷入困境,因为我只能打印它们。

我希望能够将getSuperclassType()的值返回或添加到List或HashMap中。但是,由于新的ASTVisitor是一个内部类,因此Java不允许我在没有final关键字的情况下声明在ASTVisitor中使用的Object。

private static void get(String src) {
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(src.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setResolveBindings(true);
    parser.setBindingsRecovery(true);

    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

    cu.accept(new ASTVisitor() {
        Set names = new HashSet();

        public boolean visit(TypeDeclaration typeDecNode) {
            if(!typeDecNode.isInterface()) {
                System.out.println(typeDecNode.getName().toString());
                System.out.println(typeDecNode.getSuperclassType());
                System.out.println(typeDecNode.superInterfaceTypes().toString());

                return true;
            }
...

是否可以从这样的代码片段将每个访问节点的所需数据存储到数据结构中?或者可能是另一种在不使用访问者模式的情况下从AST遍历节点的方法吗?

1 个答案:

答案 0 :(得分:2)

只使用扩展class MyVisitor extends ASTVisitor { private List<Type> superTypes = new ArrayList<>(); @Override public boolean visit(TypeDeclaration typeDecNode) { if(!typeDecNode.isInterface()) { superTypes.add(typeDecNode.getSuperclassType()); return true; } } List<Type> getSuperTypes() { return superTypes; } } 的普通类作为访问者,而不是您当前使用的匿名类,并在课堂上存储您喜欢的任何内容。

例如,对于超类型,例如:

MyVisitor myVisitor = new MyVisitor();

cu.accept(myVisitor);

List<Type> superTypes = myVisitor.getSuperTypes();

并使用:

final

或者,您可以访问匿名类中的final List<Type> superTypes = new ArrayList<>(); cu.accept(new ASTVisitor() { public boolean visit(TypeDeclaration typeDecNode) { if(!typeDecNode.isInterface()) { superTypes.add(typeDecNode.getSuperclassType()); return true; } 列表,如下所示:

#include<iostream>
#include<set>
int main(){
    std::set<int> a = {1,2,3,4} , b = {3,4,5};
    for(int const inB : b)
        a.erase(inB);
    for(int const inA : a)
        std::cout << inA << " ";
    std::cout << std::endl;
    return 0;
}