- Eclipse Refactoring Introduction (pdf)
- The Language Toolkit: An API for Automated Refactorings in Eclipse-based IDEs
- Unleashing the Power of Refactoring
- My buddy's Luis Diego Fallas excelent post: Creating Java refactorings with Scala and Eclipse LTK
In this post I'll talk about how I got started and I'll introduce the main components of a refactoring in eclipse in a very concise way. I want this post to be more like an entry point for someone who wants to start exploring the JDT/LTK SDK and is a little lost like I was at the time.
Originally my intention was to create a set of refactorings to promote functional programming practices in java. First I would try to add a Quick Fix to add the final modifier to private fields that are not changed inside the class in an attemp to promote unmutable objects. I hadn't developed in java for a while and I forgot that the final modifier in java works differently then C#'s readonly which was what I had in mind when I thought of the Quick Fix. But I proceeded anyway.
Because most of the resources I had found were related to refactoring I decided to start by implementing a refactoring named 'To Final" and after that, move it to a Quick fix.
This was my plan of action:
- Create the project using the wizard
- Invoke a dummy refactoring
- From that point start building the core functionality.
Creating The Project.
This is an easy one. Eclipse has a bunch template projects to get started with the SDK. I started with the good old Hello World.The Dummy Refactoring
Turns out a Dummy Refactoring is not so Dummy after all. There are two approaches on how to build refactorings.The old-school way
It can be done using set of classes that work together to get the job done:RefactoringWizard:
This class is responsible for providing all the pages (forms) for user input, also provides the preview and an error page.
RefactoringContribution:
This class provides a way to create refactorings for scripting and history. I didn't use it. Because of that my plugin cannot be used in scripts.
Refactoring:
This is the meaty part. This class is responsible of validating that the refactoring can be performed and return an object that describes the set of changes required to complete the refactoring. The aforementioned object is an instance of the class Change that is used to generate the preview and if the changes are accepted is used to perform the actual changes in the source code.
RefactoringDescriptor:
As far as I know the RefactoringDescriptor is used with the RefactoringContribution to automate refactoring executions. In my case I ignored this one too.