1

我需要获取源代码中所有变量的IField 或 IJavaElement 引用。我使用插件,得到一个 ICompilationUnit,我可以从中读取所有顶级对象:

for(IJavaElement i:unit.getTypes()[0].getChildren())

或者

for(IJavaElement i:unit.getAllTypes())

如何访问局部变量?我试图将 ICompilationUnit 解析为 CompilationUnit,在那里我可以获得每个 field 的 ASTNode,但是我无法将它转换为 IField。有任何想法吗?

//编辑:例如:对于一个类:

公共类测试{

诠释全球1;诠释全球2;无效 a() { global1 = 4; 诠释本地1;int local2 = 5; }

}

我打电话

for (IType type : unit.getTypes()) { System.out.println("itype "+type); for (IField iField : type.getFields()) { System.out.println("iField "+iField); }}

输出是:

itype class Test [in [Working copy] Test.java [in [in [in src [in testowy]]]] int global1 int global2 void a() iField int global1 [in Test [in [Working copy] Test.java [in [在 src [in testowy]]]]] iField int global2 [in Test [in [Working copy] Test.java [in [in [in src [in testowy]]]]]

所以没有找到局部变量...

//添加 - 仍在挣扎:实际上这不是我所期望的行为。

for( IMethod i:unit.getAllTypes()[0].getMethods() )
        {
        System.out.println("index to h:"+h+" type "+i.getSource()+" name: "+i.getElementName());
        h++;
        int o =0;
        for( IJavaElement j: i.getChildren() )
            {
                System.out.println("index to o: "+o+j+" type "+j.getElementType()+" name: "+j.getElementName());
                o++;
            }

        }

这段代码我期望找到所有方法(有效)并从方法中获取所有局部变量(无效)。它永远不会进入带有字段的循环。它正确打印函数声明,所以我确定它可以看到所有变量......

至于使用 INodes,我可以访问所有节点,但是如何将类型从 Node 更改为我需要的 IField/IJavaElement?

谢谢 :)

4

1 回答 1

1

如果您只想获取某个类型的字段,可以这样做:

for (IType type : iCompilationUnit.getTypes()) {
    for (IField iField : type.getFields()) {
        ....
    }
}

但是,如果要查找所有变量声明(字段和局部变量),最好使用ASTVisitor。这将访问您的整个 AST,您只需为所需的 AST 元素实现访问方法,在您的情况下,我猜这将是VariableDeclarationFragment的。

于 2011-05-14T09:51:08.583 回答