Can I automatically refactor an entire java projec

2019-01-25 08:49发布

问题:

I'm working in a java project where a big part of the code was written with a formatting style that I don't like (and is also non standard), namely all method parameters are in uppercase (and also all local variables).

On IntellJ I am able to use "Analyze -> Inspect Code" and actually find all occurrences of uppercase method parameters (over 1000).

To fix one occurrence I can do "refactor > rename parameter" and it works fine (let's assume there is no overlapping).

Is there a way to automagically doing this refactor (e.g: rename method parameter starting with uppercase to same name starting with lowercase)?

回答1:

Use a Source Parser

I think what you need to do is use a source code parser like javaparser to do this.

For every java source file, parse it to a CompilationUnit, create a Visitor, probably using ModifierVisitorAdapter as base class, and override (at least) visit(MethodDeclaration, arg). Then write the changed CompilationUnit to a new File and do a diff afterwards.

I would advise against changing the original source file, but creating a shadow file tree may me a good idea (e.g. old file: src/main/java/com/mycompany/MyClass.java, new file src/main/refactored/com/mycompany/MyClass.java, that way you can diff the entire directories).



回答2:

I'd advise that you think about a few things before you do anything:

  1. If this is a team effort, inform your team.
  2. If this is for an employer, inform your boss.
  3. If this is checked into a version control system, realize that you'll have diffs coming out the wazoo.
  4. If it's not checked into a version control system, check it in.
  5. Take a backup before you make any changes.
  6. See if you have some tests to check before & after behavior hasn't changed.

This is a dangerous refactoring. Be careful.



回答3:

I am not aware of any direct support for such refactoring out of the box in IDEs. As most IDEs would support name refactoring (which is regularly used). You may need to write some IDE plugin that could browse through source code (AST) and invoke rename refactoring behind the scene for such parameter names matching such format.



回答4:

I have done a lot of such refactorings on a rather large scale of files, using TextPad or WildPad, and a bunch of reg-ex replace-all. Always worked for me!

I'm confident that if the code is first formatted using an IDE like Eclipse (if it is not properly formatted), and then a reg-ex involving the methods' signature (scope, return-type, name, bracket, arg list, bracket) can be devised, your job will be done in seconds with these tools. You might need more than one replace-all sets of reg-ex.

The only time-taking activity would be to come up with such a set of reg-ex.

Hope this helps!