Automated refactoring
by Buck Golemon
1. Multi-language
1.1. cheetah
1.2. python
1.3. js?
2. user interface
2.1. command line
2.2. semantic patch -- 'spatch'
2.3. editor plugin
2.4. python script
3. full project refactoring
3.1. find imports
3.2. enumerate files to refactor
3.3. enable recursive refactoring, across modules
4. division of code
4.1. Yelp internal
4.2. Yelp github
5. refactorings
5.1. remove function calls
5.1.1. based on context ?
5.2. remove decorators
5.2.1. refactor string% within @HTMLLiteral.wraps
5.3. insert function calls
6. Implementation
6.1. get an AST
6.2. modify the AST
6.2.1. python function
6.2.1.1. input ast
6.2.1.2. search for relevant parts (subtree)
6.2.1.3. test for any extra conditions
6.2.1.4. replace the subtree
6.2.1.4.1. recursion / reuse
6.2.1.5. output modified ast
6.2.2. spatch
6.3. unparse the modified AST
7. testing
7.1. tokenization
7.1.1. python / cheetah
7.1.2. save as XML & compare
7.2. refactorization
7.2.1. save output and compare
7.2.2. should be functional test (non-xml)
7.3. unit test
7.3.1. ast functions
7.3.1.1. input / output can be XML
7.3.2. class methods