[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[news.eclipse.tools.jdt] Re: How to remove parameter using ASTParser

Fayezin Islam wrote:
Thanks for your help Mike.

I have done as per your suggestions and it works. But there is a small problem.

In the ASTVisitor, I am changing arguments of method invocations that match the method name. But what if another class has the same method name which I dont want to change?

For example, I want to change all invocation of Class1.method1(int i, String s) only.

But when I run my program, it also changes the invocations of -

Class2 c = new Class2();
c.method1(10, "Hello");

So, I thought it would be better to check both method name of the invocation and class name of the object instance making the call.

Please help me find out how can I achieve this.

Looking forward to your help.

Thanks,

Fayezin Islam

"Mike Yawn" <myawn@xxxxxxxx> wrote in message news:46B8910D.8080108@xxxxxxxxxxx
Fayezin Islam wrote:
Hello,

Suppose, I have a method invocation like -
class1.method1(par1, par2, par3);

I want to change it to:
class1.method1(par2);

How can I do this using the Eclipse ASTParser?

The parameters to be removed are decided by Static Analysis (Program Slicing).

Please note that I should be able to change invocations like these ase well -

class1.method1(new Object(), par2, par3);

Previously, I have analyzed code using the ASTParser but did not transformed/change code as of yet.

Therefore, a reply with an example will be very appreciated...

Thanks,

Fayezin


I don't have an example that does exactly what you're looking for, but the basic steps would be:

- Create a visitor class (extends ASTVisitor); call it something meaningful (like ArgumentRemovalVisitor), as if you work with the AST a lot you'll probably end up creating lots of these.
- Implement a method to visit MethodInvocations:
public boolean visit(MethodInvocation node) { ... }
- Within the visit method:
- check node.getName().getIdentifier() to find the methods you want to alter
- node.arguments() will then be the live list of argument nodes, from which you can delete any arguments that aren't wanted.


- to invoke your visitor, do something like:
ArgumentRemovalVisitor arv = new ArgumentRemovalVisitor();
myCompilationUnit.accept(arv);

The compilation unit in this case is a CompilationUnit, as returned by ASTParser.createAST(), not an ICompilationUnit.





I've only been using the AST for about six months myself, so there's still a lot I'm figuring out. I think you can do what you want this way (but I haven't tried it):


> Class2 c = new Class2();
> c.method1(10, "Hello");

In the method invocation (2nd line), the 'c' is the expression. So you can retrieve that by doing node.getExpression() within the MethodInvocation visitor.

One you have an expression, you should be able to call resolveTypeBinding() on it to get the type (Class2) represented by the expression 'c'.

ITypeBinding itb = node.getExpression().resolveTypeBinding();
You probably want to then call getQualifedName on 'itb' to find the types you intend to operate on.


In order for resolveBinding to work, you have to specify that on your parser when it is created (parser.setResolveBindings(true) ).

Hope that helps,
Mike