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