问题
How do I run the plugin project under Resources [1] here: http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation%5FAST/index.html
If I am not wrong, the project starting point is here public class ASTArticleActionDelegate implements IObjectActionDelegate -> public void run(IAction action)
public void run(IAction action) {
if (selection instanceof IStructuredSelection) {
ICompilationUnit lwUnit = (ICompilationUnit) ((IStructuredSelection) selection).getFirstElement();
createActionExecutable(action.getId()).run(lwUnit);
}
}
I know I should run it as an Eclipse Application, but what should I do after that to see something? I only see an Eclipse application started, and nothing else, no button or anything!
I search for "IObjectActionDelegate" and it seems like it has something to do with context menu, which is I should see something when I right click on something (IStructuredSelection - tree structure?)? But I see no difference in the context menu!
Just let me know an example of a way to see that this project is running, so that I would be able to use it.
回答1:
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.
来源:https://stackoverflow.com/questions/1383139/running-an-eclipse-plugin