V dnešním článku se seznámíme s novým nástrojem pro refaktorování javovského kódu. Jmenuje se RefactoringNG a jde o modul do NetBeans 6.9.

Ve srovnání s jinými nástroji nabízí RefactoringNG velkou flexibilitu, protože refaktorizační pravidla si zde definujeme sami. Každé refaktorizační pravidlo popisuje transformaci nějakého abstraktního syntaktického stromu na jiný. Např. pravidlo pro přepis výrazu x = x + 1 na x++ vypadá takto:

 // x = x + 1 -> x++
Assignment {
Identifier [name: "x"],
Binary [kind: PLUS] {
Identifier [name: "x"],
Literal [kind: INT_LITERAL, value: 1]
}
} ->
Unary [kind: POSTFIX_INCREMENT] {
Identifier [name: "x"]
}

Názvy a struktura abstraktních syntaktických stromů jsou stejné jako v sunovském překladači Javy. Nástroj používá Compiler Tree API (com.sun.*), formální model jazyka v JDK API (javax.lang.model.*) a infrastrukturu NetBeans.

K čemu se to dá použít? Např. pokud potřebujete nahradit volání konstruktoru voláním tovární metody:

 // new Position(<args>) -> Position.create(<args>)
NewClass {
null,
List<Tree>,
Identifier [name: "Position"],
List<Expression> [id: args],
null
} ->
MethodInvocation {
List<Tree> { },
MemberSelect [identifier: "create"] {
Identifier [name: "Position"]
},
List<Expression> [ref: args]
}

Nebo když do každého volání metody potřebujete přidat argument:

 // plus (<expr1>, <expr2>) -> plus (<expr1>, <expr2>, 5)
MethodInvocation {
List [size: 0],
Identifier [name: "plus"],
List<Expression> [id: args, size: 2]
} ->
MethodInvocation {
List<Tree> [size: 0],
Identifier [name: "plus"],
List<Expression> {
ListItems [ref: args],
Literal [kind: INT_LITERAL, value: 5]
}
}

Více informací můžete najít na http://kenai.com/projects/refactoringng. Modul ke stažení je na http://kenai.com/projects/refactoringng/downloads