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.