The proper way to test this AST project example (net.sourceforge.earticleast.app_1.0.0.zip_1.0.0.zip) is to:
- unzip that package
- import the project within that package in your current eclipse workspace
- right-click on the project and select "Debug As > Eclipse Application"
(Note the "Debug As", to be able to set breakpoint within your first eclipse instance)
Once the second eclipse is launched, you can:
- go to Help/Anout Eclipse SDK, click on "installation details", click "Plugins" and see right at the top the plugin "Abstract Syntax Tree Article, Example Application Plugin", id "
net.sourceforge.earticleast.app"
- Import any project in that new workspace of that second eclipse instance (you can for instance re-importe the
net.sourceforge.earticleast.app project!)
- right-click on any class and see a custom entry in the contextual menu: "
Ast article: Move Declaration" (the action to detect contradicting variable declarations and to move them to their correct place)
So now almost everything is in place to test those AST manipulation.
One last thing: create a Java Unit compilation able to highlights those variable declarations rewrites.
Create in your imported project (whatever it is) a package test, with the class:
package test;
public class Test {
static {
int i = 2;
System.out.println("test");
System.out.println(i);
}
}
Right-click on that class and select "Ast article: Move Declaration": see the source being instantly rewritten as:
package test;
public class Test {
static {
System.out.println("test");
int i = 2;
System.out.println(i);
}
}
From the first instance of the eclipse, you can set up some breakpoints in:
ASTArticleMoveVariableDeclaration:run()
AbstractManipulator:manipulate(final CompilationUnit unit, Collection<VariableBindingManager> managers)
to see where the magic is happening.
The other cases of "Move Declaration" cases are:
static {
int i = 2;
System.out.println("test");
try
{
System.out.println(i);
}
catch(Exception e)
{
System.out.println(i);
}
}
which get rewritten as:
static {
System.out.println("test");
int i = 2;
try
{
System.out.println(i);
}
catch(Exception e)
{
System.out.println(i);
}
}
Finally, there is a more advanced move which is:
package test;
public class Test {
static {
int i = 2;
i = 3;
System.out.println(i);
}
}
package test;
public class Test {
static {
i = 3;
int i = 3;
System.out.println(i);
}
}
'int i = 2' has been correctly removed. However, note the 'i = 3' which is left: that is because the new declaration node 'int i = 3 is added after 'i = 3' instead of replacing it.
After some debugging, it turns out ASTRewriteBasedManipulator:addNewVariableDeclaration() forgets to remove the initializer 'i=3' which it is supposed to replaced with the declaration 'int i = 3'.
Just add at the end of this method:
rewrite.remove(manager.getInitializer().getParent().getParent(), null);
and you are good to go.